/ Hex Artifact Content
Login

Artifact 7ce9564fc41539a45fd9c416ea4282b3defc1311:


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 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20  K_REGISTER ){.  
57e0: 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f    op = pRight->o
57f0: 70 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70  p2;.  }.  if( op
5800: 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b  ==TK_VARIABLE ){
5810: 0a 20 20 20 20 56 64 62 65 20 2a 70 52 65 70 72  .    Vdbe *pRepr
5820: 65 70 61 72 65 20 3d 20 70 50 61 72 73 65 2d 3e  epare = pParse->
5830: 70 52 65 70 72 65 70 61 72 65 3b 0a 20 20 20 20  pReprepare;.    
5840: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69 67 68  int iCol = pRigh
5850: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
5860: 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  pVal = sqlite3Vd
5870: 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28  beGetBoundValue(
5880: 70 52 65 70 72 65 70 61 72 65 2c 20 69 43 6f 6c  pReprepare, iCol
5890: 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  , SQLITE_AFF_NON
58a0: 45 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c  E);.    if( pVal
58b0: 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   && sqlite3_valu
58c0: 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53 51  e_type(pVal)==SQ
58d0: 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20  LITE_TEXT ){.   
58e0: 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29 73     z = (char *)s
58f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
5900: 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  t(pVal);.    }. 
5910: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
5920: 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d  tVarmask(pParse-
5930: 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b 0a 20  >pVdbe, iCol);. 
5940: 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
5950: 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42  t->op==TK_VARIAB
5960: 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70  LE || pRight->op
5970: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  ==TK_REGISTER );
5980: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
5990: 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20  =TK_STRING ){.  
59a0: 20 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e    z = pRight->u.
59b0: 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66  zToken;.  }.  if
59c0: 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d  ( z ){.    cnt =
59d0: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   0;.    while( (
59e0: 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20  c=z[cnt])!=0 && 
59f0: 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77  c!=wc[0] && c!=w
5a00: 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d  c[1] && c!=wc[2]
5a10: 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b   ){.      cnt++;
5a20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
5a30: 6e 74 21 3d 30 20 26 26 20 32 35 35 21 3d 28 75  nt!=0 && 255!=(u
5a40: 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20  8)z[cnt-1] ){.  
5a50: 20 20 20 20 45 78 70 72 20 2a 70 50 72 65 66 69      Expr *pPrefi
5a60: 78 3b 0a 20 20 20 20 20 20 2a 70 69 73 43 6f 6d  x;.      *pisCom
5a70: 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d  plete = c==wc[0]
5a80: 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b   && z[cnt+1]==0;
5a90: 0a 20 20 20 20 20 20 70 50 72 65 66 69 78 20 3d  .      pPrefix =
5aa0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
5ab0: 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a   TK_STRING, z);.
5ac0: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 66 69        if( pPrefi
5ad0: 78 20 29 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a  x ) pPrefix->u.z
5ae0: 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a  Token[cnt] = 0;.
5af0: 20 20 20 20 20 20 2a 70 70 50 72 65 66 69 78 20        *ppPrefix 
5b00: 3d 20 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20  = pPrefix;.     
5b10: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49   if( op==TK_VARI
5b20: 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ABLE ){.        
5b30: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
5b40: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20 20 20  ->pVdbe;.       
5b50: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
5b60: 61 72 6d 61 73 6b 28 76 2c 20 70 52 69 67 68 74  armask(v, pRight
5b70: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
5b80: 20 20 20 20 69 66 28 20 2a 70 69 73 43 6f 6d 70      if( *pisComp
5b90: 6c 65 74 65 20 26 26 20 70 52 69 67 68 74 2d 3e  lete && pRight->
5ba0: 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20  u.zToken[1] ){. 
5bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
5bc0: 68 65 20 72 68 73 20 6f 66 20 74 68 65 20 4c 49  he rhs of the LI
5bd0: 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  KE expression is
5be0: 20 61 20 76 61 72 69 61 62 6c 65 2c 20 61 6e 64   a variable, and
5bf0: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20   the current.   
5c00: 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
5c10: 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  of the variable 
5c20: 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73 20 6e  means there is n
5c30: 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f 6b 65  o need to invoke
5c40: 20 74 68 65 20 4c 49 4b 45 0a 20 20 20 20 20 20   the LIKE.      
5c50: 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c      ** function,
5c60: 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61 72 69   then no OP_Vari
5c70: 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 61 64 64  able will be add
5c80: 65 64 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61  ed to the progra
5c90: 6d 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  m..          ** 
5ca0: 54 68 69 73 20 63 61 75 73 65 73 20 70 72 6f 62  This causes prob
5cb0: 6c 65 6d 73 20 66 6f 72 20 74 68 65 20 73 71 6c  lems for the sql
5cc0: 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
5cd0: 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20 20 20  ter_name().     
5ce0: 20 20 20 20 20 2a 2a 20 41 50 49 2e 20 54 6f 20       ** API. To 
5cf0: 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68 65 6d 2c  workaround them,
5d00: 20 61 64 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f   add a dummy OP_
5d10: 56 61 72 69 61 62 6c 65 20 68 65 72 65 2e 0a 20  Variable here.. 
5d20: 20 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20           */ .   
5d30: 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
5d40: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
5d50: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
5d60: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
5d70: 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
5d80: 65 2c 20 70 52 69 67 68 74 2c 20 72 31 29 3b 0a  e, pRight, r1);.
5d90: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5da0: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
5db0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
5dc0: 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 30 29  entAddr(v)-1, 0)
5dd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
5de0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5df0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
5e00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5e10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5e20: 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20    z = 0;.    }. 
5e30: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c   }..  sqlite3Val
5e40: 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20  ueFree(pVal);.  
5e50: 72 65 74 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d  return (z!=0);.}
5e60: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5e70: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
5e80: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69  MIZATION */...#i
5e90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5ea0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
5eb0: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
5ec0: 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65  e if the given e
5ed0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
5ee0: 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20  the form.**.**  
5ef0: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41         column MA
5f00: 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49  TCH expr.**.** I
5f10: 66 20 69 74 20 69 73 20 74 68 65 6e 20 72 65 74  f it is then ret
5f20: 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 6e 6f  urn TRUE.  If no
5f30: 74 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e  t, return FALSE.
5f40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
5f50: 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a  sMatchOfColumn(.
5f60: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
5f70: 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20     /* Test this 
5f80: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
5f90: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
5fa0: 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  st;..  if( pExpr
5fb0: 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op!=TK_FUNCTIO
5fc0: 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
5fd0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
5fe0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70  ite3StrICmp(pExp
5ff0: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74  r->u.zToken,"mat
6000: 63 68 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ch")!=0 ){.    r
6010: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
6020: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
6030: 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69  pList;.  if( pLi
6040: 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a  st->nExpr!=2 ){.
6050: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6060: 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61  }.  if( pList->a
6070: 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d  [1].pExpr->op !=
6080: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20   TK_COLUMN ){.  
6090: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
60a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
60b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
60c0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
60d0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68   */../*.** If th
60e0: 65 20 70 42 61 73 65 20 65 78 70 72 65 73 73 69  e pBase expressi
60f0: 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e  on originated in
6100: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
6110: 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20   clause of.** a 
6120: 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73  join, then trans
6130: 66 65 72 20 74 68 65 20 61 70 70 72 6f 70 72 69  fer the appropri
6140: 61 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65  ate markings ove
6150: 72 20 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f  r to derived..*/
6160: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 61  .static void tra
6170: 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67  nsferJoinMarking
6180: 73 28 45 78 70 72 20 2a 70 44 65 72 69 76 65 64  s(Expr *pDerived
6190: 2c 20 45 78 70 72 20 2a 70 42 61 73 65 29 7b 0a  , Expr *pBase){.
61a0: 20 20 69 66 28 20 70 44 65 72 69 76 65 64 20 29    if( pDerived )
61b0: 7b 0a 20 20 20 20 70 44 65 72 69 76 65 64 2d 3e  {.    pDerived->
61c0: 66 6c 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e  flags |= pBase->
61d0: 66 6c 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a  flags & EP_FromJ
61e0: 6f 69 6e 3b 0a 20 20 20 20 70 44 65 72 69 76 65  oin;.    pDerive
61f0: 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  d->iRightJoinTab
6200: 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69 52 69 67  le = pBase->iRig
6210: 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d  htJoinTable;.  }
6220: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
6230: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  (SQLITE_OMIT_OR_
6240: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26  OPTIMIZATION) &&
6250: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6260: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
6270: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20  /*.** Analyze a 
6280: 74 65 72 6d 20 74 68 61 74 20 63 6f 6e 73 69 73  term that consis
6290: 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ts of two or mor
62a0: 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a  e OR-connected.*
62b0: 2a 20 73 75 62 74 65 72 6d 73 2e 20 20 53 6f 20  * subterms.  So 
62c0: 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  in:.**.**     ..
62d0: 2e 20 57 48 45 52 45 20 20 28 61 3d 35 29 20 41  . WHERE  (a=5) A
62e0: 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f  ND (b=7 OR c=9 O
62f0: 52 20 64 3d 31 33 29 20 41 4e 44 20 28 64 3d 31  R d=13) AND (d=1
6300: 33 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  3).**           
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5e                 ^
6320: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
6330: 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ^^^.**.** This r
6340: 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20  outine analyzes 
6350: 74 65 72 6d 73 20 73 75 63 68 20 61 73 20 74 68  terms such as th
6360: 65 20 6d 69 64 64 6c 65 20 74 65 72 6d 20 69 6e  e middle term in
6370: 20 74 68 65 20 61 62 6f 76 65 20 65 78 61 6d 70   the above examp
6380: 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72  le..** A WhereOr
6390: 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63  Term object is c
63a0: 6f 6d 70 75 74 65 64 20 61 6e 64 20 61 74 74 61  omputed and atta
63b0: 63 68 65 64 20 74 6f 20 74 68 65 20 74 65 72 6d  ched to the term
63c0: 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73   under.** analys
63d0: 69 73 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  is, regardless o
63e0: 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66  f the outcome of
63f0: 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 20 20   the analysis.  
6400: 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  Hence:.**.**    
6410: 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61   WhereTerm.wtFla
6420: 67 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52  gs   |=  TERM_OR
6430: 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72  INFO.**     Wher
6440: 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20  eTerm.u.pOrInfo 
6450: 20 3d 20 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   =  a dynamicall
6460: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
6470: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a  eOrTerm object.*
6480: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 62 65  *.** The term be
6490: 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73  ing analyzed mus
64a0: 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f  t have two or mo
64b0: 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74  re of OR-connect
64c0: 65 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20  ed subterms..** 
64d0: 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65 72 6d  A single subterm
64e0: 20 6d 69 67 68 74 20 62 65 20 61 20 73 65 74 20   might be a set 
64f0: 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64  of AND-connected
6500: 20 73 75 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a   sub-subterms..*
6510: 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 74 65  * Examples of te
6520: 72 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c 79 73  rms under analys
6530: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41  is:.**.**     (A
6540: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
6550: 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20  OR t1.x=t2.z OR 
6560: 74 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d  t1.y=15 OR t1.z=
6570: 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42  t3.a+5.**     (B
6580: 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52  )     x=expr1 OR
6590: 20 65 78 70 72 32 3d 78 20 4f 52 20 78 3d 65 78   expr2=x OR x=ex
65a0: 70 72 33 0a 2a 2a 20 20 20 20 20 28 43 29 20 20  pr3.**     (C)  
65b0: 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20     t1.x=t2.y OR 
65c0: 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74  (t1.x=t2.z AND t
65d0: 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28  1.y=15).**     (
65e0: 44 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f  D)     x=expr1 O
65f0: 52 20 28 79 3e 31 31 20 41 4e 44 20 79 3c 32 32  R (y>11 AND y<22
6600: 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65   AND z LIKE '*he
6610: 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45  llo*').**     (E
6620: 29 20 20 20 20 20 28 70 2e 61 3d 31 20 41 4e 44  )     (p.a=1 AND
6630: 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33   q.b=2 AND r.c=3
6640: 29 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e 44 20  ) OR (p.x=4 AND 
6650: 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29  q.y=5 AND r.z=6)
6660: 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a  .**.** CASE 1:.*
6670: 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74  *.** If all subt
6680: 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20  erms are of the 
6690: 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f  form T.C=expr fo
66a0: 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f  r some single co
66b0: 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64 0a 2a 2a  lumn of C and.**
66c0: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
66d0: 54 20 28 61 73 20 73 68 6f 77 6e 20 69 6e 20 65  T (as shown in e
66e0: 78 61 6d 70 6c 65 20 42 20 61 62 6f 76 65 29 20  xample B above) 
66f0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
6700: 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72  w virtual.** ter
6710: 6d 20 74 68 61 74 20 69 73 20 61 6e 20 65 71 75  m that is an equ
6720: 69 76 61 6c 65 6e 74 20 49 4e 20 65 78 70 72 65  ivalent IN expre
6730: 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72  ssion.  In other
6740: 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 74   words, if the t
6750: 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61  erm.** being ana
6760: 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  lyzed is:.**.** 
6770: 20 20 20 20 20 78 20 3d 20 65 78 70 72 31 20 20       x = expr1  
6780: 4f 52 20 20 65 78 70 72 32 20 3d 20 78 20 20 4f  OR  expr2 = x  O
6790: 52 20 20 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a  R  x = expr3.**.
67a0: 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  ** then create a
67b0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
67c0: 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  m like this:.**.
67d0: 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 65 78  **      x IN (ex
67e0: 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29  pr1,expr2,expr3)
67f0: 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a  .**.** CASE 2:.*
6800: 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74  *.** If all subt
6810: 65 72 6d 73 20 61 72 65 20 69 6e 64 65 78 61 62  erms are indexab
6820: 6c 65 20 62 79 20 61 20 73 69 6e 67 6c 65 20 74  le by a single t
6830: 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 73 65 74  able T, then set
6840: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65  .**.**     Where
6850: 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20  Term.eOperator  
6860: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 20 57              =  W
6870: 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57 68 65 72  O_OR.**     Wher
6880: 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d  eTerm.u.pOrInfo-
6890: 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c 3d 20 20  >indexable  |=  
68a0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
68b0: 72 20 66 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a  r for table T.**
68c0: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73  .** A subterm is
68d0: 20 22 69 6e 64 65 78 61 62 6c 65 22 20 69 66 20   "indexable" if 
68e0: 69 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  it is of the for
68f0: 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c  m.** "T.C <op> <
6900: 65 78 70 72 3e 22 20 77 68 65 72 65 20 43 20 69  expr>" where C i
6910: 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  s any column of 
6920: 74 61 62 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20  table T and .** 
6930: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22  <op> is one of "
6940: 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22  =", "<", "<=", "
6950: 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55  >", ">=", "IS NU
6960: 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a  LL", or "IN"..**
6970: 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 61 6c   A subterm is al
6980: 73 6f 20 69 6e 64 65 78 61 62 6c 65 20 69 66 20  so indexable if 
6990: 69 74 20 69 73 20 61 6e 20 41 4e 44 20 6f 66 20  it is an AND of 
69a0: 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73  two or more.** s
69b0: 75 62 73 75 62 74 65 72 6d 73 20 61 74 20 6c 65  ubsubterms at le
69c0: 61 73 74 20 6f 6e 65 20 6f 66 20 77 68 69 63 68  ast one of which
69d0: 20 69 73 20 69 6e 64 65 78 61 62 6c 65 2e 20 20   is indexable.  
69e0: 49 6e 64 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a  Indexable AND .*
69f0: 2a 20 73 75 62 74 65 72 6d 73 20 68 61 76 65 20  * subterms have 
6a00: 74 68 65 69 72 20 65 4f 70 65 72 61 74 6f 72 20  their eOperator 
6a10: 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e  set to WO_AND an
6a20: 64 20 74 68 65 79 20 68 61 76 65 0a 2a 2a 20 75  d they have.** u
6a30: 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f  .pAndInfo set to
6a40: 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61   a dynamically a
6a50: 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 41 6e  llocated WhereAn
6a60: 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a  dTerm object..**
6a70: 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72  .** From another
6a80: 20 70 6f 69 6e 74 20 6f 66 20 76 69 65 77 2c 20   point of view, 
6a90: 22 69 6e 64 65 78 61 62 6c 65 22 20 6d 65 61 6e  "indexable" mean
6aa0: 73 20 74 68 61 74 20 74 68 65 20 73 75 62 74 65  s that the subte
6ab0: 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65  rm could.** pote
6ac0: 6e 74 69 61 6c 6c 79 20 62 65 20 75 73 65 64 20  ntially be used 
6ad0: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 69 66  with an index if
6ae0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
6af0: 69 6e 64 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a  index exists..**
6b00: 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64   This analysis d
6b10: 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72  oes not consider
6b20: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
6b30: 74 68 65 20 69 6e 64 65 78 20 65 78 69 73 74 73  the index exists
6b40: 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20 64 65 63  ; that.** is dec
6b50: 69 64 65 64 20 65 6c 73 65 77 68 65 72 65 2e 20  ided elsewhere. 
6b60: 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73 20 6f   This analysis o
6b70: 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65  nly looks at whe
6b80: 74 68 65 72 20 73 75 62 74 65 72 6d 73 0a 2a 2a  ther subterms.**
6b90: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
6ba0: 20 69 6e 64 65 78 69 6e 67 20 65 78 69 73 74 2e   indexing exist.
6bb0: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70  .**.** All examp
6bc0: 6c 65 73 20 41 20 74 68 72 6f 75 67 68 20 45 20  les A through E 
6bd0: 61 62 6f 76 65 20 73 61 74 69 73 66 79 20 63 61  above satisfy ca
6be0: 73 65 20 32 2e 20 20 42 75 74 20 69 66 20 61 20  se 2.  But if a 
6bf0: 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61  term.** also sta
6c00: 74 69 73 66 69 65 73 20 63 61 73 65 20 31 20 28  tisfies case 1 (
6c10: 73 75 63 68 20 61 73 20 42 29 20 77 65 20 6b 6e  such as B) we kn
6c20: 6f 77 20 74 68 61 74 20 74 68 65 20 6f 70 74 69  ow that the opti
6c30: 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c  mizer will.** al
6c40: 77 61 79 73 20 70 72 65 66 65 72 20 63 61 73 65  ways prefer case
6c50: 20 31 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63   1, so in that c
6c60: 61 73 65 20 77 65 20 70 72 65 74 65 6e 64 20 74  ase we pretend t
6c70: 68 61 74 20 63 61 73 65 20 32 20 69 73 20 6e 6f  hat case 2 is no
6c80: 74 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 2e 0a  t.** satisfied..
6c90: 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 62  **.** It might b
6ca0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  e the case that 
6cb0: 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20  multiple tables 
6cc0: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2e 20 20  are indexable.  
6cd0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20  For example,.** 
6ce0: 28 45 29 20 61 62 6f 76 65 20 69 73 20 69 6e 64  (E) above is ind
6cf0: 65 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73  exable on tables
6d00: 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a   P, Q, and R..**
6d10: 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61 74 20 73  .** Terms that s
6d20: 61 74 69 73 66 79 20 63 61 73 65 20 32 20 61 72  atisfy case 2 ar
6d30: 65 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  e candidates for
6d40: 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e 67   lookup by using
6d50: 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e 64  .** separate ind
6d60: 69 63 65 73 20 74 6f 20 66 69 6e 64 20 72 6f 77  ices to find row
6d70: 69 64 73 20 66 6f 72 20 65 61 63 68 20 73 75 62  ids for each sub
6d80: 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69  term and composi
6d90: 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20  ng.** the union 
6da0: 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73 20 75 73  of all rowids us
6db0: 69 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a  ing a RowSet obj
6dc0: 65 63 74 2e 20 20 54 68 69 73 20 69 73 20 73 69  ect.  This is si
6dd0: 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74  milar.** to "bit
6de0: 6d 61 70 20 69 6e 64 69 63 65 73 22 20 69 6e 20  map indices" in 
6df0: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 65  other database e
6e00: 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54  ngines..**.** OT
6e10: 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49  HERWISE:.**.** I
6e20: 66 20 6e 65 69 74 68 65 72 20 63 61 73 65 20 31  f neither case 1
6e30: 20 6e 6f 72 20 63 61 73 65 20 32 20 61 70 70 6c   nor case 2 appl
6e40: 79 2c 20 74 68 65 6e 20 6c 65 61 76 65 20 74 68  y, then leave th
6e50: 65 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20  e eOperator set 
6e60: 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69  to.** zero.  Thi
6e70: 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 75 73  s term is not us
6e80: 65 66 75 6c 20 66 6f 72 20 73 65 61 72 63 68 2e  eful for search.
6e90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6ea0: 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72  exprAnalyzeOrTer
6eb0: 6d 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  m(.  SrcList *pS
6ec0: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  rc,            /
6ed0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
6ee0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
6ef0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
6f00: 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   /* the complete
6f10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
6f20: 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20  .  int idxTerm  
6f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6f40: 49 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52 2d  Index of the OR-
6f50: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
6f60: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  zed */.){.  Wher
6f70: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
6f80: 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 20 20 20  pWC->pWInfo;    
6f90: 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61      /* WHERE cla
6fa0: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63  use processing c
6fb0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73  ontext */.  Pars
6fc0: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
6fd0: 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20  fo->pParse;     
6fe0: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
6ff0: 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
7000: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
7010: 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  >db;            
7020: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
7030: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57  onnection */.  W
7040: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20  hereTerm *pTerm 
7050: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
7060: 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65  m];    /* The te
7070: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
7080: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  d */.  Expr *pEx
7090: 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
70a0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
70b0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
70c0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a   of the term */.
70d0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
7100: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
7110: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72  WhereClause *pOr
7120: 57 63 3b 20 20 20 20 20 20 20 2f 2a 20 42 72 65  Wc;       /* Bre
7130: 61 6b 75 70 20 6f 66 20 70 54 65 72 6d 20 69 6e  akup of pTerm in
7140: 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20  to subterms */. 
7150: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
7160: 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41 20  erm;       /* A 
7170: 53 75 62 2d 74 65 72 6d 20 77 69 74 68 69 6e 20  Sub-term within 
7180: 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57  the pOrWc */.  W
7190: 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49  hereOrInfo *pOrI
71a0: 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64 69  nfo;     /* Addi
71b0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
71c0: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
71d0: 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69  th pTerm */.  Bi
71e0: 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20  tmask chngToIN; 
71f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
7200: 73 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74  s that might sat
7210: 69 73 66 79 20 63 61 73 65 20 31 20 2a 2f 0a 20  isfy case 1 */. 
7220: 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62   Bitmask indexab
7230: 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61  le;        /* Ta
7240: 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  bles that are in
7250: 64 65 78 61 62 6c 65 2c 20 73 61 74 69 73 66 79  dexable, satisfy
7260: 69 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20  ing case 2 */.. 
7270: 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74   /*.  ** Break t
7280: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74  he OR clause int
7290: 6f 20 69 74 73 20 73 65 70 61 72 61 74 65 20 73  o its separate s
72a0: 75 62 74 65 72 6d 73 2e 20 20 54 68 65 20 73 75  ubterms.  The su
72b0: 62 74 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20  bterms are.  ** 
72c0: 73 74 6f 72 65 64 20 69 6e 20 61 20 57 68 65 72  stored in a Wher
72d0: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
72e0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74  e containing wit
72f0: 68 69 6e 20 74 68 65 20 57 68 65 72 65 4f 72 49  hin the WhereOrI
7300: 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20  nfo.  ** object 
7310: 74 68 61 74 20 69 73 20 61 74 74 61 63 68 65 64  that is attached
7320: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
7330: 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d 2e   OR clause term.
7340: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
7350: 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
7360: 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c  & (TERM_DYNAMIC|
7370: 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d  TERM_ORINFO|TERM
7380: 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b  _ANDINFO))==0 );
7390: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
73a0: 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20  ->op==TK_OR );. 
73b0: 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66   pTerm->u.pOrInf
73c0: 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71  o = pOrInfo = sq
73d0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
73e0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f  o(db, sizeof(*pO
73f0: 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20 70  rInfo));.  if( p
7400: 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75  OrInfo==0 ) retu
7410: 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46  rn;.  pTerm->wtF
7420: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49  lags |= TERM_ORI
7430: 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26  NFO;.  pOrWc = &
7440: 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77  pOrInfo->wc;.  w
7450: 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70  hereClauseInit(p
7460: 4f 72 57 63 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  OrWc, pWInfo);. 
7470: 20 77 68 65 72 65 53 70 6c 69 74 28 70 4f 72 57   whereSplit(pOrW
7480: 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29  c, pExpr, TK_OR)
7490: 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  ;.  exprAnalyzeA
74a0: 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57 63 29 3b  ll(pSrc, pOrWc);
74b0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
74c0: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
74d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 57  ;.  assert( pOrW
74e0: 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a  c->nTerm>=2 );..
74f0: 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74    /*.  ** Comput
7500: 65 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62  e the set of tab
7510: 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73  les that might s
7520: 61 74 69 73 66 79 20 63 61 73 65 73 20 31 20 6f  atisfy cases 1 o
7530: 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65  r 2..  */.  inde
7540: 78 61 62 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73  xable = ~(Bitmas
7550: 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20  k)0;.  chngToIN 
7560: 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
7570: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
7580: 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70  erm-1, pOrTerm=p
7590: 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26  OrWc->a; i>=0 &&
75a0: 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c   indexable; i--,
75b0: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
75c0: 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65   if( (pOrTerm->e
75d0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49  Operator & WO_SI
75e0: 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NGLE)==0 ){.    
75f0: 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a    WhereAndInfo *
7600: 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAndInfo;.      
7610: 61 73 73 65 72 74 28 20 28 70 4f 72 54 65 72 6d  assert( (pOrTerm
7620: 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
7630: 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f  M_ANDINFO|TERM_O
7640: 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20  RINFO))==0 );.  
7650: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30      chngToIN = 0
7660: 3b 0a 20 20 20 20 20 20 70 41 6e 64 49 6e 66 6f  ;.      pAndInfo
7670: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7680: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
7690: 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b 0a 20 20  (*pAndInfo));.  
76a0: 20 20 20 20 69 66 28 20 70 41 6e 64 49 6e 66 6f      if( pAndInfo
76b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72   ){.        Wher
76c0: 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43 3b  eClause *pAndWC;
76d0: 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  .        WhereTe
76e0: 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b 0a 20 20  rm *pAndTerm;.  
76f0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
7700: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d       Bitmask b =
7710: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54   0;.        pOrT
7720: 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 20  erm->u.pAndInfo 
7730: 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20  = pAndInfo;.    
7740: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
7750: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 41 4e 44  lags |= TERM_AND
7760: 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20 20 70 4f  INFO;.        pO
7770: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
7780: 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20 20 20 20   = WO_AND;.     
7790: 20 20 20 70 41 6e 64 57 43 20 3d 20 26 70 41 6e     pAndWC = &pAn
77a0: 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  dInfo->wc;.     
77b0: 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e     whereClauseIn
77c0: 69 74 28 70 41 6e 64 57 43 2c 20 70 57 43 2d 3e  it(pAndWC, pWC->
77d0: 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
77e0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 41 6e 64   whereSplit(pAnd
77f0: 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  WC, pOrTerm->pEx
7800: 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20  pr, TK_AND);.   
7810: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
7820: 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64 57 43  All(pSrc, pAndWC
7830: 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57  );.        pAndW
7840: 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b  C->pOuter = pWC;
7850: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
7860: 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e( db->mallocFai
7870: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69  led );.        i
7880: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
7890: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
78a0: 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e 64 54    for(j=0, pAndT
78b0: 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b 20 6a  erm=pAndWC->a; j
78c0: 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d 3b 20  <pAndWC->nTerm; 
78d0: 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b 2b 29  j++, pAndTerm++)
78e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
78f0: 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d 2d 3e  sert( pAndTerm->
7900: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20  pExpr );.       
7910: 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77 65 64       if( allowed
7920: 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78  Op(pAndTerm->pEx
7930: 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20 20 20  pr->op) ){.     
7940: 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65           b |= ge
7950: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
7960: 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64 54 65 72  MaskSet, pAndTer
7970: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a  m->leftCursor);.
7980: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7990: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
79a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 64 65    }.        inde
79b0: 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20  xable &= b;.    
79c0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
79d0: 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61  ( pOrTerm->wtFla
79e0: 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44  gs & TERM_COPIED
79f0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69   ){.      /* Ski
7a00: 70 20 74 68 69 73 20 74 65 72 6d 20 66 6f 72 20  p this term for 
7a10: 6e 6f 77 2e 20 20 57 65 20 72 65 76 69 73 69 74  now.  We revisit
7a20: 20 69 74 20 77 68 65 6e 20 77 65 20 70 72 6f 63   it when we proc
7a30: 65 73 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ess the.      **
7a40: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 54   corresponding T
7a50: 45 52 4d 5f 56 49 52 54 55 41 4c 20 74 65 72 6d  ERM_VIRTUAL term
7a60: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
7a70: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 3b 0a       Bitmask b;.
7a80: 20 20 20 20 20 20 62 20 3d 20 67 65 74 4d 61 73        b = getMas
7a90: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
7aa0: 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  Set, pOrTerm->le
7ab0: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
7ac0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
7ad0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
7ae0: 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  TUAL ){.        
7af0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65  WhereTerm *pOthe
7b00: 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f  r = &pOrWc->a[pO
7b10: 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  rTerm->iParent];
7b20: 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65  .        b |= ge
7b30: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
7b40: 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68 65 72 2d  MaskSet, pOther-
7b50: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
7b60: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 64 65      }.      inde
7b70: 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20  xable &= b;.    
7b80: 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
7b90: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
7ba0: 51 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Q)==0 ){.       
7bb0: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20   chngToIN = 0;. 
7bc0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7bd0: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26 3d 20      chngToIN &= 
7be0: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
7bf0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
7c00: 52 65 63 6f 72 64 20 74 68 65 20 73 65 74 20 6f  Record the set o
7c10: 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 73 61  f tables that sa
7c20: 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 54  tisfy case 2.  T
7c30: 68 65 20 73 65 74 20 6d 69 67 68 74 20 62 65 0a  he set might be.
7c40: 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20 2a 2f    ** empty..  */
7c50: 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  .  pOrInfo->inde
7c60: 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61 62 6c  xable = indexabl
7c70: 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65  e;.  pTerm->eOpe
7c80: 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61 62 6c  rator = indexabl
7c90: 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f 4f 52  e==0 ? 0 : WO_OR
7ca0: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 68 6e  ;..  /*.  ** chn
7cb0: 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20 73 65  gToIN holds a se
7cc0: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
7cd0: 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73 66 79   *might* satisfy
7ce0: 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a 20 20   case 1.  But.  
7cf0: 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 64 6f  ** we have to do
7d00: 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
7d10: 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65 65   checking to see
7d20: 20 69 66 20 63 61 73 65 20 31 20 72 65 61 6c 6c   if case 1 reall
7d30: 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69 73 66  y.  ** is satisf
7d40: 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63  ied..  **.  ** c
7d50: 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68 6f 6c  hngToIN will hol
7d60: 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c 20 6f  d either 0, 1, o
7d70: 72 20 32 20 62 69 74 73 2e 20 20 54 68 65 20 30  r 2 bits.  The 0
7d80: 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e 73 0a  -bit case means.
7d90: 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72 65 20    ** that there 
7da0: 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69 74  is no possibilit
7db0: 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e  y of transformin
7dc0: 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  g the OR clause 
7dd0: 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e 20  into an.  ** IN 
7de0: 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75 73 65  operator because
7df0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 65 72   one or more ter
7e00: 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61  ms in the OR cla
7e10: 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20 2a 2a  use contain.  **
7e20: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
7e30: 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20 63 6f   than == on a co
7e40: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69 6e 67  lumn in the sing
7e50: 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 31  le table.  The 1
7e60: 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65 20 6d  -bit.  ** case m
7e70: 65 61 6e 73 20 74 68 61 74 20 65 76 65 72 79 20  eans that every 
7e80: 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20 63  term of the OR c
7e90: 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68 65 20  lause is of the 
7ea0: 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62 6c 65  form.  ** "table
7eb0: 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20 66 6f  .column=expr" fo
7ec0: 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 74 61  r some single ta
7ed0: 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20 62 69  ble.  The one bi
7ee0: 74 20 74 68 61 74 20 69 73 20 73 65 74 0a 20 20  t that is set.  
7ef0: 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73 70 6f  ** will correspo
7f00: 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  nd to the common
7f10: 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74 69 6c   table.  We stil
7f20: 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  l need to check 
7f30: 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  to make.  ** sur
7f40: 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d  e the same colum
7f50: 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61 6c 6c  n is used on all
7f60: 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32 2d 62   terms.  The 2-b
7f70: 69 74 20 63 61 73 65 20 69 73 20 77 68 65 6e 0a  it case is when.
7f80: 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74 65 72    ** the all ter
7f90: 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f  ms are of the fo
7fa0: 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c 75 6d  rm "table1.colum
7fb0: 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 22  n=table2.column"
7fc0: 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67 68 74  .  It.  ** might
7fd0: 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
7fe0: 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65 72 61  form an IN opera
7ff0: 74 6f 72 20 77 69 74 68 20 65 69 74 68 65 72 20  tor with either 
8000: 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20 20  table1.column.  
8010: 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63 6f 6c  ** or table2.col
8020: 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53 20 69  umn as the LHS i
8030: 66 20 65 69 74 68 65 72 20 69 73 20 63 6f 6d 6d  f either is comm
8040: 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  on to every term
8050: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f 52 20   of.  ** the OR 
8060: 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
8070: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65 72 6d  * Note that term
8080: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74  s of the form "t
8090: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61 62  able.column1=tab
80a0: 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74 68 65  le.column2" (the
80b0: 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65  .  ** same table
80c0: 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73 20 6f   on both sizes o
80d0: 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e 6f 74  f the ==) cannot
80e0: 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 20   be optimized.. 
80f0: 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67 54 6f   */.  if( chngTo
8100: 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b  IN ){.    int ok
8110: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 20  ToChngToIN = 0; 
8120: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
8130: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f  he conversion to
8140: 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a   IN is valid */.
8150: 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 20      int iColumn 
8160: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  = -1;         /*
8170: 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 6e   Column index on
8180: 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65 72 61   lhs of IN opera
8190: 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  tor */.    int i
81a0: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20 20 20  Cursor = -1;    
81b0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63 75       /* Table cu
81c0: 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61  rsor common to a
81d0: 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  ll terms */.    
81e0: 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20 20 20  int j = 0;      
81f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
8200: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
8210: 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
8220: 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  a table and colu
8230: 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72 73 20  mn that appears 
8240: 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74  on one side or t
8250: 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  he.    ** other 
8260: 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72 61 74  of the == operat
8270: 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75 62 74  or in every subt
8280: 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62 6c 65  erm.  That table
8290: 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   and column.    
82a0: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72  ** will be recor
82b0: 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72 20 61  ded in iCursor a
82c0: 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54 68 65  nd iColumn.  The
82d0: 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  re might not be 
82e0: 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20  any.    ** such 
82f0: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
8300: 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e 67 54  .  Set okToChngT
8310: 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72 6f 70  oIN if an approp
8320: 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20 20 20  riate table.    
8330: 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73  ** and column is
8340: 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61 76 65   found but leave
8350: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 66 61   okToChngToIN fa
8360: 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  lse if not found
8370: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
8380: 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21 6f 6b  (j=0; j<2 && !ok
8390: 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29  ToChngToIN; j++)
83a0: 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72 6d 20  {.      pOrTerm 
83b0: 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20 20 20  = pOrWc->a;.    
83c0: 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e    for(i=pOrWc->n
83d0: 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Term-1; i>=0; i-
83e0: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
83f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
8400: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
8410: 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
8420: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
8430: 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f  Flags &= ~TERM_O
8440: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  R_OK;.        if
8450: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
8460: 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29  ursor==iCursor )
8470: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
8480: 68 69 73 20 69 73 20 74 68 65 20 32 2d 62 69 74  his is the 2-bit
8490: 20 63 61 73 65 20 61 6e 64 20 77 65 20 61 72 65   case and we are
84a0: 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69   on the second i
84b0: 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20  teration and.   
84c0: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
84d0: 74 20 74 65 72 6d 20 69 73 20 66 72 6f 6d 20 74  t term is from t
84e0: 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
84f0: 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74 68 69  on.  So skip thi
8500: 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  s term. */.     
8510: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d       assert( j==
8520: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  1 );.          c
8530: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
8540: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
8550: 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d 61  chngToIN & getMa
8560: 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
8570: 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c  kSet, pOrTerm->l
8580: 65 66 74 43 75 72 73 6f 72 29 29 3d 3d 30 20 29  eftCursor))==0 )
8590: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
85a0: 68 69 73 20 74 65 72 6d 20 6d 75 73 74 20 62 65  his term must be
85b0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 74 31 2e   of the form t1.
85c0: 61 3d 3d 74 32 2e 62 20 77 68 65 72 65 20 74 32  a==t2.b where t2
85d0: 20 69 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20   is in the.     
85e0: 20 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e       ** chngToIN
85f0: 20 73 65 74 20 62 75 74 20 74 31 20 69 73 20 6e   set but t1 is n
8600: 6f 74 2e 20 20 54 68 69 73 20 74 65 72 6d 20 77  ot.  This term w
8610: 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20 70 72  ill be either pr
8620: 65 63 65 65 64 65 64 0a 20 20 20 20 20 20 20 20  eceeded.        
8630: 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64 20    ** or follwed 
8640: 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20 63  by an inverted c
8650: 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61 29  opy (t2.b==t1.a)
8660: 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74 65 72  .  Skip this ter
8670: 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  m .          ** 
8680: 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76 65  and use its inve
8690: 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  rsion. */.      
86a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f      testcase( pO
86b0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
86c0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b 0a   TERM_COPIED );.
86d0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
86e0: 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  se( pOrTerm->wtF
86f0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
8700: 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  UAL );.         
8710: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
8720: 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
8730: 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56 49  M_COPIED|TERM_VI
8740: 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20 20  RTUAL) );.      
8750: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
8760: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8770: 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72  iColumn = pOrTer
8780: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
8790: 0a 20 20 20 20 20 20 20 20 69 43 75 72 73 6f 72  .        iCursor
87a0: 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74   = pOrTerm->left
87b0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20  Cursor;.        
87c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
87d0: 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a       if( i<0 ){.
87e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 61          /* No ca
87f0: 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63 6f  ndidate table+co
8800: 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e 20  lumn was found. 
8810: 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f   This can only o
8820: 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ccur.        ** 
8830: 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74  on the second it
8840: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  eration */.     
8850: 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20     assert( j==1 
8860: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
8870: 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28  t( IsPowerOfTwo(
8880: 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a 20 20 20  chngToIN) );.   
8890: 20 20 20 20 20 61 73 73 65 72 74 28 20 63 68 6e       assert( chn
88a0: 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b 28 26  gToIN==getMask(&
88b0: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
88c0: 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  , iCursor) );.  
88d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
88e0: 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
88f0: 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20 20  ase( j==1 );..  
8900: 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 66      /* We have f
8910: 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61 74 65  ound a candidate
8920: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
8930: 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  n.  Check to see
8940: 20 69 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   if that.      *
8950: 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  * table and colu
8960: 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  mn is common to 
8970: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
8980: 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f 0a 20  e OR clause */. 
8990: 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49       okToChngToI
89a0: 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  N = 1;.      for
89b0: 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54 6f 43  (; i>=0 && okToC
89c0: 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70 4f  hngToIN; i--, pO
89d0: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
89e0: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
89f0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
8a00: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
8a10: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
8a20: 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f 72  tCursor!=iCursor
8a30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
8a40: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
8a50: 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  = ~TERM_OR_OK;. 
8a60: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
8a70: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
8a80: 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
8a90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 54  ){.          okT
8aa0: 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20  oChngToIN = 0;. 
8ab0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
8ac0: 20 20 20 20 20 20 20 20 69 6e 74 20 61 66 66 4c          int affL
8ad0: 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a 20  eft, affRight;. 
8ae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
8af0: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
8b00: 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c  de is also a col
8b10: 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61 66  umn, then the af
8b20: 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20 20  finities.       
8b30: 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69     ** of both ri
8b40: 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 64  ght and left sid
8b50: 65 73 20 6d 75 73 74 20 62 65 20 73 75 63 68 20  es must be such 
8b60: 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20 20  that no type.   
8b70: 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72         ** conver
8b80: 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72  sions are requir
8b90: 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  ed on the right.
8ba0: 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39 29    (Ticket #2249)
8bb0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
8bc0: 20 20 20 20 20 20 20 20 61 66 66 52 69 67 68 74          affRight
8bd0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
8be0: 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e  finity(pOrTerm->
8bf0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
8c00: 20 20 20 20 20 20 20 20 20 20 61 66 66 4c 65 66            affLef
8c10: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
8c20: 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d  ffinity(pOrTerm-
8c30: 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  >pExpr->pLeft);.
8c40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 66            if( af
8c50: 66 52 69 67 68 74 21 3d 30 20 26 26 20 61 66 66  fRight!=0 && aff
8c60: 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20 29  Right!=affLeft )
8c70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6b  {.            ok
8c80: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a  ToChngToIN = 0;.
8c90: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
8ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72  .            pOr
8cb0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
8cc0: 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20   TERM_OR_OK;.   
8cd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8ce0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
8cf0: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
8d00: 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67   point, okToChng
8d10: 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66 20  ToIN is true if 
8d20: 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20 73  original pTerm s
8d30: 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a 20  atisfies.    ** 
8d40: 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61 74  case 1.  In that
8d50: 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63 74   case, construct
8d60: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74   a new virtual t
8d70: 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20 20  erm that is .   
8d80: 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65 72   ** pTerm conver
8d90: 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f  ted into an IN o
8da0: 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a  perator..    */.
8db0: 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67      if( okToChng
8dc0: 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  ToIN ){.      Ex
8dd0: 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20  pr *pDup;       
8de0: 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73 69       /* A transi
8df0: 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65 78  ent duplicate ex
8e00: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
8e10: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
8e20: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  t = 0;   /* The 
8e30: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
8e40: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
8e50: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b  Expr *pLeft = 0;
8e60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48         /* The LH
8e70: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
8e80: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  ator */.      Ex
8e90: 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  pr *pNew;       
8ea0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
8eb0: 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f 72  lete IN operator
8ec0: 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 69   */..      for(i
8ed0: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c  =pOrWc->nTerm-1,
8ee0: 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e   pOrTerm=pOrWc->
8ef0: 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  a; i>=0; i--, pO
8f00: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
8f10: 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
8f20: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
8f30: 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69  R_OK)==0 ) conti
8f40: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  nue;.        ass
8f50: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
8f60: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
8f70: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
8f80: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  t( pOrTerm->left
8f90: 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20  Cursor==iCursor 
8fa0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
8fb0: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65  t( pOrTerm->u.le
8fc0: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
8fd0: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75  n );.        pDu
8fe0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
8ff0: 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e  up(db, pOrTerm->
9000: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30  pExpr->pRight, 0
9010: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  );.        pList
9020: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
9030: 73 74 41 70 70 65 6e 64 28 70 57 49 6e 66 6f 2d  stAppend(pWInfo-
9040: 3e 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  >pParse, pList, 
9050: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 70  pDup);.        p
9060: 4c 65 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  Left = pOrTerm->
9070: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
9080: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
9090: 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a  rt( pLeft!=0 );.
90a0: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
90b0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
90c0: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
90d0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50   pNew = sqlite3P
90e0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
90f0: 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b  IN, pDup, 0, 0);
9100: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20  .      if( pNew 
9110: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
9120: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 74  dxNew;.        t
9130: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
9140: 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70 72 29  ngs(pNew, pExpr)
9150: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
9160: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
9170: 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53  ty(pNew, EP_xIsS
9180: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
9190: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
91a0: 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  = pList;.       
91b0: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
91c0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
91d0: 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52 54   pNew, TERM_VIRT
91e0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
91f0: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
9200: 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29  ase( idxNew==0 )
9210: 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e  ;.        exprAn
9220: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
9230: 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20   idxNew);.      
9240: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
9250: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
9260: 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
9270: 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  w].iParent = idx
9280: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54  Term;.        pT
9290: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
92a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
92b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
92c0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
92d0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pList);.      }.
92e0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
92f0: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50  erator = WO_NOOP
9300: 3b 20 20 2f 2a 20 63 61 73 65 20 31 20 74 72 75  ;  /* case 1 tru
9310: 6d 70 73 20 63 61 73 65 20 32 20 2a 2f 0a 20 20  mps case 2 */.  
9320: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
9330: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
9340: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
9350: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
9360: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a  _SUBQUERY */../*
9370: 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f  .** The input to
9380: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
9390: 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74   an WhereTerm st
93a0: 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c  ructure with onl
93b0: 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22  y the.** "pExpr"
93c0: 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e   field filled in
93d0: 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  .  The job of th
93e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
93f0: 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20   analyze the.** 
9400: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  subexpression an
9410: 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74  d populate all t
9420: 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  he other fields 
9430: 6f 66 20 74 68 65 20 57 68 65 72 65 54 65 72 6d  of the WhereTerm
9440: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
9450: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
9460: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
9470: 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f   form "<expr> <o
9480: 70 3e 20 58 22 20 69 74 20 67 65 74 73 20 63 6f  p> X" it gets co
9490: 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  mmuted.** to the
94a0: 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f   standard form o
94b0: 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  f "X <op> <expr>
94c0: 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  "..**.** If the 
94d0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
94e0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
94f0: 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74 68 20  > Y" where both 
9500: 58 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63  X and Y are.** c
9510: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65  olumns, then the
9520: 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65 73   original expres
9530: 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65  sion is unchange
9540: 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74  d and a new virt
9550: 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74  ual.** term of t
9560: 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20  he form "Y <op> 
9570: 58 22 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  X" is added to t
9580: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
9590: 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  and.** analyzed 
95a0: 73 65 70 61 72 61 74 65 6c 79 2e 20 20 54 68 65  separately.  The
95b0: 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 69   original term i
95c0: 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45  s marked with TE
95d0: 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64  RM_COPIED.** and
95e0: 20 74 68 65 20 6e 65 77 20 74 65 72 6d 20 69 73   the new term is
95f0: 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45 52   marked with TER
9600: 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65 63 61 75  M_DYNAMIC (becau
9610: 73 65 20 69 74 27 73 20 70 45 78 70 72 0a 2a 2a  se it's pExpr.**
9620: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65   needs to be fre
9630: 65 64 20 77 69 74 68 20 74 68 65 20 57 68 65 72  ed with the Wher
9640: 65 43 6c 61 75 73 65 29 20 61 6e 64 20 54 45 52  eClause) and TER
9650: 4d 5f 56 49 52 54 55 41 4c 20 28 62 65 63 61 75  M_VIRTUAL (becau
9660: 73 65 20 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f  se it.** is a co
9670: 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f 66 20 61  mmuted copy of a
9680: 20 70 72 69 6f 72 20 74 65 72 6d 2e 29 20 20 54   prior term.)  T
9690: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d  he original term
96a0: 20 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a   has nChild=1.**
96b0: 20 61 6e 64 20 74 68 65 20 63 6f 70 79 20 68 61   and the copy ha
96c0: 73 20 69 64 78 50 61 72 65 6e 74 20 73 65 74 20  s idxParent set 
96d0: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
96e0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  the original ter
96f0: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
9700: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20  d exprAnalyze(. 
9710: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
9720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
9730: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
9740: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
9750: 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pWC,         /* 
9760: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
9770: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72   */.  int idxTer
9780: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
9790: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
97a0: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
97b0: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  zed */.){.  Wher
97c0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
97d0: 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 2f 2a 20  pWC->pWInfo; /* 
97e0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
97f0: 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  cessing context 
9800: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
9810: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
9820: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72        /* The ter
9830: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
9840: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
9850: 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20  et *pMaskSet;   
9860: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66         /* Set of
9870: 20 74 61 62 6c 65 20 69 6e 64 65 78 20 6d 61 73   table index mas
9880: 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  ks */.  Expr *pE
9890: 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
98a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
98b0: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
98c0: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42   analyzed */.  B
98d0: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66  itmask prereqLef
98e0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
98f0: 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73  /* Prerequesites
9900: 20 6f 66 20 74 68 65 20 70 45 78 70 72 2d 3e 70   of the pExpr->p
9910: 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73  Left */.  Bitmas
9920: 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20  k prereqAll;    
9930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
9940: 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 70  erequesites of p
9950: 45 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73  Expr */.  Bitmas
9960: 6b 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 30  k extraRight = 0
9970: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ;          /* Ex
9980: 74 72 61 20 64 65 70 65 6e 64 65 6e 63 69 65 73  tra dependencies
9990: 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f   on LEFT JOIN */
99a0: 0a 20 20 45 78 70 72 20 2a 70 53 74 72 31 20 3d  .  Expr *pStr1 =
99b0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
99c0: 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49      /* RHS of LI
99d0: 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  KE/GLOB operator
99e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70   */.  int isComp
99f0: 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20  lete = 0;       
9a00: 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66         /* RHS of
9a10: 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20   LIKE/GLOB ends 
9a20: 77 69 74 68 20 77 69 6c 64 63 61 72 64 20 2a 2f  with wildcard */
9a30: 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20  .  int noCase = 
9a40: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
9a50: 20 20 20 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42      /* LIKE/GLOB
9a60: 20 64 69 73 74 69 6e 67 75 69 73 68 65 73 20 63   distinguishes c
9a70: 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  ase */.  int op;
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
9aa0: 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e  -level operator.
9ab0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20    pExpr->op */. 
9ac0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
9ad0: 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
9ae0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
9af0: 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
9b00: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9b10: 64 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61  db;        /* Da
9b20: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
9b30: 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e  n */..  if( db->
9b40: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
9b50: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
9b60: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
9b70: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d  a[idxTerm];.  pM
9b80: 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f  askSet = &pWInfo
9b90: 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 70 45  ->sMaskSet;.  pE
9ba0: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
9bb0: 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  pr;.  assert( pE
9bc0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 53 20 26  xpr->op!=TK_AS &
9bd0: 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  & pExpr->op!=TK_
9be0: 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 70 72 65  COLLATE );.  pre
9bf0: 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54 61  reqLeft = exprTa
9c00: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
9c10: 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
9c20: 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  ;.  op = pExpr->
9c30: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
9c40: 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _IN ){.    asser
9c50: 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t( pExpr->pRight
9c60: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 45  ==0 );.    if( E
9c70: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9c80: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
9c90: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 70 54 65  ct) ){.      pTe
9ca0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
9cb0: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
9cc0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
9cd0: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
9ce0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
9cf0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72       pTerm->prer
9d00: 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 4c 69  eqRight = exprLi
9d10: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
9d20: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e  skSet, pExpr->x.
9d30: 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
9d40: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
9d50: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70  _ISNULL ){.    p
9d60: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
9d70: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
9d80: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
9d90: 71 52 69 67 68 74 20 3d 20 65 78 70 72 54 61 62  qRight = exprTab
9da0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
9db0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
9dc0: 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65 71 41 6c  ;.  }.  prereqAl
9dd0: 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  l = exprTableUsa
9de0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
9df0: 70 72 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  pr);.  if( ExprH
9e00: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
9e10: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
9e20: 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 78 20  {.    Bitmask x 
9e30: 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
9e40: 65 74 2c 20 70 45 78 70 72 2d 3e 69 52 69 67 68  et, pExpr->iRigh
9e50: 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20  tJoinTable);.   
9e60: 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b   prereqAll |= x;
9e70: 0a 20 20 20 20 65 78 74 72 61 52 69 67 68 74 20  .    extraRight 
9e80: 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c  = x-1;  /* ON cl
9e90: 61 75 73 65 20 74 65 72 6d 73 20 6d 61 79 20 6e  ause terms may n
9ea0: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
9eb0: 61 6e 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  an index.       
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65  ** on left table
9ee0: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e   of a LEFT JOIN.
9ef0: 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 20 2a    Ticket #3015 *
9f00: 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70  /.  }.  pTerm->p
9f10: 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65  rereqAll = prere
9f20: 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c  qAll;.  pTerm->l
9f30: 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  eftCursor = -1;.
9f40: 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74    pTerm->iParent
9f50: 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e   = -1;.  pTerm->
9f60: 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20  eOperator = 0;. 
9f70: 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f   if( allowedOp(o
9f80: 70 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  p) ){.    Expr *
9f90: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
9fa0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
9fb0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
9fc0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
9fd0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
9fe0: 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e 70  Collate(pExpr->p
9ff0: 52 69 67 68 74 29 3b 0a 20 20 20 20 75 31 36 20  Right);.    u16 
a000: 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65 72 6d 2d  opMask = (pTerm-
a010: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
a020: 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 3f 20  rereqLeft)==0 ? 
a030: 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45 51 55 49  WO_ALL : WO_EQUI
a040: 56 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  V;.    if( pLeft
a050: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
a060: 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ){.      pTerm->
a070: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
a080: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
a090: 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43    pTerm->u.leftC
a0a0: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
a0b0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54  Column;.      pT
a0c0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
a0d0: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f 70   operatorMask(op
a0e0: 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20  ) & opMask;.    
a0f0: 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  }.    if( pRight
a100: 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d   && pRight->op==
a110: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
a120: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
a130: 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ew;.      Expr *
a140: 70 44 75 70 3b 0a 20 20 20 20 20 20 75 31 36 20  pDup;.      u16 
a150: 65 45 78 74 72 61 4f 70 20 3d 20 30 3b 20 20 20  eExtraOp = 0;   
a160: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 69       /* Extra bi
a170: 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e 65 4f 70  ts for pNew->eOp
a180: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
a190: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
a1a0: 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20  ursor>=0 ){.    
a1b0: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
a1c0: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
a1d0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
a1e0: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
a1f0: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
a200: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
a210: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
a220: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44 75  prDelete(db, pDu
a230: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
a240: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  turn;.        }.
a250: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d          idxNew =
a260: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
a270: 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20 54 45  rt(pWC, pDup, TE
a280: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
a290: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
a2a0: 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d 30 20    if( idxNew==0 
a2b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
a2c0: 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61    pNew = &pWC->a
a2d0: 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20  [idxNew];.      
a2e0: 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20    pNew->iParent 
a2f0: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
a300: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
a310: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
a320: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
a330: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ld = 1;.        
a340: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
a350: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
a360: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
a370: 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20 20 20 20  ->op==TK_EQ.    
a380: 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73       && !ExprHas
a390: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
a3a0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
a3b0: 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a        && Optimiz
a3c0: 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
a3d0: 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 69 74 69   SQLITE_Transiti
a3e0: 76 65 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ve).        ){. 
a3f0: 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e           pTerm->
a400: 65 4f 70 65 72 61 74 6f 72 20 7c 3d 20 57 4f 5f  eOperator |= WO_
a410: 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20 20  EQUIV;.         
a420: 20 65 45 78 74 72 61 4f 70 20 3d 20 57 4f 5f 45   eExtraOp = WO_E
a430: 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20 7d 0a  QUIV;.        }.
a440: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a450: 20 20 20 20 20 70 44 75 70 20 3d 20 70 45 78 70       pDup = pExp
a460: 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  r;.        pNew 
a470: 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
a480: 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75  .      exprCommu
a490: 74 65 28 70 50 61 72 73 65 2c 20 70 44 75 70 29  te(pParse, pDup)
a4a0: 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20  ;.      pLeft = 
a4b0: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
a4c0: 6f 6c 6c 61 74 65 28 70 44 75 70 2d 3e 70 4c 65  ollate(pDup->pLe
a4d0: 66 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ft);.      pNew-
a4e0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
a4f0: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
a500: 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66 74 43     pNew->u.leftC
a510: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
a520: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 74 65  Column;.      te
a530: 73 74 63 61 73 65 28 20 28 70 72 65 72 65 71 4c  stcase( (prereqL
a540: 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74  eft | extraRight
a550: 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66 74 20  ) != prereqLeft 
a560: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  );.      pNew->p
a570: 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
a580: 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52  reqLeft | extraR
a590: 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  ight;.      pNew
a5a0: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
a5b0: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70  ereqAll;.      p
a5c0: 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  New->eOperator =
a5d0: 20 28 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70   (operatorMask(p
a5e0: 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45 78 74 72  Dup->op) + eExtr
a5f0: 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20  aOp) & opMask;. 
a600: 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65     }.  }..#ifnde
a610: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45  f SQLITE_OMIT_BE
a620: 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49  TWEEN_OPTIMIZATI
a630: 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74 65 72  ON.  /* If a ter
a640: 6d 20 69 73 20 74 68 65 20 42 45 54 57 45 45 4e  m is the BETWEEN
a650: 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65 61 74   operator, creat
a660: 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74 75 61  e two new virtua
a670: 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61  l terms.  ** tha
a680: 74 20 64 65 66 69 6e 65 20 74 68 65 20 72 61 6e  t define the ran
a690: 67 65 20 74 68 61 74 20 74 68 65 20 42 45 54 57  ge that the BETW
a6a0: 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 20  EEN implements. 
a6b0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20   For example:.  
a6c0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 61 20 42  **.  **      a B
a6d0: 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63 0a 20  ETWEEN b AND c. 
a6e0: 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76   **.  ** is conv
a6f0: 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a  erted into:.  **
a700: 0a 20 20 2a 2a 20 20 20 20 20 20 28 61 20 42 45  .  **      (a BE
a710: 54 57 45 45 4e 20 62 20 41 4e 44 20 63 29 20 41  TWEEN b AND c) A
a720: 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44 20 28 61  ND (a>=b) AND (a
a730: 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  <=c).  **.  ** T
a740: 68 65 20 74 77 6f 20 6e 65 77 20 74 65 72 6d 73  he two new terms
a750: 20 61 72 65 20 61 64 64 65 64 20 6f 6e 74 6f 20   are added onto 
a760: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
a770: 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63  hereClause objec
a780: 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 65 77 20  t..  ** The new 
a790: 74 65 72 6d 73 20 61 72 65 20 22 64 79 6e 61 6d  terms are "dynam
a7a0: 69 63 22 20 61 6e 64 20 61 72 65 20 63 68 69 6c  ic" and are chil
a7b0: 64 72 65 6e 20 6f 66 20 74 68 65 20 6f 72 69 67  dren of the orig
a7c0: 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a 20 20 2a  inal BETWEEN.  *
a7d0: 2a 20 74 65 72 6d 2e 20 20 54 68 61 74 20 6d 65  * term.  That me
a7e0: 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 20  ans that if the 
a7f0: 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20  BETWEEN term is 
a800: 63 6f 64 65 64 2c 20 74 68 65 20 63 68 69 6c 64  coded, the child
a810: 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20 73 6b 69  ren are.  ** ski
a820: 70 70 65 64 2e 20 20 4f 72 2c 20 69 66 20 74 68  pped.  Or, if th
a830: 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 73  e children are s
a840: 61 74 69 73 66 69 65 64 20 62 79 20 61 6e 20 69  atisfied by an i
a850: 6e 64 65 78 2c 20 74 68 65 20 6f 72 69 67 69 6e  ndex, the origin
a860: 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45 45 4e 20  al.  ** BETWEEN 
a870: 74 65 72 6d 20 69 73 20 73 6b 69 70 70 65 64 2e  term is skipped.
a880: 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28  .  */.  else if(
a890: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42   pExpr->op==TK_B
a8a0: 45 54 57 45 45 4e 20 26 26 20 70 57 43 2d 3e 6f  ETWEEN && pWC->o
a8b0: 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p==TK_AND ){.   
a8c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
a8d0: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
a8e0: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
a8f0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
a900: 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45  8 ops[] = {TK_GE
a910: 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73  , TK_LE};.    as
a920: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
a930: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
a940: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b  ist->nExpr==2 );
a950: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
a960: 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  2; i++){.      E
a970: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
a980: 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b       int idxNew;
a990: 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20  .      pNewExpr 
a9a0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
a9b0: 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a  Parse, ops[i], .
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
a9e0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
a9f0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29  pExpr->pLeft, 0)
aa00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
aa20: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
aa30: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
aa40: 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20  xpr, 0), 0);.   
aa50: 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d     transferJoinM
aa60: 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78 70 72  arkings(pNewExpr
aa70: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
aa80: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
aa90: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
aaa0: 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56  pNewExpr, TERM_V
aab0: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
aac0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MIC);.      test
aad0: 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20  case( idxNew==0 
aae0: 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61  );.      exprAna
aaf0: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
ab00: 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 70  idxNew);.      p
ab10: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
ab20: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70  dxTerm];.      p
ab30: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50  WC->a[idxNew].iP
ab40: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
ab50: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d  .    }.    pTerm
ab60: 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20  ->nChild = 2;.  
ab70: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
ab80: 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f  TE_OMIT_BETWEEN_
ab90: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
aba0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
abb0: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
abc0: 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64  IMIZATION) && !d
abd0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
abe0: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20 20 2f  IT_SUBQUERY).  /
abf0: 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d  * Analyze a term
ac00: 20 74 68 61 74 20 69 73 20 63 6f 6d 70 6f 73 65   that is compose
ac10: 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  d of two or more
ac20: 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63   subterms connec
ac30: 74 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e 20 4f  ted by.  ** an O
ac40: 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f  R operator..  */
ac50: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70  .  else if( pExp
ac60: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a  r->op==TK_OR ){.
ac70: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 43 2d      assert( pWC-
ac80: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20  >op==TK_AND );. 
ac90: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72     exprAnalyzeOr
aca0: 54 65 72 6d 28 70 53 72 63 2c 20 70 57 43 2c 20  Term(pSrc, pWC, 
acb0: 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 70 54  idxTerm);.    pT
acc0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
acd0: 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64  xTerm];.  }.#end
ace0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
acf0: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
ad00: 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  N */..#ifndef SQ
ad10: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
ad20: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a  PTIMIZATION.  /*
ad30: 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 73   Add constraints
ad40: 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20 73   to reduce the s
ad50: 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e 20 61  earch space on a
ad60: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20   LIKE or GLOB.  
ad70: 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  ** operator..  *
ad80: 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61  *.  ** A like pa
ad90: 74 74 65 72 6e 20 6f 66 20 74 68 65 20 66 6f 72  ttern of the for
ada0: 6d 20 22 78 20 4c 49 4b 45 20 27 61 62 63 25 27  m "x LIKE 'abc%'
adb0: 22 20 69 73 20 63 68 61 6e 67 65 64 20 69 6e 74  " is changed int
adc0: 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  o constraints.  
add0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
ade0: 20 78 3e 3d 27 61 62 63 27 20 41 4e 44 20 78 3c   x>='abc' AND x<
adf0: 27 61 62 64 27 20 41 4e 44 20 78 20 4c 49 4b 45  'abd' AND x LIKE
ae00: 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a 20 20 2a   'abc%'.  **.  *
ae10: 2a 20 54 68 65 20 6c 61 73 74 20 63 68 61 72 61  * The last chara
ae20: 63 74 65 72 20 6f 66 20 74 68 65 20 70 72 65 66  cter of the pref
ae30: 69 78 20 22 61 62 63 22 20 69 73 20 69 6e 63 72  ix "abc" is incr
ae40: 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20  emented to form 
ae50: 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61  the.  ** termina
ae60: 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22  tion condition "
ae70: 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  abd"..  */.  if(
ae80: 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44   pWC->op==TK_AND
ae90: 20 0a 20 20 20 26 26 20 69 73 4c 69 6b 65 4f 72   .   && isLikeOr
aea0: 47 6c 6f 62 28 70 50 61 72 73 65 2c 20 70 45 78  Glob(pParse, pEx
aeb0: 70 72 2c 20 26 70 53 74 72 31 2c 20 26 69 73 43  pr, &pStr1, &isC
aec0: 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65  omplete, &noCase
aed0: 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20  ).  ){.    Expr 
aee0: 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a  *pLeft;       /*
aef0: 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f   LHS of LIKE/GLO
af00: 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  B operator */.  
af10: 20 20 45 78 70 72 20 2a 70 53 74 72 32 3b 20 20    Expr *pStr2;  
af20: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
af30: 70 53 74 72 31 20 2d 20 52 48 53 20 6f 66 20 4c  pStr1 - RHS of L
af40: 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f  IKE/GLOB operato
af50: 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70  r */.    Expr *p
af60: 4e 65 77 45 78 70 72 31 3b 0a 20 20 20 20 45 78  NewExpr1;.    Ex
af70: 70 72 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20  pr *pNewExpr2;. 
af80: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a     int idxNew1;.
af90: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 32 3b      int idxNew2;
afa0: 0a 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6c  .    Token sColl
afb0: 53 65 71 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d  SeqName;  /* Nam
afc0: 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e 67 20 73  e of collating s
afd0: 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20  equence */..    
afe0: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78  pLeft = pExpr->x
aff0: 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
b000: 70 72 3b 0a 20 20 20 20 70 53 74 72 32 20 3d 20  pr;.    pStr2 = 
b010: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
b020: 62 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20  b, pStr1, 0);.  
b030: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
b040: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
b050: 20 75 38 20 63 2c 20 2a 70 43 3b 20 20 20 20 20   u8 c, *pC;     
b060: 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 72 61 63    /* Last charac
b070: 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20 66  ter before the f
b080: 69 72 73 74 20 77 69 6c 64 63 61 72 64 20 2a 2f  irst wildcard */
b090: 0a 20 20 20 20 20 20 70 43 20 3d 20 28 75 38 2a  .      pC = (u8*
b0a0: 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65  )&pStr2->u.zToke
b0b0: 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  n[sqlite3Strlen3
b0c0: 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65  0(pStr2->u.zToke
b0d0: 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d  n)-1];.      c =
b0e0: 20 2a 70 43 3b 0a 20 20 20 20 20 20 69 66 28 20   *pC;.      if( 
b0f0: 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20  noCase ){.      
b100: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69    /* The point i
b110: 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  s to increment t
b120: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
b130: 72 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  r before the fir
b140: 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  st.        ** wi
b150: 6c 64 63 61 72 64 2e 20 20 42 75 74 20 69 66 20  ldcard.  But if 
b160: 77 65 20 69 6e 63 72 65 6d 65 6e 74 20 27 40 27  we increment '@'
b170: 2c 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  , that will push
b180: 20 69 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20   it into the.   
b190: 20 20 20 20 20 2a 2a 20 61 6c 70 68 61 62 65 74       ** alphabet
b1a0: 69 63 20 72 61 6e 67 65 20 77 68 65 72 65 20 63  ic range where c
b1b0: 61 73 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20  ase conversions 
b1c0: 77 69 6c 6c 20 6d 65 73 73 20 75 70 20 74 68 65  will mess up the
b1d0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 65   .        ** ine
b1e0: 71 75 61 6c 69 74 79 2e 20 20 54 6f 20 61 76 6f  quality.  To avo
b1f0: 69 64 20 74 68 69 73 2c 20 6d 61 6b 65 20 73 75  id this, make su
b200: 72 65 20 74 6f 20 61 6c 73 6f 20 72 75 6e 20 74  re to also run t
b210: 68 65 20 66 75 6c 6c 0a 20 20 20 20 20 20 20 20  he full.        
b220: 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c 6c 20 63  ** LIKE on all c
b230: 61 6e 64 69 64 61 74 65 20 65 78 70 72 65 73 73  andidate express
b240: 69 6f 6e 73 20 62 79 20 63 6c 65 61 72 69 6e 67  ions by clearing
b250: 20 74 68 65 20 69 73 43 6f 6d 70 6c 65 74 65 20   the isComplete 
b260: 66 6c 61 67 0a 20 20 20 20 20 20 20 20 2a 2f 0a  flag.        */.
b270: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
b280: 41 27 2d 31 20 29 20 69 73 43 6f 6d 70 6c 65 74  A'-1 ) isComplet
b290: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  e = 0;.        c
b2a0: 20 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72 54   = sqlite3UpperT
b2b0: 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20  oLower[c];.     
b2c0: 20 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d 20 63   }.      *pC = c
b2d0: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   + 1;.    }.    
b2e0: 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e 7a 20 3d  sCollSeqName.z =
b2f0: 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f 43 41 53   noCase ? "NOCAS
b300: 45 22 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20  E" : "BINARY";. 
b310: 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e     sCollSeqName.
b320: 6e 20 3d 20 36 3b 0a 20 20 20 20 70 4e 65 77 45  n = 6;.    pNewE
b330: 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78  xpr1 = sqlite3Ex
b340: 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c  prDup(db, pLeft,
b350: 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70   0);.    pNewExp
b360: 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  r1 = sqlite3PExp
b370: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 45 2c  r(pParse, TK_GE,
b380: 20 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c   .           sql
b390: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
b3a0: 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 70  teToken(pParse,p
b3b0: 4e 65 77 45 78 70 72 31 2c 26 73 43 6f 6c 6c 53  NewExpr1,&sCollS
b3c0: 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  eqName),.       
b3d0: 20 20 20 20 70 53 74 72 31 2c 20 30 29 3b 0a 20      pStr1, 0);. 
b3e0: 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d     transferJoinM
b3f0: 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78 70 72  arkings(pNewExpr
b400: 31 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69  1, pExpr);.    i
b410: 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c  dxNew1 = whereCl
b420: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
b430: 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52 4d 5f  pNewExpr1, TERM_
b440: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
b450: 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63  AMIC);.    testc
b460: 61 73 65 28 20 69 64 78 4e 65 77 31 3d 3d 30 20  ase( idxNew1==0 
b470: 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  );.    exprAnaly
b480: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
b490: 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e 65 77  xNew1);.    pNew
b4a0: 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33 45  Expr2 = sqlite3E
b4b0: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
b4c0: 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78  , 0);.    pNewEx
b4d0: 70 72 32 20 3d 20 73 71 6c 69 74 65 33 50 45 78  pr2 = sqlite3PEx
b4e0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54  pr(pParse, TK_LT
b4f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
b500: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
b510: 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 70  teToken(pParse,p
b520: 4e 65 77 45 78 70 72 32 2c 26 73 43 6f 6c 6c 53  NewExpr2,&sCollS
b530: 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  eqName),.       
b540: 20 20 20 20 70 53 74 72 32 2c 20 30 29 3b 0a 20      pStr2, 0);. 
b550: 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d     transferJoinM
b560: 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78 70 72  arkings(pNewExpr
b570: 32 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69  2, pExpr);.    i
b580: 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c  dxNew2 = whereCl
b590: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
b5a0: 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f  pNewExpr2, TERM_
b5b0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
b5c0: 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63  AMIC);.    testc
b5d0: 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30 20  ase( idxNew2==0 
b5e0: 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  );.    exprAnaly
b5f0: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
b600: 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72  xNew2);.    pTer
b610: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
b620: 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73  erm];.    if( is
b630: 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20  Complete ){.    
b640: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31    pWC->a[idxNew1
b650: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
b660: 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e  erm;.      pWC->
b670: 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65  a[idxNew2].iPare
b680: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
b690: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
b6a0: 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 2;.    }.  }
b6b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b6c0: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
b6d0: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
b6e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b6f0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
b700: 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43  /* Add a WO_MATC
b710: 48 20 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d  H auxiliary term
b720: 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69   to the constrai
b730: 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a 20 20  nt set if the.  
b740: 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72 65  ** current expre
b750: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
b760: 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41  form:  column MA
b770: 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54  TCH expr..  ** T
b780: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
b790: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 78  is used by the x
b7a0: 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
b7b0: 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61  s of.  ** virtua
b7c0: 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e  l tables.  The n
b7d0: 61 74 69 76 65 20 71 75 65 72 79 20 6f 70 74 69  ative query opti
b7e0: 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61  mizer does not a
b7f0: 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64  ttempt.  ** to d
b800: 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20  o anything with 
b810: 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e  MATCH functions.
b820: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61  .  */.  if( isMa
b830: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70  tchOfColumn(pExp
b840: 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  r) ){.    int id
b850: 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a  xNew;.    Expr *
b860: 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a  pRight, *pLeft;.
b870: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
b880: 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74  NewTerm;.    Bit
b890: 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d  mask prereqColum
b8a0: 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a  n, prereqExpr;..
b8b0: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78      pRight = pEx
b8c0: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
b8d0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 65  ].pExpr;.    pLe
b8e0: 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ft = pExpr->x.pL
b8f0: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
b900: 0a 20 20 20 20 70 72 65 72 65 71 45 78 70 72 20  .    prereqExpr 
b910: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
b920: 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68  (pMaskSet, pRigh
b930: 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43 6f  t);.    prereqCo
b940: 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c 65  lumn = exprTable
b950: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
b960: 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20  pLeft);.    if( 
b970: 28 70 72 65 72 65 71 45 78 70 72 20 26 20 70 72  (prereqExpr & pr
b980: 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29  ereqColumn)==0 )
b990: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
b9a0: 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  ewExpr;.      pN
b9b0: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
b9c0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
b9d0: 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20 20  _MATCH, .       
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65         0, sqlite
ba00: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 52 69  3ExprDup(db, pRi
ba10: 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20  ght, 0), 0);.   
ba20: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
ba30: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
ba40: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
ba50: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
ba60: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74  YNAMIC);.      t
ba70: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
ba80: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
ba90: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
baa0: 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e  dxNew];.      pN
bab0: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  ewTerm->prereqRi
bac0: 67 68 74 20 3d 20 70 72 65 72 65 71 45 78 70 72  ght = prereqExpr
bad0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
bae0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
baf0: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
bb00: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e      pNewTerm->u.
bb10: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
bb20: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
bb30: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70     pNewTerm->eOp
bb40: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43  erator = WO_MATC
bb50: 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  H;.      pNewTer
bb60: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  m->iParent = idx
bb70: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72  Term;.      pTer
bb80: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
bb90: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  erm];.      pTer
bba0: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
bbb0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
bbc0: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49  ags |= TERM_COPI
bbd0: 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  ED;.      pNewTe
bbe0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
bbf0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
bc00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
bc10: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
bc20: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
bc30: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
bc40: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
bc50: 5f 53 54 41 54 34 0a 20 20 2f 2a 20 57 68 65 6e  _STAT4.  /* When
bc60: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69   sqlite_stat3 hi
bc70: 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20  stogram data is 
bc80: 61 76 61 69 6c 61 62 6c 65 20 61 6e 20 6f 70 65  available an ope
bc90: 72 61 74 6f 72 20 6f 66 20 74 68 65 0a 20 20 2a  rator of the.  *
bca0: 2a 20 66 6f 72 6d 20 22 78 20 49 53 20 4e 4f 54  * form "x IS NOT
bcb0: 20 4e 55 4c 4c 22 20 63 61 6e 20 73 6f 6d 65 74   NULL" can somet
bcc0: 69 6d 65 73 20 62 65 20 65 76 61 6c 75 61 74 65  imes be evaluate
bcd0: 64 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  d more efficient
bce0: 6c 79 0a 20 20 2a 2a 20 61 73 20 22 78 3e 4e 55  ly.  ** as "x>NU
bcf0: 4c 4c 22 20 69 66 20 78 20 69 73 20 6e 6f 74 20  LL" if x is not 
bd00: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
bd10: 52 59 20 4b 45 59 2e 20 20 53 6f 20 63 6f 6e 73  RY KEY.  So cons
bd20: 74 72 75 63 74 20 61 0a 20 20 2a 2a 20 76 69 72  truct a.  ** vir
bd30: 74 75 61 6c 20 74 65 72 6d 20 6f 66 20 74 68 61  tual term of tha
bd40: 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  t form..  **.  *
bd50: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
bd60: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6d 75 73  virtual term mus
bd70: 74 20 62 65 20 74 61 67 67 65 64 20 77 69 74 68  t be tagged with
bd80: 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20 20 54 68   TERM_VNULL.  Th
bd90: 69 73 0a 20 20 2a 2a 20 54 45 52 4d 5f 56 4e 55  is.  ** TERM_VNU
bda0: 4c 4c 20 74 61 67 20 77 69 6c 6c 20 73 75 70 70  LL tag will supp
bdb0: 72 65 73 73 20 74 68 65 20 6e 6f 74 2d 6e 75 6c  ress the not-nul
bdc0: 6c 20 63 68 65 63 6b 20 61 74 20 74 68 65 20 62  l check at the b
bdd0: 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66  eginning.  ** of
bde0: 20 74 68 65 20 6c 6f 6f 70 2e 20 20 57 69 74 68   the loop.  With
bdf0: 6f 75 74 20 74 68 65 20 54 45 52 4d 5f 56 4e 55  out the TERM_VNU
be00: 4c 4c 20 66 6c 61 67 2c 20 74 68 65 20 6e 6f 74  LL flag, the not
be10: 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 0a 20  -null check at. 
be20: 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66   ** the start of
be30: 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 70   the loop will p
be40: 72 65 76 65 6e 74 20 61 6e 79 20 72 65 73 75 6c  revent any resul
be50: 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65  ts from being re
be60: 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  turned..  */.  i
be70: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
be80: 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 70  _NOTNULL.   && p
be90: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  Expr->pLeft->op=
bea0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26  =TK_COLUMN.   &&
beb0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
bec0: 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 26 26 20  Column>=0.   && 
bed0: 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
bee0: 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53  led(db, SQLITE_S
bef0: 74 61 74 33 29 0a 20 20 29 7b 0a 20 20 20 20 45  tat3).  ){.    E
bf00: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
bf10: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
bf20: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
bf30: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
bf40: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
bf50: 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20 70 4e 65  ewTerm;..    pNe
bf60: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  wExpr = sqlite3P
bf70: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
bf80: 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  GT,.            
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
bfb0: 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20  b, pLeft, 0),.  
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfd0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
bfe0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
bff0: 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29  K_NULL, 0, 0, 0)
c000: 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64 78 4e 65  , 0);..    idxNe
c010: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
c020: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
c030: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 20 20 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c     TERM_VIRTUAL|
c060: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52  TERM_DYNAMIC|TER
c070: 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66  M_VNULL);.    if
c080: 28 20 69 64 78 4e 65 77 20 29 7b 0a 20 20 20 20  ( idxNew ){.    
c090: 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57    pNewTerm = &pW
c0a0: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
c0b0: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72      pNewTerm->pr
c0c0: 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20  ereqRight = 0;. 
c0d0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c       pNewTerm->l
c0e0: 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
c0f0: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
c100: 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66   pNewTerm->u.lef
c110: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
c120: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
c130: 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61  pNewTerm->eOpera
c140: 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a 20 20 20  tor = WO_GT;.   
c150: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61     pNewTerm->iPa
c160: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
c170: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
c180: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
c190: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
c1a0: 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ild = 1;.      p
c1b0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
c1c0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20   TERM_COPIED;.  
c1d0: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72      pNewTerm->pr
c1e0: 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d  ereqAll = pTerm-
c1f0: 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20  >prereqAll;.    
c200: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
c210: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
c220: 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
c230: 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e  .  /* Prevent ON
c240: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66   clause terms of
c250: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f   a LEFT JOIN fro
c260: 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20  m being used to 
c270: 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e  drive.  ** an in
c280: 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73 20 74  dex for tables t
c290: 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68  o the left of th
c2a0: 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70  e join..  */.  p
c2b0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
c2c0: 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68 74 3b  t |= extraRight;
c2d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
c2e0: 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73  unction searches
c2f0: 20 70 4c 69 73 74 20 66 6f 72 20 61 20 65 6e 74   pList for a ent
c300: 72 79 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  ry that matches 
c310: 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
c320: 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65 78 20 70  mn.** of index p
c330: 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  Idx..**.** If su
c340: 63 68 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ch an expression
c350: 20 69 73 20 66 6f 75 6e 64 2c 20 69 74 73 20 69   is found, its i
c360: 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61  ndex in pList->a
c370: 5b 5d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  [] is returned. 
c380: 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73  If.** no express
c390: 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31  ion is found, -1
c3a0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
c3b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
c3c0: 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50 61 72 73  IndexCol(.  Pars
c3d0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
c3f0: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
c400: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
c410: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
c420: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
c430: 6c 69 73 74 20 74 6f 20 73 65 61 72 63 68 20 2a  list to search *
c440: 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 2c 20 20  /.  int iBase,  
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f      /* Cursor fo
c470: 72 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74  r table associat
c480: 65 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a  ed with pIdx */.
c490: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4b0: 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61    /* Index to ma
c4c0: 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f  tch column of */
c4d0: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20  .  int iCol     
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20     /* Column of 
c500: 69 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 2a  index to match *
c510: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
c520: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
c530: 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  l = pIdx->azColl
c540: 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69  [iCol];..  for(i
c550: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
c560: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
c570: 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45  pr *p = sqlite3E
c580: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
c590: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
c5a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  );.    if( p->op
c5b0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
c5c0: 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   && p->iColumn==
c5d0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
c5e0: 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20 70 2d 3e  Col].     && p->
c5f0: 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 0a 20 20  iTable==iBase.  
c600: 20 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53    ){.      CollS
c610: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
c620: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
c630: 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b  Parse, pList->a[
c640: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
c650: 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 6f 6c   if( ALWAYS(pCol
c660: 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  l) && 0==sqlite3
c670: 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
c680: 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  Name, zColl) ){.
c690: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69          return i
c6a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c6b0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31    }..  return -1
c6c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
c6d0: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  n true if the DI
c6e0: 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f  STINCT expressio
c6f0: 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  n-list passed as
c700: 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
c710: 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64  ent.** is redund
c720: 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53  ant..**.** A DIS
c730: 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20 72 65  TINCT list is re
c740: 64 75 6e 64 61 6e 74 20 69 66 20 74 68 65 20 64  dundant if the d
c750: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73  atabase contains
c760: 20 73 6f 6d 65 20 73 75 62 73 65 74 20 6f 66 0a   some subset of.
c770: 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  ** columns that 
c780: 61 72 65 20 75 6e 69 71 75 65 20 61 6e 64 20 6e  are unique and n
c790: 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  on-null..*/.stat
c7a0: 69 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63  ic int isDistinc
c7b0: 74 52 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61  tRedundant(.  Pa
c7c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
c7d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
c7e0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
c7f0: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
c800: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t,        /* The
c810: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
c820: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
c830: 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  WC,         /* T
c840: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
c850: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
c860: 44 69 73 74 69 6e 63 74 20 20 20 20 20 20 20 2f  Distinct       /
c870: 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
c880: 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
c890: 65 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b  e DISTINCT */.){
c8a0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
c8b0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
c8c0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 0a 20 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a   .  int iBase;..
c8f0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
c900: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74   more than one t
c910: 61 62 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c 65  able or sub-sele
c920: 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ct in the FROM c
c930: 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68  lause of.  ** th
c940: 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69  is query, then i
c950: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f  t will not be po
c960: 73 73 69 62 6c 65 20 74 6f 20 73 68 6f 77 20 74  ssible to show t
c970: 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54  hat the DISTINCT
c980: 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73   .  ** clause is
c990: 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20   redundant. */. 
c9a0: 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
c9b0: 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
c9c0: 30 3b 0a 20 20 69 42 61 73 65 20 3d 20 70 54 61  0;.  iBase = pTa
c9d0: 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72  bList->a[0].iCur
c9e0: 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20 70 54  sor;.  pTab = pT
c9f0: 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61  abList->a[0].pTa
ca00: 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20  b;..  /* If any 
ca10: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
ca20: 6e 73 20 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c  ns is an IPK col
ca30: 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42 61  umn on table iBa
ca40: 73 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  se, then return 
ca50: 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65  .  ** true. Note
ca60: 3a 20 54 68 65 20 28 70 2d 3e 69 54 61 62 6c 65  : The (p->iTable
ca70: 3d 3d 69 42 61 73 65 29 20 70 61 72 74 20 6f 66  ==iBase) part of
ca80: 20 74 68 69 73 20 74 65 73 74 20 6d 61 79 20 62   this test may b
ca90: 65 20 66 61 6c 73 65 20 69 66 20 74 68 65 0a 20  e false if the. 
caa0: 20 2a 2a 20 63 75 72 72 65 6e 74 20 53 45 4c 45   ** current SELE
cab0: 43 54 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74  CT is a correlat
cac0: 65 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20  ed sub-query..  
cad0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
cae0: 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72  pDistinct->nExpr
caf0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
cb00: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70   *p = sqlite3Exp
cb10: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 69  rSkipCollate(pDi
cb20: 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78  stinct->a[i].pEx
cb30: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  pr);.    if( p->
cb40: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
cb50: 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73   p->iTable==iBas
cb60: 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c  e && p->iColumn<
cb70: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
cb80: 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72  }..  /* Loop thr
cb90: 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73  ough all indices
cba0: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63   on the table, c
cbb0: 68 65 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20  hecking each to 
cbc0: 73 65 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a  see if it makes.
cbd0: 20 20 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43    ** the DISTINC
cbe0: 54 20 71 75 61 6c 69 66 69 65 72 20 72 65 64 75  T qualifier redu
cbf0: 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73  ndant. It does s
cc00: 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  o if:.  **.  ** 
cc10: 20 20 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69    1. The index i
cc20: 73 20 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c  s itself UNIQUE,
cc30: 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   and.  **.  **  
cc40: 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63   2. All of the c
cc50: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
cc60: 64 65 78 20 61 72 65 20 65 69 74 68 65 72 20 70  dex are either p
cc70: 61 72 74 20 6f 66 20 74 68 65 20 70 44 69 73 74  art of the pDist
cc80: 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c  inct.  **      l
cc90: 69 73 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65  ist, or else the
cca0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
ccb0: 6e 74 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66  ntains a term of
ccc0: 20 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58   the form "col=X
ccd0: 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65  ",.  **      whe
cce0: 72 65 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61  re X is a consta
ccf0: 6e 74 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f  nt value. The co
cd00: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
cd10: 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20  s of the.  **   
cd20: 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e     comparison an
cd30: 64 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78  d select-list ex
cd40: 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d  pressions must m
cd50: 61 74 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68  atch those of th
cd60: 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20  e index..  **.  
cd70: 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74  **   3. All of t
cd80: 68 6f 73 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d  hose index colum
cd90: 6e 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ns for which the
cda0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f   WHERE clause do
cdb0: 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20  es not.  **     
cdc0: 20 63 6f 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d   contain a "col=
cdd0: 58 22 20 74 65 72 6d 20 61 72 65 20 73 75 62 6a  X" term are subj
cde0: 65 63 74 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c  ect to a NOT NUL
cdf0: 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20  L constraint..  
ce00: 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54  */.  for(pIdx=pT
ce10: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
ce20: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
ce30: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 64  xt){.    if( pId
ce40: 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e  x->onError==OE_N
ce50: 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  one ) continue;.
ce60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
ce70: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b  Idx->nKeyCol; i+
ce80: 2b 29 7b 0a 20 20 20 20 20 20 69 31 36 20 69 43  +){.      i16 iC
ce90: 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ol = pIdx->aiCol
cea0: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  umn[i];.      if
ceb0: 28 20 30 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57  ( 0==findTerm(pW
cec0: 43 2c 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20  C, iBase, iCol, 
ced0: 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f  ~(Bitmask)0, WO_
cee0: 45 51 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20  EQ, pIdx) ){.   
cef0: 20 20 20 20 20 69 6e 74 20 69 49 64 78 43 6f 6c       int iIdxCol
cf00: 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28   = findIndexCol(
cf10: 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63  pParse, pDistinc
cf20: 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c 20  t, iBase, pIdx, 
cf30: 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
cf40: 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61  iIdxCol<0 || pTa
cf50: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f  b->aCol[iCol].no
cf60: 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  tNull==0 ){.    
cf70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cf80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
cf90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
cfa0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b  pIdx->nKeyCol ){
cfb0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
cfc0: 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74 68 61  ndex implies tha
cfd0: 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71  t the DISTINCT q
cfe0: 75 61 6c 69 66 69 65 72 20 69 73 20 72 65 64 75  ualifier is redu
cff0: 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  ndant. */.      
d000: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
d010: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b    }..  return 0;
d020: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  .}.../*.** Estim
d030: 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69 74 68  ate the logarith
d040: 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76  m of the input v
d050: 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32 2e 0a  alue to base 2..
d060: 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
d070: 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73 74 20 4e   estLog(LogEst N
d080: 29 7b 0a 20 20 4c 6f 67 45 73 74 20 78 20 3d 20  ){.  LogEst x = 
d090: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 4e 29  sqlite3LogEst(N)
d0a0: 3b 0a 20 20 72 65 74 75 72 6e 20 78 3e 33 33 20  ;.  return x>33 
d0b0: 3f 20 78 20 2d 20 33 33 20 3a 20 30 3b 0a 7d 0a  ? x - 33 : 0;.}.
d0c0: 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69  ./*.** Two routi
d0d0: 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67  nes for printing
d0e0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
d0f0: 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  an sqlite3_index
d100: 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75  _info.** structu
d110: 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65  re.  Used for te
d120: 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
d130: 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65  ing only.  If ne
d140: 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f  ither.** SQLITE_
d150: 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44  TEST or SQLITE_D
d160: 45 42 55 47 20 61 72 65 20 64 65 66 69 6e 65 64  EBUG are defined
d170: 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75  , then these rou
d180: 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d  tines.** are no-
d190: 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ops..*/.#if !def
d1a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
d1b0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26  _VIRTUALTABLE) &
d1c0: 26 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54  & defined(WHERET
d1d0: 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74  RACE_ENABLED).st
d1e0: 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f  atic void TRACE_
d1f0: 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74  IDX_INPUTS(sqlit
d200: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
d210: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
d220: 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54  ( !sqlite3WhereT
d230: 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  race ) return;. 
d240: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
d250: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
d260: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
d270: 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73  ugPrintf("  cons
d280: 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d  traint[%d]: col=
d290: 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d  %d termid=%d op=
d2a0: 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22  %d usabled=%d\n"
d2b0: 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
d2c0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
d2d0: 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  t[i].iColumn,.  
d2e0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
d2f0: 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73  int[i].iTermOffs
d300: 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  et,.       p->aC
d310: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c  onstraint[i].op,
d320: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
d330: 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65  traint[i].usable
d340: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
d350: 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b  ; i<p->nOrderBy;
d360: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
d370: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
d380: 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f   orderby[%d]: co
d390: 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c  l=%d desc=%d\n",
d3a0: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
d3b0: 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d    p->aOrderBy[i]
d3c0: 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  .iColumn,.      
d3d0: 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e   p->aOrderBy[i].
d3e0: 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  desc);.  }.}.sta
d3f0: 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49  tic void TRACE_I
d400: 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74  DX_OUTPUTS(sqlit
d410: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
d420: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
d430: 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54  ( !sqlite3WhereT
d440: 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  race ) return;. 
d450: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
d460: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
d470: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
d480: 75 67 50 72 69 6e 74 66 28 22 20 20 75 73 61 67  ugPrintf("  usag
d490: 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25  e[%d]: argvIdx=%
d4a0: 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20  d omit=%d\n",.  
d4b0: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
d4c0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
d4d0: 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c  ge[i].argvIndex,
d4e0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
d4f0: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f  traintUsage[i].o
d500: 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  mit);.  }.  sqli
d510: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
d520: 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20    idxNum=%d\n", 
d530: 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71  p->idxNum);.  sq
d540: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
d550: 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22  ("  idxStr=%s\n"
d560: 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  , p->idxStr);.  
d570: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
d580: 74 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e  tf("  orderByCon
d590: 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e  sumed=%d\n", p->
d5a0: 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29  orderByConsumed)
d5b0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
d5c0: 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61  Printf("  estima
d5d0: 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70  tedCost=%g\n", p
d5e0: 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29  ->estimatedCost)
d5f0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
d600: 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61  Printf("  estima
d610: 74 65 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c  tedRows=%lld\n",
d620: 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77   p->estimatedRow
d630: 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66  s);.}.#else.#def
d640: 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  ine TRACE_IDX_IN
d650: 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20  PUTS(A).#define 
d660: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
d670: 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  S(A).#endif..#if
d680: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d690: 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
d6a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
d6b0: 55 45 20 69 66 20 74 68 65 20 57 48 45 52 45 20  UE if the WHERE 
d6c0: 63 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65 72  clause term pTer
d6d0: 6d 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77  m is of a form w
d6e0: 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64  here it.** could
d6f0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e   be used with an
d700: 20 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73   index to access
d710: 20 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20   pSrc, assuming 
d720: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  an appropriate.*
d730: 2a 20 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e  * index existed.
d740: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
d750: 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
d760: 28 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  (.  WhereTerm *p
d770: 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
d780: 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75     /* WHERE clau
d790: 73 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b  se term to check
d7a0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
d7b0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
d7c0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65       /* Table we
d7d0: 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61   are trying to a
d7e0: 63 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61  ccess */.  Bitma
d7f0: 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20  sk notReady     
d800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
d810: 6c 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f  les in outer loo
d820: 70 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  ps of the join *
d830: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b  /.){.  char aff;
d840: 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65  .  if( pTerm->le
d850: 66 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e  ftCursor!=pSrc->
d860: 69 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e  iCursor ) return
d870: 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d   0;.  if( (pTerm
d880: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
d890: 5f 45 51 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  _EQ)==0 ) return
d8a0: 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d   0;.  if( (pTerm
d8b0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
d8c0: 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 72  notReady)!=0 ) r
d8d0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
d8e0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
d8f0: 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b  mn<0 ) return 0;
d900: 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70  .  aff = pSrc->p
d910: 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d  Tab->aCol[pTerm-
d920: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61  >u.leftColumn].a
d930: 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21  ffinity;.  if( !
d940: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
d950: 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45  nityOk(pTerm->pE
d960: 78 70 72 2c 20 61 66 66 29 20 29 20 72 65 74 75  xpr, aff) ) retu
d970: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31  rn 0;.  return 1
d980: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
d990: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d9a0: 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
d9b0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
d9c0: 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63  code to construc
d9d0: 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  t the Index obje
d9e0: 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61  ct for an automa
d9f0: 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64  tic index.** and
da00: 20 74 6f 20 73 65 74 20 75 70 20 74 68 65 20 57   to set up the W
da10: 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74  hereLevel object
da20: 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20   pLevel so that 
da30: 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
da40: 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20  or.** makes use 
da50: 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  of the automatic
da60: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
da70: 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74  c void construct
da80: 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a  AutomaticIndex(.
da90: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dab0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
dac0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
dad0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
dae0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
daf0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
db00: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
db10: 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68  em *pSrc,  /* Th
db20: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
db30: 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65  rm to get the ne
db40: 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69  xt index */.  Bi
db50: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
db60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
db70: 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61  k of cursors tha
db80: 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61  t are not availa
db90: 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  ble */.  WhereLe
dba0: 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20  vel *pLevel     
dbb0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
dbc0: 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a  w index here */.
dbd0: 29 7b 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c  ){.  int nKeyCol
dbe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dbf0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
dc00: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e  lumns in the con
dc10: 73 74 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a  structed index *
dc20: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
dc30: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
dc40: 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d  /* A single term
dc50: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
dc60: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  ause */.  WhereT
dc70: 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20  erm *pWCEnd;    
dc80: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
dc90: 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49 6e  pWC->a[] */.  In
dca0: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
dcb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
dcc0: 65 63 74 20 64 65 73 63 72 69 62 69 6e 67 20 74  ect describing t
dcd0: 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  he transient ind
dce0: 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ex */.  Vdbe *v;
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd00: 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20      /* Prepared 
dd10: 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  statement under 
dd20: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
dd30: 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74 3b 20    int addrInit; 
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dd50: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
dd60: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62  initialization b
dd70: 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20  ypass jump */.  
dd80: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20  Table *pTable;  
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
dda0: 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69  he table being i
ddb0: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
ddc0: 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20  addrTop;        
ddd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
dde0: 66 20 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c  f the index fill
ddf0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72   loop */.  int r
de00: 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20  egRecord;       
de10: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
de20: 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e  er holding an in
de30: 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  dex record */.  
de40: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
de50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
de60: 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f  olumn counter */
de70: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
de90: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
dea0: 2f 0a 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c  /.  int mxBitCol
deb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dec0: 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d  /* Maximum colum
ded0: 6e 20 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73  n in pSrc->colUs
dee0: 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20  ed */.  CollSeq 
def0: 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pColl;         
df00: 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
df10: 20 73 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20   sequence to on 
df20: 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68  a column */.  Wh
df30: 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20  ereLoop *pLoop; 
df40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
df50: 20 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a   Loop object */.
df60: 20 20 63 68 61 72 20 2a 7a 4e 6f 74 55 73 65 64    char *zNotUsed
df70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
df80: 20 45 78 74 72 61 20 73 70 61 63 65 20 6f 6e 20   Extra space on 
df90: 74 68 65 20 65 6e 64 20 6f 66 20 70 49 64 78 20  the end of pIdx 
dfa0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 64 78  */.  Bitmask idx
dfb0: 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20  Cols;           
dfc0: 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 63 6f   /* Bitmap of co
dfd0: 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f 72 20 69  lumns used for i
dfe0: 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74  ndexing */.  Bit
dff0: 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20  mask extraCols; 
e000: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d           /* Bitm
e010: 61 70 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c  ap of additional
e020: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38   columns */.  u8
e030: 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 30   sentWarning = 0
e040: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
e050: 65 20 69 66 20 61 20 77 61 72 6e 6e 69 6e 67 20  e if a warnning 
e060: 68 61 73 20 62 65 65 6e 20 69 73 73 75 65 64 20  has been issued 
e070: 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  */..  /* Generat
e080: 65 20 63 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f  e code to skip o
e090: 76 65 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e  ver the creation
e0a0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61 74   and initializat
e0b0: 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ion of the.  ** 
e0c0: 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
e0d0: 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65  on 2nd and subse
e0e0: 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 73  quent iterations
e0f0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f   of the loop. */
e100: 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
e110: 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
e120: 76 21 3d 30 20 29 3b 0a 20 20 61 64 64 72 49 6e  v!=0 );.  addrIn
e130: 69 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  it = sqlite3Code
e140: 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 0a 20  Once(pParse);.. 
e150: 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
e160: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
e170: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64  that will be add
e180: 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a  ed to the index.
e190: 20 20 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f    ** and used to
e1a0: 20 6d 61 74 63 68 20 57 48 45 52 45 20 63 6c 61   match WHERE cla
e1b0: 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
e1c0: 2a 2f 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30  */.  nKeyCol = 0
e1d0: 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72  ;.  pTable = pSr
e1e0: 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e  c->pTab;.  pWCEn
e1f0: 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d  d = &pWC->a[pWC-
e200: 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70  >nTerm];.  pLoop
e210: 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
e220: 70 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30  p;.  idxCols = 0
e230: 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
e240: 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
e250: 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
e260: 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
e270: 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
e280: 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29  Src, notReady) )
e290: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
e2a0: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
e2b0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69  Column;.      Bi
e2c0: 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43  tmask cMask = iC
e2d0: 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49  ol>=BMS ? MASKBI
e2e0: 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42  T(BMS-1) : MASKB
e2f0: 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  IT(iCol);.      
e300: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
e310: 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  BMS );.      tes
e320: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
e330: 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -1 );.      if( 
e340: 21 73 65 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a  !sentWarning ){.
e350: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e360: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
e370: 4e 47 5f 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20  NG_AUTOINDEX,.  
e380: 20 20 20 20 20 20 20 20 20 20 22 61 75 74 6f 6d            "autom
e390: 61 74 69 63 20 69 6e 64 65 78 20 6f 6e 20 25 73  atic index on %s
e3a0: 28 25 73 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  (%s)", pTable->z
e3b0: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
e3c0: 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69    pTable->aCol[i
e3d0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col].zName);.   
e3e0: 20 20 20 20 20 73 65 6e 74 57 61 72 6e 69 6e 67       sentWarning
e3f0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
e400: 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73      if( (idxCols
e410: 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   & cMask)==0 ){.
e420: 20 20 20 20 20 20 20 20 69 66 28 20 77 68 65 72          if( wher
e430: 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72  eLoopResize(pPar
e440: 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e  se->db, pLoop, n
e450: 4b 65 79 43 6f 6c 2b 31 29 20 29 20 72 65 74 75  KeyCol+1) ) retu
e460: 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  rn;.        pLoo
e470: 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f  p->aLTerm[nKeyCo
e480: 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  l++] = pTerm;.  
e490: 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d        idxCols |=
e4a0: 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a   cMask;.      }.
e4b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
e4c0: 72 74 28 20 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b  rt( nKeyCol>0 );
e4d0: 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
e4e0: 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e  e.nEq = pLoop->n
e4f0: 4c 54 65 72 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b  LTerm = nKeyCol;
e500: 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  .  pLoop->wsFlag
e510: 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
e520: 5f 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f  _EQ | WHERE_IDX_
e530: 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44  ONLY | WHERE_IND
e540: 45 58 45 44 0a 20 20 20 20 20 20 20 20 20 20 20  EXED.           
e550: 20 20 20 20 20 20 20 20 20 20 7c 20 57 48 45 52            | WHER
e560: 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20  E_AUTO_INDEX;.. 
e570: 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
e580: 6d 62 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e  mber of addition
e590: 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  al columns neede
e5a0: 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20  d to create a.  
e5b0: 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  ** covering inde
e5c0: 78 2e 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20  x.  A "covering 
e5d0: 69 6e 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64  index" is an ind
e5e0: 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
e5f0: 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e   all.  ** column
e600: 73 20 74 68 61 74 20 61 72 65 20 6e 65 65 64 65  s that are neede
e610: 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 20  d by the query. 
e620: 20 57 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67   With a covering
e630: 20 69 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a   index, the.  **
e640: 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20   original table 
e650: 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
e660: 65 20 61 63 63 65 73 73 65 64 2e 20 20 41 75 74  e accessed.  Aut
e670: 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d  omatic indices m
e680: 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f  ust.  ** be a co
e690: 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63  vering index bec
e6a0: 61 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 77  ause the index w
e6b0: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74  ill not be updat
e6c0: 65 64 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f  ed if the.  ** o
e6d0: 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68  riginal table ch
e6e0: 61 6e 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e  anges and the in
e6f0: 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61  dex and table ca
e700: 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65  nnot both be use
e710: 64 0a 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67  d.  ** if they g
e720: 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20  o out of sync.. 
e730: 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20   */.  extraCols 
e740: 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  = pSrc->colUsed 
e750: 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20 4d 41  & (~idxCols | MA
e760: 53 4b 42 49 54 28 42 4d 53 2d 31 29 29 3b 0a 20  SKBIT(BMS-1));. 
e770: 20 6d 78 42 69 74 43 6f 6c 20 3d 20 28 70 54 61   mxBitCol = (pTa
e780: 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20 42 4d 53  ble->nCol >= BMS
e790: 2d 31 29 20 3f 20 42 4d 53 2d 31 20 3a 20 70 54  -1) ? BMS-1 : pT
e7a0: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20 74 65  able->nCol;.  te
e7b0: 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e  stcase( pTable->
e7c0: 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  nCol==BMS-1 );. 
e7d0: 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c   testcase( pTabl
e7e0: 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29  e->nCol==BMS-2 )
e7f0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d  ;.  for(i=0; i<m
e800: 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  xBitCol; i++){. 
e810: 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73     if( extraCols
e820: 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29 20   & MASKBIT(i) ) 
e830: 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20  nKeyCol++;.  }. 
e840: 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
e850: 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53  ed & MASKBIT(BMS
e860: 2d 31 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43  -1) ){.    nKeyC
e870: 6f 6c 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43  ol += pTable->nC
e880: 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20  ol - BMS + 1;.  
e890: 7d 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  }.  pLoop->wsFla
e8a0: 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
e8b0: 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f 49 44  MN_EQ | WHERE_ID
e8c0: 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 2f 2a 20 43 6f  X_ONLY;..  /* Co
e8d0: 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65  nstruct the Inde
e8e0: 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65 73 63  x object to desc
e8f0: 72 69 62 65 20 74 68 69 73 20 69 6e 64 65 78 20  ribe this index 
e900: 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69  */.  pIdx = sqli
e910: 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78  te3AllocateIndex
e920: 4f 62 6a 65 63 74 28 70 50 61 72 73 65 2d 3e 64  Object(pParse->d
e930: 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31 2c 20 30 2c  b, nKeyCol+1, 0,
e940: 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69   &zNotUsed);.  i
e950: 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74  f( pIdx==0 ) ret
e960: 75 72 6e 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e  urn;.  pLoop->u.
e970: 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
e980: 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61  Idx;.  pIdx->zNa
e990: 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78  me = "auto-index
e9a0: 22 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c  ";.  pIdx->pTabl
e9b0: 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20  e = pTable;.  n 
e9c0: 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d  = 0;.  idxCols =
e9d0: 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   0;.  for(pTerm=
e9e0: 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
e9f0: 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
ea00: 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
ea10: 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
ea20: 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
ea30: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
ea40: 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
ea50: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
ea60: 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
ea70: 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b  iCol>=BMS ? MASK
ea80: 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53  BIT(BMS-1) : MAS
ea90: 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20  KBIT(iCol);.    
eaa0: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
eab0: 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
eac0: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
ead0: 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66  =BMS );.      if
eae0: 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61  ( (idxCols & cMa
eaf0: 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
eb00: 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
eb10: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
eb20: 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d     idxCols |= cM
eb30: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64  ask;.        pId
eb40: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
eb50: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
eb60: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43  lumn;.        pC
eb70: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  oll = sqlite3Bin
eb80: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
eb90: 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  q(pParse, pX->pL
eba0: 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
ebb0: 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
ebc0: 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41  azColl[n] = ALWA
ebd0: 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c  YS(pColl) ? pCol
ebe0: 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41  l->zName : "BINA
ebf0: 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b  RY";.        n++
ec00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ec10: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75    }.  assert( (u
ec20: 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62  32)n==pLoop->u.b
ec30: 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f  tree.nEq );..  /
ec40: 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c  * Add additional
ec50: 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20   columns needed 
ec60: 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f  to make the auto
ec70: 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f  matic index into
ec80: 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67  .  ** a covering
ec90: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28   index */.  for(
eca0: 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b  i=0; i<mxBitCol;
ecb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65   i++){.    if( e
ecc0: 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42  xtraCols & MASKB
ecd0: 49 54 28 69 29 20 29 7b 0a 20 20 20 20 20 20 70  IT(i) ){.      p
ece0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
ecf0: 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78   = i;.      pIdx
ed00: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42  ->azColl[n] = "B
ed10: 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b  INARY";.      n+
ed20: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  +;.    }.  }.  i
ed30: 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  f( pSrc->colUsed
ed40: 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   & MASKBIT(BMS-1
ed50: 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42  ) ){.    for(i=B
ed60: 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  MS-1; i<pTable->
ed70: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
ed80: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
ed90: 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70  [n] = i;.      p
eda0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
edb0: 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20   "BINARY";.     
edc0: 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n++;.    }.  }.
edd0: 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 4b 65    assert( n==nKe
ede0: 79 43 6f 6c 20 29 3b 0a 20 20 70 49 64 78 2d 3e  yCol );.  pIdx->
edf0: 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 2d 31  aiColumn[n] = -1
ee00: 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  ;.  pIdx->azColl
ee10: 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  [n] = "BINARY";.
ee20: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
ee30: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
ee40: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4c   */.  assert( pL
ee50: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30  evel->iIdxCur>=0
ee60: 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 49   );.  pLevel->iI
ee70: 64 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  dxCur = pParse->
ee80: 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  nTab++;.  sqlite
ee90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
eea0: 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c  P_OpenAutoindex,
eeb0: 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
eec0: 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 3b 0a 20 20  , nKeyCol+1);.  
eed0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
eee0: 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
eef0: 70 49 64 78 29 3b 0a 20 20 56 64 62 65 43 6f 6d  pIdx);.  VdbeCom
ef00: 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72 20 25 73  ment((v, "for %s
ef10: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
ef20: 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74  ));..  /* Fill t
ef30: 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
ef40: 65 78 20 77 69 74 68 20 63 6f 6e 74 65 6e 74 20  ex with content 
ef50: 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73  */.  addrTop = s
ef60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
ef70: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
ef80: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b  Level->iTabCur);
ef90: 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  .  regRecord = s
efa0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
efb0: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
efc0: 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
efd0: 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 64 78  Key(pParse, pIdx
efe0: 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
eff0: 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 30 2c  r, regRecord, 0,
f000: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
f010: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
f020: 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c  dxInsert, pLevel
f030: 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65  ->iIdxCur, regRe
f040: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
f050: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
f060: 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
f070: 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  SULT);.  sqlite3
f080: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f090: 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69  _Next, pLevel->i
f0a0: 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b  TabCur, addrTop+
f0b0: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
f0c0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c  eChangeP5(v, SQL
f0d0: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41  ITE_STMTSTATUS_A
f0e0: 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c  UTOINDEX);.  sql
f0f0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
f100: 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20  (v, addrTop);.  
f110: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
f120: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
f130: 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f  gRecord);.  .  /
f140: 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
f150: 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
f160: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a  itialization */.
f170: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
f180: 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 69  pHere(v, addrIni
f190: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  t);.}.#endif /* 
f1a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
f1b0: 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
f1c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f1d0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
f1e0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
f1f0: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20  and populate an 
f200: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
f210: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74  fo structure. It
f220: 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
f230: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
f240: 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
f250: 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
f260: 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  he structure.** 
f270: 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70  by passing the p
f280: 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
f290: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
f2a0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65   to sqlite3_free
f2b0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ()..*/.static sq
f2c0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
f2d0: 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49   *allocateIndexI
f2e0: 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nfo(.  Parse *pP
f2f0: 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c 61  arse,.  WhereCla
f300: 75 73 65 20 2a 70 57 43 2c 0a 20 20 73 74 72 75  use *pWC,.  stru
f310: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
f320: 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69 73  *pSrc,.  ExprLis
f330: 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20  t *pOrderBy.){. 
f340: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
f350: 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63 74   nTerm;.  struct
f360: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
f370: 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
f380: 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
f390: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
f3a0: 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79  rby *pIdxOrderBy
f3b0: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
f3c0: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
f3d0: 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67  int_usage *pUsag
f3e0: 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  e;.  WhereTerm *
f3f0: 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72  pTerm;.  int nOr
f400: 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65 33  derBy;.  sqlite3
f410: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
f420: 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75  xInfo;..  /* Cou
f430: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
f440: 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20   possible WHERE 
f450: 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
f460: 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20 2a  ts referring.  *
f470: 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74 75 61  * to this virtua
f480: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72  l table */.  for
f490: 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72  (i=nTerm=0, pTer
f4a0: 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
f4b0: 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
f4c0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  rm++){.    if( p
f4d0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
f4e0: 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f   != pSrc->iCurso
f4f0: 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
f500: 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
f510: 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f  rOfTwo(pTerm->eO
f520: 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51  perator & ~WO_EQ
f530: 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74  UIV) );.    test
f540: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
f550: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
f560: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
f570: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f580: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
f590: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
f5a0: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
f5b0: 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75  SNULL) ) continu
f5c0: 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
f5d0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
f5e0: 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  _VNULL ) continu
f5f0: 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a  e;.    nTerm++;.
f600: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
f610: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
f620: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63   contains only c
f630: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75  olumns in the cu
f640: 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74  rrent .  ** virt
f650: 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61  ual table then a
f660: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
f670: 72 20 74 68 65 20 61 4f 72 64 65 72 42 79 20 70  r the aOrderBy p
f680: 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  art of.  ** the 
f690: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
f6a0: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  fo structure..  
f6b0: 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  */.  nOrderBy = 
f6c0: 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  0;.  if( pOrderB
f6d0: 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  y ){.    int n =
f6e0: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
f6f0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
f700: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
f710: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
f720: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
f730: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
f740: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
f750: 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  MN || pExpr->iTa
f760: 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73  ble!=pSrc->iCurs
f770: 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  or ) break;.    
f780: 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b  }.    if( i==n){
f790: 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20  .      nOrderBy 
f7a0: 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = n;.    }.  }..
f7b0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
f7c0: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
f7d0: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  info structure. 
f7e0: 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d   */.  pIdxInfo =
f7f0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
f800: 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
f810: 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66   sizeof(*pIdxInf
f820: 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o).             
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
f840: 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e  (sizeof(*pIdxCon
f850: 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73  s) + sizeof(*pUs
f860: 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20  age))*nTerm.    
f870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f880: 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
f890: 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f  *pIdxOrderBy)*nO
f8a0: 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20  rderBy );.  if( 
f8b0: 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pIdxInfo==0 ){. 
f8c0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
f8d0: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20  sg(pParse, "out 
f8e0: 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20  of memory");.   
f8f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
f900: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
f910: 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  the structure.  
f920: 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  The sqlite3_inde
f930: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
f940: 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d   contains.  ** m
f950: 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74 20  any fields that 
f960: 61 72 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f  are declared "co
f970: 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20  nst" to prevent 
f980: 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a  xBestIndex from.
f990: 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68    ** changing th
f9a0: 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  em.  We have to 
f9b0: 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61  do some funky ca
f9c0: 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74  sting in order t
f9d0: 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  o.  ** initializ
f9e0: 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a  e those fields..
f9f0: 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20    */.  pIdxCons 
fa00: 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
fa10: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
fa20: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d  nt*)&pIdxInfo[1]
fa30: 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79 20  ;.  pIdxOrderBy 
fa40: 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
fa50: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a  3_index_orderby*
fa60: 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d  )&pIdxCons[nTerm
fa70: 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73  ];.  pUsage = (s
fa80: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
fa90: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
faa0: 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72  sage*)&pIdxOrder
fab0: 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20  By[nOrderBy];.  
fac0: 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  *(int*)&pIdxInfo
fad0: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  ->nConstraint = 
fae0: 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29  nTerm;.  *(int*)
faf0: 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65  &pIdxInfo->nOrde
fb00: 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a  rBy = nOrderBy;.
fb10: 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
fb20: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
fb30: 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
fb40: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70  >aConstraint = p
fb50: 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72  IdxCons;.  *(str
fb60: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
fb70: 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64  x_orderby**)&pId
fb80: 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20  xInfo->aOrderBy 
fb90: 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20  = pIdxOrderBy;. 
fba0: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
fbb0: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
fbc0: 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78  nt_usage**)&pIdx
fbd0: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
fbe0: 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20  tUsage =.       
fbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 70 55 73 61              pUsa
fc30: 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  ge;..  for(i=j=0
fc40: 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
fc50: 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
fc60: 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
fc70: 20 75 38 20 6f 70 3b 0a 20 20 20 20 69 66 28 20   u8 op;.    if( 
fc80: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
fc90: 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  r != pSrc->iCurs
fca0: 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  or ) continue;. 
fcb0: 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77     assert( IsPow
fcc0: 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65  erOfTwo(pTerm->e
fcd0: 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45  Operator & ~WO_E
fce0: 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73  QUIV) );.    tes
fcf0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
fd00: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
fd10: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
fd20: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
fd30: 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
fd40: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
fd50: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
fd60: 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e  ISNULL) ) contin
fd70: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
fd80: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
fd90: 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
fda0: 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  ue;.    pIdxCons
fdb0: 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54  [j].iColumn = pT
fdc0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
fdd0: 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  n;.    pIdxCons[
fde0: 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d  j].iTermOffset =
fdf0: 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75 38   i;.    op = (u8
fe00: 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  )pTerm->eOperato
fe10: 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20  r & WO_ALL;.    
fe20: 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20  if( op==WO_IN ) 
fe30: 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20  op = WO_EQ;.    
fe40: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
fe50: 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20   op;.    /* The 
fe60: 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e  direct assignmen
fe70: 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
fe80: 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62  s line is possib
fe90: 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a  le only because.
fea0: 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61      ** the WO_ a
feb0: 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  nd SQLITE_INDEX_
fec0: 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65  CONSTRAINT_ code
fed0: 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  s are identical.
fee0: 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c    The.    ** fol
fef0: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76  lowing asserts v
ff00: 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e  erify this fact.
ff10: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
ff20: 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_EQ==SQLITE_IN
ff30: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
ff40: 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Q );.    assert(
ff50: 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_LT==SQLITE_I
ff60: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
ff70: 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LT );.    assert
ff80: 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_LE==SQLITE_
ff90: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
ffa0: 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LE );.    asser
ffb0: 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45  t( WO_GT==SQLITE
ffc0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
ffd0: 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65  T_GT );.    asse
ffe0: 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54  rt( WO_GE==SQLIT
fff0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
10000 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73  NT_GE );.    ass
10010 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53  ert( WO_MATCH==S
10020 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
10030 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a  TRAINT_MATCH );.
10040 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
10050 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
10060 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c  WO_IN|WO_EQ|WO_L
10070 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
10080 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b  _GE|WO_MATCH) );
10090 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
100a0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
100b0 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  rBy; i++){.    E
100c0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
100d0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
100e0 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72  r;.    pIdxOrder
100f0 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20  By[i].iColumn = 
10100 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
10110 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
10120 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72  i].desc = pOrder
10130 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
10140 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  er;.  }..  retur
10150 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f  n pIdxInfo;.}../
10160 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f  *.** The table o
10170 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20  bject reference 
10180 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
10190 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
101a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
101b0 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74  * must represent
101c0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
101d0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
101e0 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73  invokes the xBes
101f0 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68  tIndex().** meth
10200 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  od of the virtua
10210 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  l table with the
10220 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
10230 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  nfo object that.
10240 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74  ** comes in as t
10250 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20  he 3rd argument 
10260 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
10270 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
10280 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72  ror occurs, pPar
10290 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  se is populated 
102a0 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65  with an error me
102b0 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e  ssage and a.** n
102c0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73  on-zero value is
102d0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
102e0 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72  wise, 0 is retur
102f0 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70  ned and the outp
10300 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  ut.** part of th
10310 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
10320 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
10330 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64  s left populated
10340 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20  ..**.** Whether 
10350 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20  or not an error 
10360 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20  is returned, it 
10370 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
10380 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20  ility of the.** 
10390 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
103a0 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78  ally free p->idx
103b0 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f  Str if p->needTo
103c0 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69 63  FreeIdxStr indic
103d0 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69  ates.** that thi
103e0 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  s is required..*
103f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61  /.static int vta
10400 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73 65  bBestIndex(Parse
10410 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
10420 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69  *pTab, sqlite3_i
10430 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
10440 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
10450 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65  Vtab = sqlite3Ge
10460 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  tVTable(pParse->
10470 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62  db, pTab)->pVtab
10480 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
10490 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44   rc;..  TRACE_ID
104a0 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72  X_INPUTS(p);.  r
104b0 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  c = pVtab->pModu
104c0 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70  le->xBestIndex(p
104d0 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43  Vtab, p);.  TRAC
104e0 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29  E_IDX_OUTPUTS(p)
104f0 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  ;..  if( rc!=SQL
10500 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
10510 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
10520 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  EM ){.      pPar
10530 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
10540 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  iled = 1;.    }e
10550 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e  lse if( !pVtab->
10560 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
10570 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10580 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73  (pParse, "%s", s
10590 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
105a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
105b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
105c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
105d0 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  , pVtab->zErrMsg
105e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
105f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
10600 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  b->zErrMsg);.  p
10610 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
10620 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0;..  for(i=0; i
10630 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
10640 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   i++){.    if( !
10650 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
10660 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61  ].usable && p->a
10670 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
10680 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29  i].argvIndex>0 )
10690 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
106a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
106b0 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c  .          "tabl
106c0 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78  e %s: xBestIndex
106d0 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76   returned an inv
106e0 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62  alid plan", pTab
106f0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
10700 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50    }..  return pP
10710 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65  arse->nErr;.}.#e
10720 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
10730 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
10740 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 0a  TUALTABLE) */...
10750 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10760 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
10770 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT4./*.** Estima
10780 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  te the location 
10790 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  of a particular 
107a0 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65  key among all ke
107b0 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65  ys in an.** inde
107c0 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65  x.  Store the re
107d0 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61  sults in aStat a
107e0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
107f0 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20      aStat[0]    
10800 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66    Est. number of
10810 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20   rows less than 
10820 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74  pVal.**    aStat
10830 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75  [1]      Est. nu
10840 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75  mber of rows equ
10850 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a  al to pVal.**.**
10860 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
10870 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f  K on success..*/
10880 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
10890 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61  reKeyStats(.  Pa
108a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
108b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
108c0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
108d0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
108e0 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
108f0 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f    /* Index to co
10900 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66  nsider domain of
10910 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
10920 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20  cord *pRec,     
10930 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76    /* Vector of v
10940 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65  alues to conside
10950 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64  r */.  int round
10960 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Up,             
10970 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69     /* Round up i
10980 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64  f true.  Round d
10990 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a  own if false */.
109a0 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74    tRowcnt *aStat
109b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
109c0 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74   OUT: stats writ
109d0 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
109e0 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53   IndexSample *aS
109f0 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53  ample = pIdx->aS
10a00 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f  ample;.  int iCo
10a10 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
10a20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
10a30 20 72 65 71 75 69 72 65 64 20 73 74 61 74 73 20   required stats 
10a40 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a  in anEq[] etc. *
10a50 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30  /.  int iMin = 0
10a60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10a70 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70  /* Smallest samp
10a80 6c 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65  le not yet teste
10a90 64 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  d */.  int i = p
10aa0 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 20 20  Idx->nSample;   
10ab0 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73     /* Smallest s
10ac0 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61  ample larger tha
10ad0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52  n or equal to pR
10ae0 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73  ec */.  int iTes
10af0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
10b00 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70      /* Next samp
10b10 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20  le to test */.  
10b20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20  int res;        
10b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10b40 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
10b50 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  son operation */
10b60 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10b70 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f  _DEBUG.  UNUSED_
10b80 50 41 52 41 4d 45 54 45 52 28 20 70 50 61 72 73  PARAMETER( pPars
10b90 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  e );.#endif.  as
10ba0 73 65 72 74 28 20 70 52 65 63 21 3d 30 20 7c 7c  sert( pRec!=0 ||
10bb0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
10bc0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
10bd0 66 28 20 70 52 65 63 3d 3d 30 20 29 20 72 65 74  f( pRec==0 ) ret
10be0 75 72 6e 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 52  urn;.  iCol = pR
10bf0 65 63 2d 3e 6e 46 69 65 6c 64 20 2d 20 31 3b 0a  ec->nField - 1;.
10c00 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
10c10 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61  nSample>0 );.  a
10c20 73 73 65 72 74 28 20 70 52 65 63 2d 3e 6e 46 69  ssert( pRec->nFi
10c30 65 6c 64 3e 30 20 26 26 20 69 43 6f 6c 3c 70 49  eld>0 && iCol<pI
10c40 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29  dx->nSampleCol )
10c50 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 54 65 73  ;.  do{.    iTes
10c60 74 20 3d 20 28 69 4d 69 6e 2b 69 29 2f 32 3b 0a  t = (iMin+i)/2;.
10c70 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
10c80 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
10c90 72 65 28 61 53 61 6d 70 6c 65 5b 69 54 65 73 74  re(aSample[iTest
10ca0 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 54 65  ].n, aSample[iTe
10cb0 73 74 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20  st].p, pRec);.  
10cc0 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
10cd0 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73       iMin = iTes
10ce0 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  t+1;.    }else{.
10cf0 20 20 20 20 20 20 69 20 3d 20 69 54 65 73 74 3b        i = iTest;
10d00 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
10d10 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 20 29   res && iMin<i )
10d20 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
10d30 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
10d40 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
10d50 20 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63   statements chec
10d60 6b 20 74 68 61 74 20 74 68 65 20 62 69 6e 61 72  k that the binar
10d70 79 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20  y search code.  
10d80 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74  ** above found t
10d90 68 65 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e  he right answer.
10da0 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
10db0 65 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74  es no purpose ot
10dc0 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f  her.  ** than to
10dd0 20 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65   invoke the asse
10de0 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72  rts.  */.  if( r
10df0 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  es==0 ){.    /* 
10e00 49 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74  If (res==0) is t
10e10 72 75 65 2c 20 74 68 65 6e 20 73 61 6d 70 6c 65  rue, then sample
10e20 20 24 69 20 6d 75 73 74 20 62 65 20 65 71 75 61   $i must be equa
10e30 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 20  l to pRec */.   
10e40 20 61 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d   assert( i<pIdx-
10e50 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20  >nSample );.    
10e60 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
10e70 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
10e80 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  are(aSample[i].n
10e90 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20  , aSample[i].p, 
10ea0 70 52 65 63 29 0a 20 20 20 20 20 20 20 20 20 7c  pRec).         |
10eb0 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
10ec0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
10ed0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74  }else{.    /* Ot
10ee0 68 65 72 77 69 73 65 2c 20 70 52 65 63 20 6d 75  herwise, pRec mu
10ef0 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  st be smaller th
10f00 61 6e 20 73 61 6d 70 6c 65 20 24 69 20 61 6e 64  an sample $i and
10f10 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20 20 20   larger than.   
10f20 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24 69 2d 31   ** sample ($i-1
10f30 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ).  */.    asser
10f40 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  t( i==pIdx->nSam
10f50 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ple .         ||
10f60 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
10f70 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
10f80 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  e[i].n, aSample[
10f90 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20 20  i].p, pRec)>0.  
10fa0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
10fb0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
10fc0 65 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ed );.    assert
10fd0 28 20 69 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ( i==0.         
10fe0 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  || sqlite3VdbeRe
10ff0 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
11000 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d  ple[i-1].n, aSam
11010 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63  ple[i-1].p, pRec
11020 29 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  )<0.         || 
11030 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
11040 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7d 0a  ocFailed );.  }.
11050 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20  #endif /* ifdef 
11060 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
11070 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
11080 69 6e 74 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 20  int, aSample[i] 
11090 69 73 20 74 68 65 20 66 69 72 73 74 20 73 61 6d  is the first sam
110a0 70 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ple that is grea
110b0 74 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 6f 72  ter than.  ** or
110c0 20 65 71 75 61 6c 20 74 6f 20 70 56 61 6c 2e 20   equal to pVal. 
110d0 20 4f 72 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e   Or if i==pIdx->
110e0 6e 53 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 6c  nSample, then al
110f0 6c 20 73 61 6d 70 6c 65 73 20 61 72 65 20 6c 65  l samples are le
11100 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 70 56 61  ss.  ** than pVa
11110 6c 2e 20 20 49 66 20 61 53 61 6d 70 6c 65 5b 69  l.  If aSample[i
11120 5d 3d 3d 70 56 61 6c 2c 20 74 68 65 6e 20 72 65  ]==pVal, then re
11130 73 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  s==0..  */.  if(
11140 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 61   res==0 ){.    a
11150 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c  Stat[0] = aSampl
11160 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b  e[i].anLt[iCol];
11170 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
11180 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b  aSample[i].anEq[
11190 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iCol];.  }else{.
111a0 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77      tRowcnt iLow
111b0 65 72 2c 20 69 55 70 70 65 72 2c 20 69 47 61 70  er, iUpper, iGap
111c0 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29  ;.    if( i==0 )
111d0 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d  {.      iLower =
111e0 20 30 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72   0;.      iUpper
111f0 20 3d 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 61 6e   = aSample[0].an
11200 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 65  Lt[iCol];.    }e
11210 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70 70 65  lse{.      iUppe
11220 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61  r = i>=pIdx->nSa
11230 6d 70 6c 65 20 3f 20 70 49 64 78 2d 3e 61 69 52  mple ? pIdx->aiR
11240 6f 77 45 73 74 5b 30 5d 20 3a 20 61 53 61 6d 70  owEst[0] : aSamp
11250 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d  le[i].anLt[iCol]
11260 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d  ;.      iLower =
11270 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 61 6e   aSample[i-1].an
11280 45 71 5b 69 43 6f 6c 5d 20 2b 20 61 53 61 6d 70  Eq[iCol] + aSamp
11290 6c 65 5b 69 2d 31 5d 2e 61 6e 4c 74 5b 69 43 6f  le[i-1].anLt[iCo
112a0 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53  l];.    }.    aS
112b0 74 61 74 5b 31 5d 20 3d 20 28 70 49 64 78 2d 3e  tat[1] = (pIdx->
112c0 6e 4b 65 79 43 6f 6c 3e 69 43 6f 6c 20 3f 20 70  nKeyCol>iCol ? p
112d0 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f 6c  Idx->aAvgEq[iCol
112e0 5d 20 3a 20 31 29 3b 0a 20 20 20 20 69 66 28 20  ] : 1);.    if( 
112f0 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29  iLower>=iUpper )
11300 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 30  {.      iGap = 0
11310 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11320 20 20 20 69 47 61 70 20 3d 20 69 55 70 70 65 72     iGap = iUpper
11330 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d   - iLower;.    }
11340 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70  .    if( roundUp
11350 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d   ){.      iGap =
11360 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20   (iGap*2)/3;.   
11370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
11380 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20  ap = iGap/3;.   
11390 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20   }.    aStat[0] 
113a0 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b  = iLower + iGap;
113b0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
113c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
113d0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
113e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
113f0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
11400 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
11410 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
11420 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65  t will be visite
11430 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67  d.** by scanning
11440 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20   an index for a 
11450 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e  range of values.
11460 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68   The range may h
11470 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20  ave an upper.** 
11480 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62  bound, a lower b
11490 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54  ound, or both. T
114a0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
114b0 74 65 72 6d 73 20 74 68 61 74 20 73 65 74 20 74  terms that set t
114c0 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20  he upper.** and 
114d0 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65  lower bounds are
114e0 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20   represented by 
114f0 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
11500 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  r respectively. 
11510 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
11520 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e  assuming that in
11530 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61  dex p is on t1(a
11540 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  ):.**.**   ... F
11550 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e  ROM t1 WHERE a >
11560 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e   ? AND a < ? ...
11570 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11580 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20         |_____|  
11590 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20   |_____|.**     
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115b0 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a    |         |.**
115c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115d0 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70       pLower    p
115e0 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65  Upper.**.** If e
115f0 69 74 68 65 72 20 6f 66 20 74 68 65 20 75 70 70  ither of the upp
11600 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e  er or lower boun
11610 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  d is not present
11620 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70  , then NULL is p
11630 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63  assed in.** plac
11640 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70  e of the corresp
11650 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d  onding WhereTerm
11660 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
11670 65 20 69 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e  e in (pBuilder->
11680 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
11690 71 29 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  q) is the index 
116a0 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  of the index.** 
116b0 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74  column subject t
116c0 6f 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73  o the range cons
116d0 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69  traint. Or, equi
116e0 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75  valently, the nu
116f0 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 71 75 61 6c  mber of.** equal
11700 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
11710 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65  optimized by the
11720 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20   proposed index 
11730 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c  scan. For exampl
11740 65 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20 69  e,.** assuming i
11750 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28  ndex p is on t1(
11760 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53  a, b), and the S
11770 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  QL query is:.**.
11780 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
11790 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44   WHERE a = ? AND
117a0 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f   b > ? AND b < ?
117b0 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   ....**.** then 
117c0 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20 31 20  nEq is set to 1 
117d0 28 61 73 20 74 68 65 20 72 61 6e 67 65 20 72 65  (as the range re
117e0 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c  stricted column,
117f0 20 62 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e   b, is the secon
11800 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  d .** left-most 
11810 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
11820 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65  dex). Or, if the
11830 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
11840 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
11850 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61  HERE a > ? AND a
11860 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74   < ? ....**.** t
11870 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74  hen nEq is set t
11880 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  o 0..**.** When 
11890 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
118a0 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74 20   called, *pnOut 
118b0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 71  is set to the sq
118c0 6c 69 74 65 33 4c 6f 67 45 73 74 28 29 20 6f 66  lite3LogEst() of
118d0 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
118e0 66 20 72 6f 77 73 20 74 68 61 74 20 74 68 65 20  f rows that the 
118f0 69 6e 64 65 78 20 73 63 61 6e 20 69 73 20 65 78  index scan is ex
11900 70 65 63 74 65 64 20 74 6f 20 76 69 73 69 74 20  pected to visit 
11910 77 69 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73  without .** cons
11920 69 64 65 72 69 6e 67 20 74 68 65 20 72 61 6e 67  idering the rang
11930 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49  e constraints. I
11940 66 20 6e 45 71 20 69 73 20 30 2c 20 74 68 69 73  f nEq is 0, this
11950 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
11960 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68  f .** rows in th
11970 65 20 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e  e index. Assumin
11980 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  g no error occur
11990 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a  s, *pnOut is adj
119a0 75 73 74 65 64 20 28 72 65 64 75 63 65 64 29 0a  usted (reduced).
119b0 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  ** to account fo
119c0 72 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 74  r the range cont
119d0 72 61 69 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e  raints pLower an
119e0 64 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a  d pUpper..** .**
119f0 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20   In the absence 
11a00 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20  of sqlite_stat4 
11a10 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72  ANALYZE data, or
11a20 20 69 66 20 73 75 63 68 20 64 61 74 61 20 63 61   if such data ca
11a30 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c  nnot be.** used,
11a40 20 65 61 63 68 20 72 61 6e 67 65 20 69 6e 65 71   each range ineq
11a50 75 61 6c 69 74 79 20 72 65 64 75 63 65 73 20 74  uality reduces t
11a60 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
11a70 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 34  by a factor of 4
11a80 2e 20 0a 2a 2a 20 48 65 6e 63 65 20 61 20 70 61  . .** Hence a pa
11a90 69 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74  ir of constraint
11aa0 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20  s (x>? AND x<?) 
11ab0 72 65 64 75 63 65 73 20 74 68 65 20 65 78 70 65  reduces the expe
11ac0 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a  cted number of.*
11ad0 2a 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62  * rows visited b
11ae0 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 31 36  y a factor of 16
11af0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11b00 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
11b10 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
11b20 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
11b30 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
11b40 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
11b50 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
11b60 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
11b70 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f    WhereTerm *pLo
11b80 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20  wer,   /* Lower 
11b90 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
11ba0 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20  ge. ex: "x>123" 
11bb0 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
11bc0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55  .  WhereTerm *pU
11bd0 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72  pper,   /* Upper
11be0 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
11bf0 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22  nge. ex: "x<455"
11c00 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
11c10 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
11c20 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69  Loop     /* Modi
11c30 66 79 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64  fy the .nOut and
11c40 20 6d 61 79 62 65 20 2e 72 52 75 6e 20 66 69 65   maybe .rRun fie
11c50 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lds */.){.  int 
11c60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11c70 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f    int nOut = pLo
11c80 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45  op->nOut;.  LogE
11c90 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66  st nNew;..#ifdef
11ca0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
11cb0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
11cc0 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70  Index *p = pLoop
11cd0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
11ce0 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c  ;.  int nEq = pL
11cf0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
11d00 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d  ;..  if( p->nSam
11d10 70 6c 65 3e 30 0a 20 20 20 26 26 20 6e 45 71 3d  ple>0.   && nEq=
11d20 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56  =pBuilder->nRecV
11d30 61 6c 69 64 0a 20 20 20 26 26 20 6e 45 71 3c 70  alid.   && nEq<p
11d40 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20  ->nSampleCol.   
11d50 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
11d60 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64  nabled(pParse->d
11d70 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74 33 29  b, SQLITE_Stat3)
11d80 20 0a 20 20 29 7b 0a 20 20 20 20 55 6e 70 61 63   .  ){.    Unpac
11d90 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20  kedRecord *pRec 
11da0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63  = pBuilder->pRec
11db0 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b  ;.    tRowcnt a[
11dc0 32 5d 3b 0a 20 20 20 20 75 38 20 61 66 66 3b 0a  2];.    u8 aff;.
11dd0 0a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  .    /* Variable
11de0 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62 65 20   iLower will be 
11df0 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d  set to the estim
11e00 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
11e10 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a 20 20  r of rows in .  
11e20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74    ** the index t
11e30 68 61 74 20 61 72 65 20 6c 65 73 73 20 74 68 61  hat are less tha
11e40 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e  n the lower boun
11e50 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71  d of the range q
11e60 75 65 72 79 2e 20 54 68 65 0a 20 20 20 20 2a 2a  uery. The.    **
11e70 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62 65 69   lower bound bei
11e80 6e 67 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61  ng the concatena
11e90 74 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64 20 24  tion of $P and $
11ea0 4c 2c 20 77 68 65 72 65 20 24 50 20 69 73 20 74  L, where $P is t
11eb0 68 65 0a 20 20 20 20 2a 2a 20 6b 65 79 2d 70 72  he.    ** key-pr
11ec0 65 66 69 78 20 66 6f 72 6d 65 64 20 62 79 20 74  efix formed by t
11ed0 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20 6d 61  he nEq values ma
11ee0 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 74 68  tched against th
11ef0 65 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73 74 0a  e nEq left-most.
11f00 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f      ** columns o
11f10 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64  f the index, and
11f20 20 24 4c 20 69 73 20 74 68 65 20 76 61 6c 75 65   $L is the value
11f30 20 69 6e 20 70 4c 6f 77 65 72 2e 0a 20 20 20 20   in pLower..    
11f40 2a 2a 0a 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66  **.    ** Or, if
11f50 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20   pLower is NULL 
11f60 6f 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20  or $L cannot be 
11f70 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69  extracted from i
11f80 74 20 28 62 65 63 61 75 73 65 20 69 74 0a 20 20  t (because it.  
11f90 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 69    ** is not a si
11fa0 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f 72  mple variable or
11fb0 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29 2c   literal value),
11fc0 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
11fd0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   of the.    ** r
11fe0 61 6e 67 65 20 69 73 20 24 50 2e 20 44 75 65 20  ange is $P. Due 
11ff0 74 6f 20 61 20 71 75 69 72 6b 20 69 6e 20 74 68  to a quirk in th
12000 65 20 77 61 79 20 77 68 65 72 65 4b 65 79 53 74  e way whereKeySt
12010 61 74 73 28 29 20 77 6f 72 6b 73 2c 20 65 76 65  ats() works, eve
12020 6e 0a 20 20 20 20 2a 2a 20 69 66 20 24 4c 20 69  n.    ** if $L i
12030 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 77 68 65  s available, whe
12040 72 65 4b 65 79 53 74 61 74 73 28 29 20 69 73 20  reKeyStats() is 
12050 63 61 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68 20  called for both 
12060 28 24 50 29 20 61 6e 64 20 0a 20 20 20 20 2a 2a  ($P) and .    **
12070 20 28 24 50 3a 24 4c 29 20 61 6e 64 20 74 68 65   ($P:$L) and the
12080 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 74   larger of the t
12090 77 6f 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  wo returned valu
120a0 65 73 20 75 73 65 64 2e 0a 20 20 20 20 2a 2a 0a  es used..    **.
120b0 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79      ** Similarly
120c0 2c 20 69 55 70 70 65 72 20 69 73 20 74 6f 20 62  , iUpper is to b
120d0 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74  e set to the est
120e0 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
120f0 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20  ber of rows.    
12100 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ** less than the
12110 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20   upper bound of 
12120 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
12130 20 57 68 65 72 65 20 74 68 65 20 75 70 70 65 72   Where the upper
12140 20 62 6f 75 6e 64 0a 20 20 20 20 2a 2a 20 69 73   bound.    ** is
12150 20 65 69 74 68 65 72 20 28 24 50 29 20 6f 72 20   either ($P) or 
12160 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20  ($P:$U). Again, 
12170 65 76 65 6e 20 69 66 20 24 55 20 69 73 20 61 76  even if $U is av
12180 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76 61  ailable, both va
12190 6c 75 65 73 0a 20 20 20 20 2a 2a 20 6f 66 20 69  lues.    ** of i
121a0 55 70 70 65 72 20 61 72 65 20 72 65 71 75 65 73  Upper are reques
121b0 74 65 64 20 6f 66 20 77 68 65 72 65 4b 65 79 53  ted of whereKeyS
121c0 74 61 74 73 28 29 20 61 6e 64 20 74 68 65 20 73  tats() and the s
121d0 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20 20 20  maller used..   
121e0 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74 20   */.    tRowcnt 
121f0 69 4c 6f 77 65 72 3b 0a 20 20 20 20 74 52 6f 77  iLower;.    tRow
12200 63 6e 74 20 69 55 70 70 65 72 3b 0a 0a 20 20 20  cnt iUpper;..   
12210 20 69 66 28 20 6e 45 71 3d 3d 70 2d 3e 6e 4b 65   if( nEq==p->nKe
12220 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 61 66  yCol ){.      af
12230 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  f = SQLITE_AFF_I
12240 4e 54 45 47 45 52 3b 0a 20 20 20 20 7d 65 6c 73  NTEGER;.    }els
12250 65 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 70  e{.      aff = p
12260 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70  ->pTable->aCol[p
12270 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d  ->aiColumn[nEq]]
12280 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 7d  .affinity;.    }
12290 0a 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  .    /* Determin
122a0 65 20 69 4c 6f 77 65 72 20 61 6e 64 20 69 55 70  e iLower and iUp
122b0 70 65 72 20 75 73 69 6e 67 20 28 24 50 29 20 6f  per using ($P) o
122c0 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  nly. */.    if( 
122d0 6e 45 71 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nEq==0 ){.      
122e0 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20  iLower = 0;.    
122f0 20 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 61 69    iUpper = p->ai
12300 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 7d  RowEst[0];.    }
12310 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  else{.      /* N
12320 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c 20 63  ote: this call c
12330 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69 7a 65  ould be optimize
12340 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65 20 74  d away - since t
12350 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73 20 6d  he same values m
12360 75 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 68 61  ust .      ** ha
12370 76 65 20 62 65 65 6e 20 72 65 71 75 65 73 74 65  ve been requeste
12380 64 20 77 68 65 6e 20 74 65 73 74 69 6e 67 20 6b  d when testing k
12390 65 79 20 24 50 20 69 6e 20 77 68 65 72 65 45 71  ey $P in whereEq
123a0 75 61 6c 53 63 61 6e 45 73 74 28 29 2e 20 20 2a  ualScanEst().  *
123b0 2f 0a 20 20 20 20 20 20 77 68 65 72 65 4b 65 79  /.      whereKey
123c0 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
123d0 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20   pRec, 0, a);.  
123e0 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30      iLower = a[0
123f0 5d 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20  ];.      iUpper 
12400 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20  = a[0] + a[1];. 
12410 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
12420 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76  possible, improv
12430 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72 20  e on the iLower 
12440 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28  estimate using (
12450 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 69  $P:$L). */.    i
12460 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20  f( pLower ){.   
12470 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20     int bOk;     
12480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12490 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65 20  * True if value 
124a0 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
124b0 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20  m pExpr */.     
124c0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
124d0 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Lower->pExpr->pR
124e0 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65  ight;.      asse
124f0 72 74 28 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70  rt( (pLower->eOp
12500 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c  erator & (WO_GT|
12510 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20  WO_GE))!=0 );.  
12520 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12530 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c  Stat4ProbeSetVal
12540 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70  ue(pParse, p, &p
12550 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c  Rec, pExpr, aff,
12560 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20   nEq, &bOk);.   
12570 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12580 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20  E_OK && bOk ){. 
12590 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69         tRowcnt i
125a0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 77 68 65  New;.        whe
125b0 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
125c0 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61  e, p, pRec, 0, a
125d0 29 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 77 20  );.        iNew 
125e0 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65  = a[0] + ((pLowe
125f0 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  r->eOperator & W
12600 4f 5f 47 54 29 20 3f 20 61 5b 31 5d 20 3a 20 30  O_GT) ? a[1] : 0
12610 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
12620 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c 6f  New>iLower ) iLo
12630 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20  wer = iNew;.    
12640 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20      nOut--;.    
12650 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
12660 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  * If possible, i
12670 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 55  mprove on the iU
12680 70 70 65 72 20 65 73 74 69 6d 61 74 65 20 75 73  pper estimate us
12690 69 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a 2f 0a  ing ($P:$U). */.
126a0 20 20 20 20 69 66 28 20 70 55 70 70 65 72 20 29      if( pUpper )
126b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b  {.      int bOk;
126c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126d0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 76      /* True if v
126e0 61 6c 75 65 20 69 73 20 65 78 74 72 61 63 74 65  alue is extracte
126f0 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a  d from pExpr */.
12700 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
12710 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70  r = pUpper->pExp
12720 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
12730 20 61 73 73 65 72 74 28 20 28 70 55 70 70 65 72   assert( (pUpper
12740 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
12750 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20  O_LT|WO_LE))!=0 
12760 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
12770 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
12780 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  etValue(pParse, 
12790 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c  p, &pRec, pExpr,
127a0 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29   aff, nEq, &bOk)
127b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
127c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b  SQLITE_OK && bOk
127d0 20 29 7b 0a 20 20 20 20 20 20 20 20 74 52 6f 77   ){.        tRow
127e0 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  cnt iNew;.      
127f0 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28    whereKeyStats(
12800 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
12810 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20   1, a);.        
12820 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28  iNew = a[0] + ((
12830 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pUpper->eOperato
12840 72 20 26 20 57 4f 5f 4c 45 29 20 3f 20 61 5b 31  r & WO_LE) ? a[1
12850 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ] : 0);.        
12860 69 66 28 20 69 4e 65 77 3c 69 55 70 70 65 72 20  if( iNew<iUpper 
12870 29 20 69 55 70 70 65 72 20 3d 20 69 4e 65 77 3b  ) iUpper = iNew;
12880 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b  .        nOut--;
12890 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
128a0 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52      pBuilder->pR
128b0 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20 20 69  ec = pRec;.    i
128c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
128d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 55   ){.      if( iU
128e0 70 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b 0a 20  pper>iLower ){. 
128f0 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 73 71         nNew = sq
12900 6c 69 74 65 33 4c 6f 67 45 73 74 28 69 55 70 70  lite3LogEst(iUpp
12910 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20  er - iLower);.  
12920 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12930 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20 20 20     nNew = 10;   
12940 20 20 20 20 20 61 73 73 65 72 74 28 20 31 30 3d       assert( 10=
12950 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
12960 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
12970 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74     if( nNew<nOut
12980 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74   ){.        nOut
12990 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d   = nNew;.      }
129a0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  .      pLoop->nO
129b0 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75  ut = (LogEst)nOu
129c0 74 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  t;.      WHERETR
129d0 41 43 45 28 30 78 31 30 2c 20 28 22 72 61 6e 67  ACE(0x10, ("rang
129e0 65 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20  e scan regions: 
129f0 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e  %u..%u  est=%d\n
12a00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
12a10 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32              (u32
12a20 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55  )iLower, (u32)iU
12a30 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20  pper, nOut));.  
12a40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12a50 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
12a60 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
12a70 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29  ARAMETER(pParse)
12a80 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
12a90 45 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b 0a  ETER(pBuilder);.
12aa0 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
12ab0 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65   pLower || pUppe
12ac0 72 20 29 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  r );.  /* TUNING
12ad0 3a 20 20 45 61 63 68 20 69 6e 65 71 75 61 6c 69  :  Each inequali
12ae0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65  ty constraint re
12af0 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68  duces the search
12b00 20 73 70 61 63 65 20 34 2d 66 6f 6c 64 2e 0a 20   space 4-fold.. 
12b10 20 2a 2a 20 41 20 42 45 54 57 45 45 4e 20 6f 70   ** A BETWEEN op
12b20 65 72 61 74 6f 72 2c 20 74 68 65 72 65 66 6f 72  erator, therefor
12b30 65 2c 20 72 65 64 75 63 65 73 20 74 68 65 20 73  e, reduces the s
12b40 65 61 72 63 68 20 73 70 61 63 65 20 31 36 2d 66  earch space 16-f
12b50 6f 6c 64 20 2a 2f 0a 20 20 6e 4e 65 77 20 3d 20  old */.  nNew = 
12b60 6e 4f 75 74 3b 0a 20 20 69 66 28 20 70 4c 6f 77  nOut;.  if( pLow
12b70 65 72 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e 77  er && (pLower->w
12b80 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
12b90 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  ULL)==0 ){.    n
12ba0 4e 65 77 20 2d 3d 20 32 30 3b 20 20 20 20 20 20  New -= 20;      
12bb0 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71    assert( 20==sq
12bc0 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29  lite3LogEst(4) )
12bd0 3b 0a 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20  ;.    nOut--;.  
12be0 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72 20 29  }.  if( pUpper )
12bf0 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20 32 30  {.    nNew -= 20
12c00 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  ;        assert(
12c10 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   20==sqlite3LogE
12c20 73 74 28 34 29 20 29 3b 0a 20 20 20 20 6e 4f 75  st(4) );.    nOu
12c30 74 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  t--;.  }.  if( n
12c40 4e 65 77 3c 31 30 20 29 20 6e 4e 65 77 20 3d 20  New<10 ) nNew = 
12c50 31 30 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 6e  10;.  if( nNew<n
12c60 4f 75 74 20 29 20 6e 4f 75 74 20 3d 20 6e 4e 65  Out ) nOut = nNe
12c70 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  w;.  pLoop->nOut
12c80 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74 3b   = (LogEst)nOut;
12c90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12ca0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
12cb0 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
12cc0 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT4./*.** Estim
12cd0 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
12ce0 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
12cf0 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73   be returned bas
12d00 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61  ed on.** an equa
12d10 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
12d20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65 72  x=VALUE and wher
12d30 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63 63  e that VALUE occ
12d40 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69  urs in.** the hi
12d50 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20 54  stogram data.  T
12d60 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77  his only works w
12d70 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65 66  hen x is the lef
12d80 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e  t-most.** column
12d90 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e 64   of an index and
12da0 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69   sqlite_stat3 hi
12db0 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20  stogram data is 
12dc0 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72  available.** for
12dd0 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57 68   that index.  Wh
12de0 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74  en pExpr==NULL t
12df0 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 6f  hat means the co
12e00 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22  nstraint is.** "
12e10 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65  x IS NULL" inste
12e20 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e  ad of "x=VALUE".
12e30 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
12e40 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63   estimated row c
12e50 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77  ount into *pnRow
12e60 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
12e70 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e  TE_OK. .** If un
12e80 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20  able to make an 
12e90 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20  estimate, leave 
12ea0 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64  *pnRow unchanged
12eb0 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e   and return.** n
12ec0 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  on-zero..**.** T
12ed0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
12ee0 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e  fail if it is un
12ef0 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63  able to load a c
12f00 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
12f10 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f  e.** required fo
12f20 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69  r string compari
12f30 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c  son, or if unabl
12f40 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  e to allocate me
12f50 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54  mory.** for a UT
12f60 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71  F conversion req
12f70 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72  uired for compar
12f80 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72  ison.  The error
12f90 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   is stored.** in
12fa0 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
12fb0 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
12fc0 20 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c 53   int whereEqualS
12fd0 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
12fe0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
12ff0 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
13000 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
13010 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
13020 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
13030 64 65 72 2c 0a 20 20 45 78 70 72 20 2a 70 45 78  der,.  Expr *pEx
13040 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45  pr,         /* E
13050 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56 41  xpression for VA
13060 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41 4c  LUE in the x=VAL
13070 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  UE constraint */
13080 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f  .  tRowcnt *pnRo
13090 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  w       /* Write
130a0 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77   the revised row
130b0 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a   estimate here *
130c0 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  /.){.  Index *p 
130d0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
130e0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
130f0 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 42  ;.  int nEq = pB
13100 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
13110 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55 6e 70  btree.nEq;.  Unp
13120 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65  ackedRecord *pRe
13130 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52  c = pBuilder->pR
13140 65 63 3b 0a 20 20 75 38 20 61 66 66 3b 20 20 20  ec;.  u8 aff;   
13150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13160 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  /* Column affini
13170 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ty */.  int rc; 
13180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13190 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e    /* Subfunction
131a0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
131b0 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20    tRowcnt a[2]; 
131c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
131d0 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20 69  tatistics */.  i
131e0 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65 72  nt bOk;..  asser
131f0 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20 61  t( nEq>=1 );.  a
13200 73 73 65 72 74 28 20 6e 45 71 3c 3d 28 70 2d 3e  ssert( nEq<=(p->
13210 6e 4b 65 79 43 6f 6c 2b 31 29 20 29 3b 0a 20 20  nKeyCol+1) );.  
13220 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70  assert( p->aSamp
13230 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  le!=0 );.  asser
13240 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20  t( p->nSample>0 
13250 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 75  );.  assert( pBu
13260 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
13270 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  <nEq );..  /* If
13280 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20   values are not 
13290 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c  available for al
132a0 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  l fields of the 
132b0 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66  index to the lef
132c0 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f  t.  ** of this o
132d0 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20  ne, no estimate 
132e0 63 61 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74  can be made. Ret
132f0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
13300 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42  UND. */.  if( pB
13310 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
13320 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20  d<(nEq-1) ){.   
13330 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
13340 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20  OTFOUND;.  }..  
13350 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  /* This is an op
13360 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e  timization only.
13370 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
13380 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
13390 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65  tValue().  ** be
133a0 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e  low would return
133b0 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e   the same value.
133c0 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 70    */.  if( nEq>p
133d0 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  ->nKeyCol ){.   
133e0 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20   *pnRow = 1;.   
133f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13400 4b 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 20 3d 20  K;.  }..  aff = 
13410 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  p->pTable->aCol[
13420 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 2d  p->aiColumn[nEq-
13430 31 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  1]].affinity;.  
13440 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
13450 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70  4ProbeSetValue(p
13460 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c  Parse, p, &pRec,
13470 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71   pExpr, aff, nEq
13480 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20 20 70 42 75  -1, &bOk);.  pBu
13490 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52  ilder->pRec = pR
134a0 65 63 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ec;.  if( rc!=SQ
134b0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
134c0 20 72 63 3b 0a 20 20 69 66 28 20 62 4f 6b 3d 3d   rc;.  if( bOk==
134d0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
134e0 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 70 42  E_NOTFOUND;.  pB
134f0 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
13500 64 20 3d 20 6e 45 71 3b 0a 0a 20 20 77 68 65 72  d = nEq;..  wher
13510 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
13520 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29  , p, pRec, 0, a)
13530 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  ;.  WHERETRACE(0
13540 78 31 30 2c 28 22 65 71 75 61 6c 69 74 79 20 73  x10,("equality s
13550 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c  can regions: %d\
13560 6e 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b  n", (int)a[1]));
13570 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d  .  *pnRow = a[1]
13580 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63  ;.  .  return rc
13590 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
135a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
135b0 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23  3_OR_STAT4 */..#
135c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
135d0 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
135e0 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  T4./*.** Estimat
135f0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
13600 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
13610 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64  e returned based
13620 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e   on.** an IN con
13630 73 74 72 61 69 6e 74 20 77 68 65 72 65 20 74 68  straint where th
13640 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
13650 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  e of the IN oper
13660 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73  ator.** is a lis
13670 74 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78  t of values.  Ex
13680 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
13690 20 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28      WHERE x IN (
136a0 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57  1,2,3,4).**.** W
136b0 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74  rite the estimat
136c0 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74  ed row count int
136d0 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74  o *pnRow and ret
136e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a  urn SQLITE_OK. .
136f0 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20  ** If unable to 
13700 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65  make an estimate
13710 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75  , leave *pnRow u
13720 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74  nchanged and ret
13730 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e  urn.** non-zero.
13740 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
13750 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20  ine can fail if 
13760 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20  it is unable to 
13770 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67  load a collating
13780 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71   sequence.** req
13790 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67  uired for string
137a0 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20   comparison, or 
137b0 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  if unable to all
137c0 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  ocate memory.** 
137d0 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72  for a UTF conver
137e0 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f  sion required fo
137f0 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54  r comparison.  T
13800 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72  he error is stor
13810 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61  ed.** in the pPa
13820 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
13830 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
13840 72 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50  reInScanEst(.  P
13850 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
13860 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
13870 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
13880 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
13890 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
138a0 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72  pBuilder,.  Expr
138b0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
138c0 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69   /* The value li
138d0 73 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  st on the RHS of
138e0 20 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33   "x IN (v1,v2,v3
138f0 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77  ,...)" */.  tRow
13900 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20  cnt *pnRow      
13910 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65   /* Write the re
13920 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61  vised row estima
13930 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  te here */.){.  
13940 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c  Index *p = pBuil
13950 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72  der->pNew->u.btr
13960 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  ee.pIndex;.  int
13970 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75   nRecValid = pBu
13980 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
13990 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
139a0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 53  ITE_OK;     /* S
139b0 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
139c0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
139d0 63 6e 74 20 6e 45 73 74 3b 20 20 20 20 20 20 20  cnt nEst;       
139e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
139f0 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e 67   rows for a sing
13a00 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52 6f  le term */.  tRo
13a10 77 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20 30  wcnt nRowEst = 0
13a20 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74 69  ;    /* New esti
13a30 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
13a40 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20  er of rows */.  
13a50 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
13a60 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
13a70 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  counter */..  as
13a80 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
13a90 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  !=0 );.  for(i=0
13aa0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
13ab0 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  && i<pList->nExp
13ac0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73  r; i++){.    nEs
13ad0 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b  t = p->aiRowEst[
13ae0 30 5d 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65  0];.    rc = whe
13af0 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70  reEqualScanEst(p
13b00 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
13b10 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
13b20 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20  pr, &nEst);.    
13b30 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b  nRowEst += nEst;
13b40 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
13b50 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56  RecValid = nRecV
13b60 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  alid;.  }..  if(
13b70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13b80 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73  {.    if( nRowEs
13b90 74 20 3e 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b  t > p->aiRowEst[
13ba0 30 5d 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 70  0] ) nRowEst = p
13bb0 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20  ->aiRowEst[0];. 
13bc0 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77     *pnRow = nRow
13bd0 45 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52  Est;.    WHERETR
13be0 41 43 45 28 30 78 31 30 2c 28 22 49 4e 20 72 6f  ACE(0x10,("IN ro
13bf0 77 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d  w estimate: est=
13c00 25 67 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29  %g\n", nRowEst))
13c10 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
13c20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
13c30 6c 69 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29  lid==nRecValid )
13c40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13c50 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
13c60 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
13c70 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a  R_STAT4 */../*.*
13c80 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d  * Disable a term
13c90 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
13ca0 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64  ause.  Except, d
13cb0 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68  o not disable th
13cc0 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20  e term.** if it 
13cd0 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20  controls a LEFT 
13ce0 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69  OUTER JOIN and i
13cf0 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e  t did not origin
13d00 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a  ate in the ON.**
13d10 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
13d20 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a   of that join..*
13d30 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68  *.** Consider th
13d40 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27  e term t2.z='ok'
13d50 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
13d60 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a  g queries:.**.**
13d70 20 20 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a     (1)  SELECT *
13d80 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
13d90 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
13da0 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f  .x WHERE t2.z='o
13db0 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c  k'.**   (2)  SEL
13dc0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
13dd0 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
13de0 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a  .a=t2.x AND t2.z
13df0 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20  ='ok'.**   (3)  
13e00 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
13e10 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d  , t2 WHERE t1.a=
13e20 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f  t2.x AND t2.z='o
13e30 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e  k'.**.** The t2.
13e40 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c  z='ok' is disabl
13e50 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29  ed in the in (2)
13e60 20 62 65 63 61 75 73 65 20 69 74 20 6f 72 69 67   because it orig
13e70 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65  inates.** in the
13e80 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65   ON clause.  The
13e90 20 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65   term is disable
13ea0 64 20 69 6e 20 28 33 29 20 62 65 63 61 75 73 65  d in (3) because
13eb0 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a   it is not part.
13ec0 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  ** of a LEFT OUT
13ed0 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29  ER JOIN.  In (1)
13ee0 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f  , the term is no
13ef0 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a  t disabled..**.*
13f00 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65  * Disabling a te
13f10 72 6d 20 63 61 75 73 65 73 20 74 68 61 74 20 74  rm causes that t
13f20 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65  erm to not be te
13f30 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65  sted in the inne
13f40 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65  r loop.** of the
13f50 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e   join.  Disablin
13f60 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  g is an optimiza
13f70 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d  tion.  When term
13f80 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a  s are satisfied.
13f90 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77  ** by indices, w
13fa0 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74  e disable them t
13fb0 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64  o prevent redund
13fc0 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68 65  ant tests in the
13fd0 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20   inner.** loop. 
13fe0 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68   We would get th
13ff0 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74  e correct result
14000 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72  s if nothing wer
14010 65 20 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c  e ever disabled,
14020 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69  .** but joins mi
14030 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65  ght run a little
14040 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72   slower.  The tr
14050 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c  ick is to disabl
14060 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20  e as much.** as 
14070 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64  we can without d
14080 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63  isabling too muc
14090 68 2e 20 20 49 66 20 77 65 20 64 69 73 61 62 6c  h.  If we disabl
140a0 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20  ed in (1), we'd 
140b0 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67  get.** the wrong
140c0 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69   answer.  See ti
140d0 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74  cket #813..*/.st
140e0 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c  atic void disabl
140f0 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c  eTerm(WhereLevel
14100 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54   *pLevel, WhereT
14110 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69  erm *pTerm){.  i
14120 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26  f( pTerm.      &
14130 26 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  & (pTerm->wtFlag
14140 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d  s & TERM_CODED)=
14150 3d 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65  =0.      && (pLe
14160 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d  vel->iLeftJoin==
14170 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  0 || ExprHasProp
14180 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
14190 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29  r, EP_FromJoin))
141a0 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65  .      && (pLeve
141b0 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 26 20 70 54  l->notReady & pT
141c0 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 29 3d  erm->prereqAll)=
141d0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 54 65 72  =0.  ){.    pTer
141e0 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
141f0 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66  RM_CODED;.    if
14200 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  ( pTerm->iParent
14210 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65  >=0 ){.      Whe
14220 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d  reTerm *pOther =
14230 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b   &pTerm->pWC->a[
14240 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  pTerm->iParent];
14250 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f  .      if( (--pO
14260 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30  ther->nChild)==0
14270 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61   ){.        disa
14280 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
14290 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d  pOther);.      }
142a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
142b0 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41  .** Code an OP_A
142c0 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 74  ffinity opcode t
142d0 6f 20 61 70 70 6c 79 20 74 68 65 20 63 6f 6c 75  o apply the colu
142e0 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  mn affinity stri
142f0 6e 67 20 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68  ng zAff.** to th
14300 65 20 6e 20 72 65 67 69 73 74 65 72 73 20 73 74  e n registers st
14310 61 72 74 69 6e 67 20 61 74 20 62 61 73 65 2e 20  arting at base. 
14320 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74  .**.** As an opt
14330 69 6d 69 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54  imization, SQLIT
14340 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69  E_AFF_NONE entri
14350 65 73 20 28 77 68 69 63 68 20 61 72 65 20 6e 6f  es (which are no
14360 2d 6f 70 73 29 20 61 74 20 74 68 65 0a 2a 2a 20  -ops) at the.** 
14370 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e  beginning and en
14380 64 20 6f 66 20 7a 41 66 66 20 61 72 65 20 69 67  d of zAff are ig
14390 6e 6f 72 65 64 2e 20 20 49 66 20 61 6c 6c 20 65  nored.  If all e
143a0 6e 74 72 69 65 73 20 69 6e 20 7a 41 66 66 20 61  ntries in zAff a
143b0 72 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  re.** SQLITE_AFF
143c0 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20 6e 6f 20 63  _NONE, then no c
143d0 6f 64 65 20 67 65 74 73 20 67 65 6e 65 72 61 74  ode gets generat
143e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
143f0 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 73  outine makes its
14400 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66   own copy of zAf
14410 66 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61  f so that the ca
14420 6c 6c 65 72 20 69 73 20 66 72 65 65 0a 2a 2a 20  ller is free.** 
14430 74 6f 20 6d 6f 64 69 66 79 20 7a 41 66 66 20 61  to modify zAff a
14440 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
14450 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74  e returns..*/.st
14460 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41 70  atic void codeAp
14470 70 6c 79 41 66 66 69 6e 69 74 79 28 50 61 72 73  plyAffinity(Pars
14480 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 62  e *pParse, int b
14490 61 73 65 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72  ase, int n, char
144a0 20 2a 7a 41 66 66 29 7b 0a 20 20 56 64 62 65 20   *zAff){.  Vdbe 
144b0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
144c0 62 65 3b 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d  be;.  if( zAff==
144d0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
144e0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
144f0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
14500 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
14510 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a  ssert( v!=0 );..
14520 20 20 2f 2a 20 41 64 6a 75 73 74 20 62 61 73 65    /* Adjust base
14530 20 61 6e 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f   and n to skip o
14540 76 65 72 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ver SQLITE_AFF_N
14550 4f 4e 45 20 65 6e 74 72 69 65 73 20 61 74 20 74  ONE entries at t
14560 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a  he beginning.  *
14570 2a 20 61 6e 64 20 65 6e 64 20 6f 66 20 74 68 65  * and end of the
14580 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
14590 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
145a0 6e 3e 30 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d  n>0 && zAff[0]==
145b0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
145c0 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20  ){.    n--;.    
145d0 62 61 73 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66  base++;.    zAff
145e0 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  ++;.  }.  while(
145f0 20 6e 3e 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31   n>1 && zAff[n-1
14600 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ]==SQLITE_AFF_NO
14610 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20  NE ){.    n--;. 
14620 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68   }..  /* Code th
14630 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70  e OP_Affinity op
14640 63 6f 64 65 20 69 66 20 74 68 65 72 65 20 69 73  code if there is
14650 20 61 6e 79 74 68 69 6e 67 20 6c 65 66 74 20 74   anything left t
14660 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e  o do. */.  if( n
14670 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
14680 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14690 50 5f 41 66 66 69 6e 69 74 79 2c 20 62 61 73 65  P_Affinity, base
146a0 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , n);.    sqlite
146b0 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
146c0 20 2d 31 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20   -1, zAff, n);. 
146d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
146e0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
146f0 65 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20  e(pParse, base, 
14700 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  n);.  }.}.../*.*
14710 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
14720 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75  for a single equ
14730 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68  ality term of th
14740 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
14750 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20   An equality.** 
14760 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68  term can be eith
14770 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49  er X=expr or X I
14780 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d  N (...).   pTerm
14790 20 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20   is the term to 
147a0 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a  be .** coded..**
147b0 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20  .** The current 
147c0 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f  value for the co
147d0 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74  nstraint is left
147e0 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
147f0 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63  g..**.** For a c
14800 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65  onstraint of the
14810 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68   form X=expr, th
14820 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
14830 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74  evaluated and it
14840 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c  s.** result is l
14850 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  eft on the stack
14860 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e  .  For constrain
14870 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  ts of the form X
14880 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69   IN (...).** thi
14890 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75  s routine sets u
148a0 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  p a loop that wi
148b0 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  ll iterate over 
148c0 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e  all values of X.
148d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
148e0 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
148f0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
14900 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
14910 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
14920 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
14930 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65  erm,   /* The te
14940 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
14950 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64  clause to be cod
14960 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  ed */.  WhereLev
14970 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 54  el *pLevel, /* T
14980 68 65 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  he level of the 
14990 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61  FROM clause we a
149a0 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
149b0 0a 20 20 69 6e 74 20 69 45 71 2c 20 20 20 20 20  .  int iEq,     
149c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
149d0 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  of the equality 
149e0 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 69 73  term within this
149f0 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20   level */.  int 
14a00 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20  bRev,           
14a10 2f 2a 20 54 72 75 65 20 66 6f 72 20 72 65 76 65  /* True for reve
14a20 72 73 65 2d 6f 72 64 65 72 20 49 4e 20 6f 70 65  rse-order IN ope
14a30 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  rations */.  int
14a40 20 69 54 61 72 67 65 74 20 20 20 20 20 20 20 20   iTarget        
14a50 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6c   /* Attempt to l
14a60 65 61 76 65 20 72 65 73 75 6c 74 73 20 69 6e 20  eave results in 
14a70 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
14a80 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d  .){.  Expr *pX =
14a90 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
14aa0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
14ab0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
14ac0 69 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  iReg;           
14ad0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
14ae0 65 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  er holding resul
14af0 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ts */..  assert(
14b00 20 69 54 61 72 67 65 74 3e 30 20 29 3b 0a 20 20   iTarget>0 );.  
14b10 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45  if( pX->op==TK_E
14b20 51 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20  Q ){.    iReg = 
14b30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
14b40 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 58  arget(pParse, pX
14b50 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65  ->pRight, iTarge
14b60 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
14b70 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  pX->op==TK_ISNUL
14b80 4c 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20  L ){.    iReg = 
14b90 69 54 61 72 67 65 74 3b 0a 20 20 20 20 73 71 6c  iTarget;.    sql
14ba0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14bb0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52  , OP_Null, 0, iR
14bc0 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  eg);.#ifndef SQL
14bd0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
14be0 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  Y.  }else{.    i
14bf0 6e 74 20 65 54 79 70 65 3b 0a 20 20 20 20 69 6e  nt eType;.    in
14c00 74 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72 75  t iTab;.    stru
14c10 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a  ct InLoop *pIn;.
14c20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
14c30 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
14c40 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 69 66 28 20  WLoop;..    if( 
14c50 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
14c60 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
14c70 41 42 4c 45 29 3d 3d 30 0a 20 20 20 20 20 20 26  ABLE)==0.      &
14c80 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  & pLoop->u.btree
14c90 2e 70 49 6e 64 65 78 21 3d 30 0a 20 20 20 20 20  .pIndex!=0.     
14ca0 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72   && pLoop->u.btr
14cb0 65 65 2e 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74  ee.pIndex->aSort
14cc0 4f 72 64 65 72 5b 69 45 71 5d 0a 20 20 20 20 29  Order[iEq].    )
14cd0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
14ce0 28 20 69 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20  ( iEq==0 );.    
14cf0 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76    testcase( bRev
14d00 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d   );.      bRev =
14d10 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20   !bRev;.    }.  
14d20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
14d30 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69  ==TK_IN );.    i
14d40 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20  Reg = iTarget;. 
14d50 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74     eType = sqlit
14d60 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
14d70 61 72 73 65 2c 20 70 58 2c 20 30 29 3b 0a 20 20  arse, pX, 0);.  
14d80 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
14d90 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43  INDEX_INDEX_DESC
14da0 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
14db0 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20  se( bRev );.    
14dc0 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a    bRev = !bRev;.
14dd0 20 20 20 20 7d 0a 20 20 20 20 69 54 61 62 20 3d      }.    iTab =
14de0 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20   pX->iTable;.   
14df0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14e00 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f  p2(v, bRev ? OP_
14e10 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64  Last : OP_Rewind
14e20 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , iTab, 0);.    
14e30 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
14e40 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
14e50 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a  MULTI_OR)==0 );.
14e60 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
14e70 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 4e 5f 41  gs |= WHERE_IN_A
14e80 42 4c 45 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  BLE;.    if( pLe
14e90 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30  vel->u.in.nIn==0
14ea0 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
14eb0 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69  ->addrNxt = sqli
14ec0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14ed0 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  (v);.    }.    p
14ee0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b  Level->u.in.nIn+
14ef0 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75  +;.    pLevel->u
14f00 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20  .in.aInLoop =.  
14f10 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65       sqlite3DbRe
14f20 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72  allocOrFree(pPar
14f30 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e  se->db, pLevel->
14f40 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20  u.in.aInLoop,.  
14f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f60 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
14f70 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  of(pLevel->u.in.
14f80 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76  aInLoop[0])*pLev
14f90 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20  el->u.in.nIn);. 
14fa0 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d     pIn = pLevel-
14fb0 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20  >u.in.aInLoop;. 
14fc0 20 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20     if( pIn ){.  
14fd0 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65      pIn += pLeve
14fe0 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b  l->u.in.nIn - 1;
14ff0 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72  .      pIn->iCur
15000 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69   = iTab;.      i
15010 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
15020 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
15030 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54      pIn->addrInT
15040 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
15050 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
15060 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b  id, iTab, iReg);
15070 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15080 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49        pIn->addrI
15090 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  nTop = sqlite3Vd
150a0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
150b0 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20  olumn, iTab, 0, 
150c0 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iReg);.      }. 
150d0 20 20 20 20 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f       pIn->eEndLo
150e0 6f 70 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  opOp = bRev ? OP
150f0 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b  _Prev : OP_Next;
15100 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15110 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
15120 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20  sNull, iReg);.  
15130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
15140 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20  Level->u.in.nIn 
15150 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 0;.    }.#endi
15160 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54  f.  }.  disableT
15170 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
15180 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65  m);.  return iRe
15190 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  g;.}../*.** Gene
151a0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
151b0 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c  ill evaluate all
151c0 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74   == and IN const
151d0 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a  raints for an.**
151e0 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f   index..**.** Fo
151f0 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69  r example, consi
15200 64 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62  der table t1(a,b
15210 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69  ,c,d,e,f) with i
15220 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a  ndex i1(a,b,c)..
15230 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20 57  ** Suppose the W
15240 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74  HERE clause is t
15250 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62  his:  a==5 AND b
15260 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20   IN (1,2,3) AND 
15270 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20  c>5 AND c<10.** 
15280 54 68 65 20 69 6e 64 65 78 20 68 61 73 20 61 73  The index has as
15290 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20 65   many as three e
152a0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
152b0 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73  nts, but in this
152c0 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  .** example, the
152d0 20 74 68 69 72 64 20 22 63 22 20 76 61 6c 75 65   third "c" value
152e0 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   is an inequalit
152f0 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20  y.  So only two 
15300 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  .** constraints 
15310 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73  are coded.  This
15320 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65   routine will ge
15330 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
15340 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20  valuate.** a==5 
15350 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29  and b IN (1,2,3)
15360 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 76  .  The current v
15370 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20  alues for a and 
15380 62 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64  b will be stored
15390 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75 74 69  .** in consecuti
153a0 76 65 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ve registers and
153b0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
153c0 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
153d0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
153e0 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70  .** In the examp
153f0 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e  le above nEq==2.
15400 20 20 42 75 74 20 74 68 69 73 20 73 75 62 72 6f    But this subro
15410 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20  utine works for 
15420 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  any value.** of 
15430 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e  nEq including 0.
15440 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69    If nEq==0, thi
15450 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61  s routine is nea
15460 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20  rly a no-op..** 
15470 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69  The only thing i
15480 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61  t does is alloca
15490 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69  te the pLevel->i
154a0 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  Mem memory cell 
154b0 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65 20 74  and.** compute t
154c0 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
154d0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ng..**.** This r
154e0 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20 61 6c  outine always al
154f0 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61 73 74  locates at least
15500 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   one memory cell
15510 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20   and returns.** 
15520 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
15530 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 54  t memory cell. T
15540 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  he code that.** 
15550 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
15560 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68 61 74  ne will use that
15570 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   memory cell to 
15580 73 74 6f 72 65 20 74 68 65 20 74 65 72 6d 69 6e  store the termin
15590 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c  ation.** key val
155a0 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  ue of the loop. 
155b0 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   If one or more 
155c0 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70  IN operators app
155d0 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ear, then.** thi
155e0 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61  s routine alloca
155f0 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61  tes an additiona
15600 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c  l nEq memory cel
15610 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a  ls for internal.
15620 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65  ** use..**.** Be
15630 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
15640 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f  *pzAff is set to
15650 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
15660 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a  er containing a.
15670 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  ** copy of the c
15680 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73  olumn affinity s
15690 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64  tring of the ind
156a0 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  ex allocated usi
156b0 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d  ng.** sqlite3DbM
156c0 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c  alloc(). Except,
156d0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
156e0 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72 69  copy of the stri
156f0 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ng associated.**
15700 20 77 69 74 68 20 65 71 75 61 6c 69 74 79 20 63   with equality c
15710 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20  onstraints that 
15720 75 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74  use NONE affinit
15730 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20  y are set to.** 
15740 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
15750 20 54 68 69 73 20 69 73 20 74 6f 20 64 65 61 6c   This is to deal
15760 20 77 69 74 68 20 53 51 4c 20 73 75 63 68 20 61   with SQL such a
15770 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
15780 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
15790 54 41 42 4c 45 20 74 31 28 61 20 54 45 58 54 20  TABLE t1(a TEXT 
157a0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b  PRIMARY KEY, b);
157b0 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e  .**   SELECT ...
157c0 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c 20   FROM t1 AS t2, 
157d0 74 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d 20  t1 WHERE t1.a = 
157e0 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  t2.b;.**.** In t
157f0 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
15800 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74  , the index on t
15810 31 28 61 29 20 68 61 73 20 54 45 58 54 20 61 66  1(a) has TEXT af
15820 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e 63  finity. But sinc
15830 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20 68  e.** the right h
15840 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
15850 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
15860 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20 4e  int (t2.b) has N
15870 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a  ONE affinity,.**
15880 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73   no conversion s
15890 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d 70 74  hould be attempt
158a0 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20  ed before using 
158b0 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61 73 20  a t2.b value as 
158c0 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79  part of.** a key
158d0 20 74 6f 20 73 65 61 72 63 68 20 74 68 65 20 69   to search the i
158e0 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68 65 20  ndex. Hence the 
158f0 66 69 72 73 74 20 62 79 74 65 20 69 6e 20 74 68  first byte in th
15900 65 20 72 65 74 75 72 6e 65 64 20 61 66 66 69 6e  e returned affin
15910 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e  ity.** string in
15920 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20 77 6f   this example wo
15930 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 53 51  uld be set to SQ
15940 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a  LITE_AFF_NONE..*
15950 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
15960 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d  eAllEqualityTerm
15970 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
15980 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
15990 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
159a0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
159b0 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63  Level,   /* Whic
159c0 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  h nested loop of
159d0 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65   the FROM we are
159e0 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74   coding */.  int
159f0 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20   bRev,          
15a00 20 20 20 2f 2a 20 52 65 76 65 72 73 65 20 74 68     /* Reverse th
15a10 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 6f 70  e order of IN op
15a20 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74  erators */.  int
15a30 20 6e 45 78 74 72 61 52 65 67 2c 20 20 20 20 20   nExtraReg,     
15a40 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
15a50 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
15a60 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
15a70 20 63 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20   char **pzAff   
15a80 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
15a90 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
15aa0 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a  ffinity string *
15ab0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71 3b 20  /.){.  int nEq; 
15ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ad0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
15ae0 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63  er of == or IN c
15af0 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f  onstraints to co
15b00 64 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  de */.  Vdbe *v 
15b10 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
15b20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 6d 20        /* The vm 
15b30 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
15b40 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  on */.  Index *p
15b50 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
15b60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
15b70 65 78 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  ex being used fo
15b80 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20  r this loop */. 
15b90 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
15ba0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
15bb0 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74  * A single const
15bc0 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  raint term */.  
15bd0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
15be0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
15bf0 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   The WhereLoop o
15c00 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6a  bject */.  int j
15c10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15c20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
15c30 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
15c40 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
15c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
15c60 61 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ase register */.
15c70 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20    int nReg;     
15c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c90 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67  /* Number of reg
15ca0 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61  isters to alloca
15cb0 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41  te */.  char *zA
15cc0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
15cd0 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
15ce0 79 20 73 74 72 69 6e 67 20 74 6f 20 72 65 74 75  y string to retu
15cf0 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  rn */..  /* This
15d00 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20   module is only 
15d10 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65 72 79 20  called on query 
15d20 70 6c 61 6e 73 20 74 68 61 74 20 75 73 65 20 61  plans that use a
15d30 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 70 4c  n index. */.  pL
15d40 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
15d50 4c 6f 6f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  Loop;.  assert( 
15d60 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
15d70 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
15d80 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 6e 45  ABLE)==0 );.  nE
15d90 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
15da0 65 65 2e 6e 45 71 3b 0a 20 20 70 49 64 78 20 3d  ee.nEq;.  pIdx =
15db0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
15dc0 70 49 6e 64 65 78 3b 0a 20 20 61 73 73 65 72 74  pIndex;.  assert
15dd0 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 0a 20 20  ( pIdx!=0 );..  
15de0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
15df0 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65  w many memory ce
15e00 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  lls we will need
15e10 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74   then allocate t
15e20 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42  hem..  */.  regB
15e30 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ase = pParse->nM
15e40 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d  em + 1;.  nReg =
15e50 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
15e60 6e 45 71 20 2b 20 6e 45 78 74 72 61 52 65 67 3b  nEq + nExtraReg;
15e70 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
15e80 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66  += nReg;..  zAff
15e90 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
15ea0 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  up(pParse->db, s
15eb0 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
15ec0 69 74 79 53 74 72 28 76 2c 20 70 49 64 78 29 29  ityStr(v, pIdx))
15ed0 3b 0a 20 20 69 66 28 20 21 7a 41 66 66 20 29 7b  ;.  if( !zAff ){
15ee0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d  .    pParse->db-
15ef0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
15f00 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 76 61  1;.  }..  /* Eva
15f10 6c 75 61 74 65 20 74 68 65 20 65 71 75 61 6c 69  luate the equali
15f20 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  ty constraints. 
15f30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 41   */.  assert( zA
15f40 66 66 3d 3d 30 20 7c 7c 20 28 69 6e 74 29 73 74  ff==0 || (int)st
15f50 72 6c 65 6e 28 7a 41 66 66 29 3e 3d 6e 45 71 20  rlen(zAff)>=nEq 
15f60 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  );.  for(j=0; j<
15f70 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  nEq; j++){.    i
15f80 6e 74 20 72 31 3b 0a 20 20 20 20 70 54 65 72 6d  nt r1;.    pTerm
15f90 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
15fa0 5b 6a 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [j];.    assert(
15fb0 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
15fc0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
15fd0 67 20 74 72 75 65 20 66 6f 72 20 69 6e 64 69 63  g true for indic
15fe0 65 73 20 77 69 74 68 20 72 65 64 75 6e 64 61 6e  es with redundan
15ff0 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20  t columns. .    
16000 2a 2a 20 45 78 3a 20 43 52 45 41 54 45 20 49 4e  ** Ex: CREATE IN
16010 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 62  DEX i1 ON t1(a,b
16020 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a 20 46 52  ,a); SELECT * FR
16030 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 30 20  OM t1 WHERE a=0 
16040 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20  AND b=0; */.    
16050 74 65 73 74 63 61 73 65 28 20 28 70 54 65 72 6d  testcase( (pTerm
16060 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
16070 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20 20  _CODED)!=0 );.  
16080 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
16090 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
160a0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
160b0 20 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69   r1 = codeEquali
160c0 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
160d0 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c  Term, pLevel, j,
160e0 20 62 52 65 76 2c 20 72 65 67 42 61 73 65 2b 6a   bRev, regBase+j
160f0 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72  );.    if( r1!=r
16100 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20  egBase+j ){.    
16110 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b    if( nReg==1 ){
16120 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16130 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
16140 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b  Parse, regBase);
16150 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65  .        regBase
16160 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = r1;.      }el
16170 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
16180 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16190 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72   OP_SCopy, r1, r
161a0 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20  egBase+j);.     
161b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73   }.    }.    tes
161c0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
161d0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
161e0 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ULL );.    testc
161f0 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
16200 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b  rator & WO_IN );
16210 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
16220 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
16230 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d  _ISNULL|WO_IN))=
16240 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  =0 ){.      Expr
16250 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d   *pRight = pTerm
16260 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
16270 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
16280 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70  prCodeIsNullJump
16290 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  (v, pRight, regB
162a0 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61  ase+j, pLevel->a
162b0 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 69  ddrBrk);.      i
162c0 66 28 20 7a 41 66 66 20 29 7b 0a 20 20 20 20 20  f( zAff ){.     
162d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
162e0 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52  mpareAffinity(pR
162f0 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d  ight, zAff[j])==
16300 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
16310 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66  ){.          zAf
16320 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  f[j] = SQLITE_AF
16330 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
16340 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  }.        if( sq
16350 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
16360 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
16370 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 20  Right, zAff[j]) 
16380 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66  ){.          zAf
16390 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  f[j] = SQLITE_AF
163a0 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
163b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
163c0 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20 7a    }.  *pzAff = z
163d0 41 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  Aff;.  return re
163e0 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65  gBase;.}..#ifnde
163f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
16400 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73  PLAIN./*.** This
16410 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 65   routine is a he
16420 6c 70 65 72 20 66 6f 72 20 65 78 70 6c 61 69 6e  lper for explain
16430 49 6e 64 65 78 52 61 6e 67 65 28 29 20 62 65 6c  IndexRange() bel
16440 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20 68 6f  ow.**.** pStr ho
16450 6c 64 73 20 74 68 65 20 74 65 78 74 20 6f 66 20  lds the text of 
16460 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
16470 61 74 20 77 65 20 61 72 65 20 62 75 69 6c 64 69  at we are buildi
16480 6e 67 20 75 70 20 6f 6e 65 20 74 65 72 6d 0a 2a  ng up one term.*
16490 2a 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68  * at a time.  Th
164a0 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20  is routine adds 
164b0 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68  a new term to th
164c0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 65 78 70  e end of the exp
164d0 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d  ression..** Term
164e0 73 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20  s are separated 
164f0 62 79 20 41 4e 44 20 73 6f 20 61 64 64 20 74 68  by AND so add th
16500 65 20 22 41 4e 44 22 20 74 65 78 74 20 66 6f 72  e "AND" text for
16510 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73   second and subs
16520 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d 73 20  equent.** terms 
16530 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
16540 76 6f 69 64 20 65 78 70 6c 61 69 6e 41 70 70 65  void explainAppe
16550 6e 64 54 65 72 6d 28 0a 20 20 53 74 72 41 63 63  ndTerm(.  StrAcc
16560 75 6d 20 2a 70 53 74 72 2c 20 20 20 20 20 20 20  um *pStr,       
16570 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78        /* The tex
16580 74 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69  t expression bei
16590 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20 69 6e  ng built */.  in
165a0 74 20 69 54 65 72 6d 2c 20 20 20 20 20 20 20 20  t iTerm,        
165b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
165c0 65 78 20 6f 66 20 74 68 69 73 20 74 65 72 6d 2e  ex of this term.
165d0 20 20 46 69 72 73 74 20 69 73 20 7a 65 72 6f 20    First is zero 
165e0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
165f0 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20  *zColumn,       
16600 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
16610 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73  column */.  cons
16620 74 20 63 68 61 72 20 2a 7a 4f 70 20 20 20 20 20  t char *zOp     
16630 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
16640 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  of the operator 
16650 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 54 65 72  */.){.  if( iTer
16660 6d 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63  m ) sqlite3StrAc
16670 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
16680 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20 73  " AND ", 5);.  s
16690 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
166a0 70 65 6e 64 28 70 53 74 72 2c 20 7a 43 6f 6c 75  pend(pStr, zColu
166b0 6d 6e 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74  mn, -1);.  sqlit
166c0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
166d0 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31 29 3b 0a  (pStr, zOp, 1);.
166e0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
166f0 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 3f  mAppend(pStr, "?
16700 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ", 1);.}../*.** 
16710 41 72 67 75 6d 65 6e 74 20 70 4c 65 76 65 6c 20  Argument pLevel 
16720 64 65 73 63 72 69 62 65 73 20 61 20 73 74 72 61  describes a stra
16730 74 65 67 79 20 66 6f 72 20 73 63 61 6e 6e 69 6e  tegy for scannin
16740 67 20 74 61 62 6c 65 20 70 54 61 62 2e 20 54 68  g table pTab. Th
16750 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
16760 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
16770 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75  r to a string bu
16780 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
16790 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a 2a  a description.**
167a0 20 6f 66 20 74 68 65 20 73 75 62 73 65 74 20 6f   of the subset o
167b0 66 20 74 61 62 6c 65 20 72 6f 77 73 20 73 63 61  f table rows sca
167c0 6e 6e 65 64 20 62 79 20 74 68 65 20 73 74 72 61  nned by the stra
167d0 74 65 67 79 20 69 6e 20 74 68 65 20 66 6f 72 6d  tegy in the form
167e0 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c 20 65 78   of an.** SQL ex
167f0 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c 20 69 66  pression. Or, if
16800 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 73 63   all rows are sc
16810 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72  anned, NULL is r
16820 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  eturned..**.** F
16830 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
16840 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
16850 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
16860 74 31 20 57 48 45 52 45 20 61 3d 31 20 41 4e 44  t1 WHERE a=1 AND
16870 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20 72   b>2;.**.** is r
16880 75 6e 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  un and there is 
16890 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20  an index on (a, 
168a0 62 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  b), then this fu
168b0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
168c0 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d 69 6c  .** string simil
168d0 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  ar to:.**.**   "
168e0 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a 2a 0a  a=? AND b>?".**.
168f0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
16900 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 74  pointer points t
16910 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
16920 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62  d from sqlite3Db
16930 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20  Malloc()..** It 
16940 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
16950 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
16960 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68 65 20  ler to free the 
16970 62 75 66 66 65 72 20 77 68 65 6e 20 69 74 20 69  buffer when it i
16980 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 72  s.** no longer r
16990 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  equired..*/.stat
169a0 69 63 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e  ic char *explain
169b0 49 6e 64 65 78 52 61 6e 67 65 28 73 71 6c 69 74  IndexRange(sqlit
169c0 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
169d0 70 20 2a 70 4c 6f 6f 70 2c 20 54 61 62 6c 65 20  p *pLoop, Table 
169e0 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20  *pTab){.  Index 
169f0 2a 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d  *pIndex = pLoop-
16a00 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
16a10 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f  .  int nEq = pLo
16a20 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
16a30 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43  .  int i, j;.  C
16a40 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54  olumn *aCol = pT
16a50 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69 31 36 20  ab->aCol;.  i16 
16a60 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64  *aiColumn = pInd
16a70 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20  ex->aiColumn;.  
16a80 53 74 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a 20  StrAccum txt;.. 
16a90 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 28   if( nEq==0 && (
16aa0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
16ab0 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49   (WHERE_BTM_LIMI
16ac0 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  T|WHERE_TOP_LIMI
16ad0 54 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  T))==0 ){.    re
16ae0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
16af0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
16b00 74 28 26 74 78 74 2c 20 30 2c 20 30 2c 20 53 51  t(&txt, 0, 0, SQ
16b10 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29  LITE_MAX_LENGTH)
16b20 3b 0a 20 20 74 78 74 2e 64 62 20 3d 20 64 62 3b  ;.  txt.db = db;
16b30 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
16b40 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22  umAppend(&txt, "
16b50 20 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28 69   (", 2);.  for(i
16b60 3d 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b  =0; i<nEq; i++){
16b70 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28  .    char *z = (
16b80 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  i==pIndex->nKeyC
16b90 6f 6c 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a  ol ) ? "rowid" :
16ba0 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69   aCol[aiColumn[i
16bb0 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78  ]].zName;.    ex
16bc0 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
16bd0 26 74 78 74 2c 20 69 2c 20 7a 2c 20 22 3d 22 29  &txt, i, z, "=")
16be0 3b 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a  ;.  }..  j = i;.
16bf0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
16c00 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c  lags&WHERE_BTM_L
16c10 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72  IMIT ){.    char
16c20 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78   *z = (j==pIndex
16c30 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 3f 20 22 72  ->nKeyCol ) ? "r
16c40 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43  owid" : aCol[aiC
16c50 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b  olumn[j]].zName;
16c60 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65  .    explainAppe
16c70 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2b 2b  ndTerm(&txt, i++
16c80 2c 20 7a 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a 20  , z, ">");.  }. 
16c90 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
16ca0 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49  ags&WHERE_TOP_LI
16cb0 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20  MIT ){.    char 
16cc0 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d  *z = (j==pIndex-
16cd0 3e 6e 4b 65 79 43 6f 6c 20 29 20 3f 20 22 72 6f  >nKeyCol ) ? "ro
16ce0 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f  wid" : aCol[aiCo
16cf0 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[j]].zName;.
16d00 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e      explainAppen
16d10 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a  dTerm(&txt, i, z
16d20 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71  , "<");.  }.  sq
16d30 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
16d40 65 6e 64 28 26 74 78 74 2c 20 22 29 22 2c 20 31  end(&txt, ")", 1
16d50 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
16d60 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
16d70 68 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  h(&txt);.}../*.*
16d80 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16d90 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73  is a no-op unles
16da0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63  s currently proc
16db0 65 73 73 69 6e 67 20 61 6e 20 45 58 50 4c 41 49  essing an EXPLAI
16dc0 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20  N QUERY PLAN.** 
16dd0 63 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65 20  command. If the 
16de0 71 75 65 72 79 20 62 65 69 6e 67 20 63 6f 6d 70  query being comp
16df0 69 6c 65 64 20 69 73 20 61 6e 20 45 58 50 4c 41  iled is an EXPLA
16e00 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2c 20 61  IN QUERY PLAN, a
16e10 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72   single.** recor
16e20 64 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  d is added to th
16e30 65 20 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63  e output to desc
16e40 72 69 62 65 20 74 68 65 20 74 61 62 6c 65 20 73  ribe the table s
16e50 63 61 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20  can strategy in 
16e60 0a 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73  .** pLevel..*/.s
16e70 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
16e80 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61 72  inOneScan(.  Par
16e90 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
16ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16eb0 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
16ec0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
16ed0 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
16ee0 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74     /* Table list
16ef0 20 74 68 69 73 20 6c 6f 6f 70 20 72 65 66 65 72   this loop refer
16f00 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c  s to */.  WhereL
16f10 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20  evel *pLevel,   
16f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61            /* Sca
16f30 6e 20 74 6f 20 77 72 69 74 65 20 4f 50 5f 45 78  n to write OP_Ex
16f40 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72  plain opcode for
16f50 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
16f60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16f70 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66        /* Value f
16f80 6f 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d  or "level" colum
16f90 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20  n of output */. 
16fa0 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fc0 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 66   /* Value for "f
16fd0 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f  rom" column of o
16fe0 75 74 70 75 74 20 2a 2f 0a 20 20 75 31 36 20 77  utput */.  u16 w
16ff0 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20  ctrlFlags       
17000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
17010 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 73 71  ags passed to sq
17020 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
17030 29 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50  ) */.){.  if( pP
17040 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
17050 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53   ){.    struct S
17060 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
17070 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
17080 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
17090 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
170a0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
170b0 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20      /* VM being 
170c0 63 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a 20  constructed */. 
170d0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
170e0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
170f0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
17100 64 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  dle */.    char 
17110 2a 7a 4d 73 67 3b 20 20 20 20 20 20 20 20 20 20  *zMsg;          
17120 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
17130 20 74 6f 20 61 64 64 20 74 6f 20 45 51 50 20 6f   to add to EQP o
17140 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74  utput */.    int
17150 20 69 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69   iId = pParse->i
17160 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65  SelectId;  /* Se
17170 6c 65 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f  lect id (left-mo
17180 73 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e  st output column
17190 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53  ) */.    int isS
171a0 65 61 72 63 68 3b 20 20 20 20 20 20 20 20 20 20  earch;          
171b0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
171c0 6f 72 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c  or a SEARCH. Fal
171d0 73 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a  se for SCAN. */.
171e0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
171f0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
17200 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f 6c    /* The control
17210 6c 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 6f  ling WhereLoop o
17220 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 75 33 32  bject */.    u32
17230 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20   flags;         
17240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
17250 61 67 73 20 74 68 61 74 20 64 65 73 63 72 69 62  ags that describ
17260 65 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 0a  e this loop */..
17270 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
17280 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
17290 66 6c 61 67 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77  flags = pLoop->w
172a0 73 46 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20  sFlags;.    if( 
172b0 28 66 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c  (flags&WHERE_MUL
172c0 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c  TI_OR) || (wctrl
172d0 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54  Flags&WHERE_ONET
172e0 41 42 4c 45 5f 4f 4e 4c 59 29 20 29 20 72 65 74  ABLE_ONLY) ) ret
172f0 75 72 6e 3b 0a 0a 20 20 20 20 69 73 53 65 61 72  urn;..    isSear
17300 63 68 20 3d 20 28 66 6c 61 67 73 26 28 57 48 45  ch = (flags&(WHE
17310 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45  RE_BTM_LIMIT|WHE
17320 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d  RE_TOP_LIMIT))!=
17330 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0.            ||
17340 20 28 28 66 6c 61 67 73 26 57 48 45 52 45 5f 56   ((flags&WHERE_V
17350 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
17360 26 26 20 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  && (pLoop->u.btr
17370 65 65 2e 6e 45 71 3e 30 29 29 0a 20 20 20 20 20  ee.nEq>0)).     
17380 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c         || (wctrl
17390 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f 52 44  Flags&(WHERE_ORD
173a0 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f  ERBY_MIN|WHERE_O
173b0 52 44 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a 20  RDERBY_MAX));.. 
173c0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
173d0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
173e0 22 2c 20 69 73 53 65 61 72 63 68 3f 22 53 45 41  ", isSearch?"SEA
173f0 52 43 48 22 3a 22 53 43 41 4e 22 29 3b 0a 20 20  RCH":"SCAN");.  
17400 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
17410 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 4d  lect ){.      zM
17420 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
17430 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
17440 25 73 20 53 55 42 51 55 45 52 59 20 25 64 22 2c  %s SUBQUERY %d",
17450 20 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e 69 53 65   zMsg,pItem->iSe
17460 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 7d 65 6c  lectId);.    }el
17470 73 65 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d  se{.      zMsg =
17480 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
17490 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 54  (db, zMsg, "%s T
174a0 41 42 4c 45 20 25 73 22 2c 20 7a 4d 73 67 2c 20  ABLE %s", zMsg, 
174b0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
174c0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49     }..    if( pI
174d0 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
174e0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
174f0 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
17500 7a 4d 73 67 2c 20 22 25 73 20 41 53 20 25 73 22  zMsg, "%s AS %s"
17510 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a  , zMsg, pItem->z
17520 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20  Alias);.    }.  
17530 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28    if( (flags & (
17540 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f  WHERE_IPK|WHERE_
17550 56 49 52 54 55 41 4c 54 41 42 4c 45 29 29 3d 3d  VIRTUALTABLE))==
17560 30 0a 20 20 20 20 20 26 26 20 41 4c 57 41 59 53  0.     && ALWAYS
17570 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  (pLoop->u.btree.
17580 70 49 6e 64 65 78 21 3d 30 29 0a 20 20 20 20 29  pIndex!=0).    )
17590 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57  {.      char *zW
175a0 68 65 72 65 20 3d 20 65 78 70 6c 61 69 6e 49 6e  here = explainIn
175b0 64 65 78 52 61 6e 67 65 28 64 62 2c 20 70 4c 6f  dexRange(db, pLo
175c0 6f 70 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29  op, pItem->pTab)
175d0 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  ;.      zMsg = s
175e0 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
175f0 62 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20  b, zMsg,.       
17600 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20          ((flags 
17610 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
17620 45 58 29 20 3f 20 0a 20 20 20 20 20 20 20 20 20  EX) ? .         
17630 20 20 20 20 20 20 20 20 20 20 22 25 73 20 55 53            "%s US
17640 49 4e 47 20 41 55 54 4f 4d 41 54 49 43 20 25 73  ING AUTOMATIC %s
17650 49 4e 44 45 58 25 2e 30 73 25 73 22 20 3a 0a 20  INDEX%.0s%s" :. 
17660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17670 20 20 22 25 73 20 55 53 49 4e 47 20 25 73 49 4e    "%s USING %sIN
17680 44 45 58 20 25 73 25 73 22 29 2c 20 0a 20 20 20  DEX %s%s"), .   
17690 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d 73 67              zMsg
176a0 2c 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52  , ((flags & WHER
176b0 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 3f 20 22 43  E_IDX_ONLY) ? "C
176c0 4f 56 45 52 49 4e 47 20 22 20 3a 20 22 22 29 2c  OVERING " : ""),
176d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
176e0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
176f0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 57  Index->zName, zW
17700 68 65 72 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  here);.      sql
17710 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
17720 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Where);.    }els
17730 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57  e if( (flags & W
17740 48 45 52 45 5f 49 50 4b 29 21 3d 30 20 26 26 20  HERE_IPK)!=0 && 
17750 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  (flags & WHERE_C
17760 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30 20 29 7b  ONSTRAINT)!=0 ){
17770 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
17780 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
17790 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e  , zMsg, "%s USIN
177a0 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  G INTEGER PRIMAR
177b0 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 0a  Y KEY", zMsg);..
177c0 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 26        if( flags&
177d0 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51  (WHERE_COLUMN_EQ
177e0 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e  |WHERE_COLUMN_IN
177f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  ) ){.        zMs
17800 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
17810 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
17820 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c 20 7a 4d  s (rowid=?)", zM
17830 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sg);.      }else
17840 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52   if( (flags&WHER
17850 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d 57  E_BOTH_LIMIT)==W
17860 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20  HERE_BOTH_LIMIT 
17870 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
17880 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
17890 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
178a0 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20 72 6f 77  (rowid>? AND row
178b0 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id<?)", zMsg);. 
178c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
178d0 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c  lags&WHERE_BTM_L
178e0 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20  IMIT ){.        
178f0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
17900 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
17910 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 29 22 2c   "%s (rowid>?)",
17920 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65   zMsg);.      }e
17930 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 66  lse if( ALWAYS(f
17940 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c  lags&WHERE_TOP_L
17950 49 4d 49 54 29 20 29 7b 0a 20 20 20 20 20 20 20  IMIT) ){.       
17960 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
17970 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
17980 2c 20 22 25 73 20 28 72 6f 77 69 64 3c 3f 29 22  , "%s (rowid<?)"
17990 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
179a0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
179b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
179c0 41 4c 54 41 42 4c 45 0a 20 20 20 20 65 6c 73 65  ALTABLE.    else
179d0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48   if( (flags & WH
179e0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
179f0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d  )!=0 ){.      zM
17a00 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
17a10 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
17a20 25 73 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  %s VIRTUAL TABLE
17a30 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 20 7a   INDEX %d:%s", z
17a40 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Msg,.           
17a50 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e         pLoop->u.
17a60 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 4c 6f  vtab.idxNum, pLo
17a70 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  op->u.vtab.idxSt
17a80 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  r);.    }.#endif
17a90 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
17aa0 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
17ab0 7a 4d 73 67 2c 20 22 25 73 22 2c 20 7a 4d 73 67  zMsg, "%s", zMsg
17ac0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
17ad0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
17ae0 78 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65  xplain, iId, iLe
17af0 76 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67  vel, iFrom, zMsg
17b00 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
17b10 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
17b20 69 6e 65 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63  ine explainOneSc
17b30 61 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a  an(u,v,w,x,y,z).
17b40 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
17b50 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f  _OMIT_EXPLAIN */
17b60 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
17b70 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73  e code for the s
17b80 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c 65 76  tart of the iLev
17b90 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68  el-th loop in th
17ba0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a  e WHERE clause.*
17bb0 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
17bc0 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70 57   described by pW
17bd0 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Info..*/.static 
17be0 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c  Bitmask codeOneL
17bf0 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68 65 72  oopStart(.  Wher
17c00 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20  eInfo *pWInfo,  
17c10 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66   /* Complete inf
17c20 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
17c30 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
17c40 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
17c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69            /* Whi
17c60 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e  ch level of pWIn
17c70 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62  fo->a[] should b
17c80 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 42 69 74  e coded */.  Bit
17c90 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20  mask notReady   
17ca0 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62 6c 65    /* Which table
17cb0 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  s are currently 
17cc0 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a  available */.){.
17cd0 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20    int j, k;     
17ce0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
17cf0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
17d00 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
17d10 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75    /* The VDBE cu
17d20 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62  rsor for the tab
17d30 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  le */.  int addr
17d40 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Nxt;         /* 
17d50 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f  Where to jump to
17d60 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74   continue with t
17d70 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20  he next IN case 
17d80 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61 62  */.  int omitTab
17d90 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  le;       /* Tru
17da0 65 20 69 66 20 77 65 20 75 73 65 20 74 68 65 20  e if we use the 
17db0 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20  index only */.  
17dc0 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20  int bRev;       
17dd0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
17de0 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20  we need to scan 
17df0 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
17e00 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
17e10 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68   *pLevel;  /* Th
17e20 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20 74 6f  e where level to
17e30 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57   be coded */.  W
17e40 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
17e50 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
17e60 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62 65 69 6e  Loop object bein
17e70 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65  g coded */.  Whe
17e80 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
17e90 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69    /* Decompositi
17ea0 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  on of the entire
17eb0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
17ec0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
17ed0 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
17ee0 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63 6c     /* A WHERE cl
17ef0 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50  ause term */.  P
17f00 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
17f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17f20 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
17f30 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
17f40 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
17f50 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
17f60 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
17f70 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
17f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f90 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
17fa0 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f  ed stmt under co
17fb0 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20  nstructions */. 
17fc0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
17fd0 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20  item *pTabItem; 
17fe0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
17ff0 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64  term being coded
18000 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72   */.  int addrBr
18010 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
18020 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
18030 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
18040 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
18050 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20   int addrCont;  
18060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18070 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
18080 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
18090 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  ext cycle */.  i
180a0 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30  nt iRowidReg = 0
180b0 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ;        /* Rowi
180c0 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  d is stored in t
180d0 68 69 73 20 72 65 67 69 73 74 65 72 2c 20 69 66  his register, if
180e0 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69   not zero */.  i
180f0 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d  nt iReleaseReg =
18100 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70   0;      /* Temp
18110 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65   register to fre
18120 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
18130 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20  ng */..  pParse 
18140 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
18150 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  v = pParse->
18160 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 26  pVdbe;.  pWC = &
18170 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 64  pWInfo->sWC;.  d
18180 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
18190 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
181a0 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20  fo->a[iLevel];. 
181b0 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
181c0 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54 61 62 49  >pWLoop;.  pTabI
181d0 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70  tem = &pWInfo->p
181e0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
181f0 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75  l->iFrom];.  iCu
18200 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
18210 75 72 73 6f 72 3b 0a 20 20 70 4c 65 76 65 6c 2d  ursor;.  pLevel-
18220 3e 6e 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74 52  >notReady = notR
18230 65 61 64 79 20 26 20 7e 67 65 74 4d 61 73 6b 28  eady & ~getMask(
18240 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
18250 74 2c 20 69 43 75 72 29 3b 0a 20 20 62 52 65 76  t, iCur);.  bRev
18260 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76 4d   = (pWInfo->revM
18270 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b 0a  ask>>iLevel)&1;.
18280 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70    omitTable = (p
18290 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
182a0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21  WHERE_IDX_ONLY)!
182b0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 26  =0 .           &
182c0 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
182d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f  Flags & WHERE_FO
182e0 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 20  RCE_TABLE)==0;. 
182f0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
18300 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52  ((v, "Begin WHER
18310 45 2d 4c 6f 6f 70 20 25 64 3a 20 25 73 22 2c 20  E-Loop %d: %s", 
18320 69 4c 65 76 65 6c 2c 70 54 61 62 49 74 65 6d 2d  iLevel,pTabItem-
18330 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
18340 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62  .  /* Create lab
18350 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72 65  els for the "bre
18360 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75  ak" and "continu
18370 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a  e" instructions.
18380 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72    ** for the cur
18390 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70  rent loop.  Jump
183a0 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62   to addrBrk to b
183b0 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f  reak out of a lo
183c0 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f  op..  ** Jump to
183d0 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65   cont to go imme
183e0 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e  diately to the n
183f0 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
18400 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a   the.  ** loop..
18410 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74    **.  ** When t
18420 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70  here is an IN op
18430 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20  erator, we also 
18440 68 61 76 65 20 61 20 22 61 64 64 72 4e 78 74 22  have a "addrNxt"
18450 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a   label that.  **
18460 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e   means to contin
18470 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74  ue with the next
18480 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e   IN value combin
18490 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a  ation.  When.  *
184a0 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49  * there are no I
184b0 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74  N operators in t
184c0 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  he constraints, 
184d0 74 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61  the "addrNxt" la
184e0 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  bel.  ** is the 
184f0 73 61 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b  same as "addrBrk
18500 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72  "..  */.  addrBr
18510 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
18520 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Brk = pLevel->ad
18530 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56  drNxt = sqlite3V
18540 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
18550 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c  .  addrCont = pL
18560 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d  evel->addrCont =
18570 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
18580 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
18590 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72  If this is the r
185a0 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20  ight table of a 
185b0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c  LEFT OUTER JOIN,
185c0 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20   allocate and.  
185d0 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** initialize a 
185e0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74  memory cell that
185f0 20 72 65 63 6f 72 64 73 20 69 66 20 74 68 69 73   records if this
18600 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61   table matches a
18610 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74  ny.  ** row of t
18620 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66  he left table of
18630 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a   the join..  */.
18640 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46    if( pLevel->iF
18650 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74  rom>0 && (pTabIt
18660 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  em[0].jointype &
18670 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a   JT_LEFT)!=0 ){.
18680 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66      pLevel->iLef
18690 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65  tJoin = ++pParse
186a0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
186b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
186c0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
186d0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
186e0 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  n);.    VdbeComm
186f0 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45  ent((v, "init LE
18700 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68  FT JOIN no-match
18710 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20   flag"));.  }.. 
18720 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
18730 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
18740 65 20 73 75 62 71 75 65 72 79 20 69 6d 70 6c 65  e subquery imple
18750 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72  mented as a co-r
18760 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20  outine */.  if( 
18770 70 54 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72  pTabItem->viaCor
18780 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e  outine ){.    in
18790 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61  t regYield = pTa
187a0 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  bItem->regReturn
187b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
187c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
187d0 74 65 67 65 72 2c 20 70 54 61 62 49 74 65 6d 2d  teger, pTabItem-
187e0 3e 61 64 64 72 46 69 6c 6c 53 75 62 2d 31 2c 20  >addrFillSub-1, 
187f0 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 70  regYield);.    p
18800 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 20 73 71 6c  Level->p2 =  sql
18810 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
18820 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59  , OP_Yield, regY
18830 69 65 6c 64 29 3b 0a 20 20 20 20 56 64 62 65 43  ield);.    VdbeC
18840 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74  omment((v, "next
18850 20 72 6f 77 20 6f 66 20 63 6f 2d 72 6f 75 74 69   row of co-routi
18860 6e 65 20 25 73 22 2c 20 70 54 61 62 49 74 65 6d  ne %s", pTabItem
18870 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
18880 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18890 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
188a0 20 72 65 67 59 69 65 6c 64 2b 31 2c 20 61 64 64   regYield+1, add
188b0 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65  rBrk);.    pLeve
188c0 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b  l->op = OP_Goto;
188d0 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
188e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
188f0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
18900 20 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67    (pLoop->wsFlag
18910 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
18920 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
18930 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 54 68    /* Case 1:  Th
18940 65 20 74 61 62 6c 65 20 69 73 20 61 20 76 69 72  e table is a vir
18950 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65  tual-table.  Use
18960 20 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64   the VFilter and
18970 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20   VNext.    **   
18980 20 20 20 20 20 20 20 74 6f 20 61 63 63 65 73 73         to access
18990 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a   the data..    *
189a0 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20  /.    int iReg; 
189b0 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f    /* P3 Value fo
189c0 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a  r OP_VFilter */.
189d0 20 20 20 20 69 6e 74 20 61 64 64 72 4e 6f 74 46      int addrNotF
189e0 6f 75 6e 64 3b 0a 20 20 20 20 69 6e 74 20 6e 43  ound;.    int nC
189f0 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 4c 6f 6f  onstraint = pLoo
18a00 70 2d 3e 6e 4c 54 65 72 6d 3b 0a 0a 20 20 20 20  p->nLTerm;..    
18a10 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
18a20 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
18a30 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
18a40 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
18a50 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  rse, nConstraint
18a60 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 4e 6f 74  +2);.    addrNot
18a70 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e  Found = pLevel->
18a80 61 64 64 72 42 72 6b 3b 0a 20 20 20 20 66 6f 72  addrBrk;.    for
18a90 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61  (j=0; j<nConstra
18aa0 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  int; j++){.     
18ab0 20 69 6e 74 20 69 54 61 72 67 65 74 20 3d 20 69   int iTarget = i
18ac0 52 65 67 2b 6a 2b 32 3b 0a 20 20 20 20 20 20 70  Reg+j+2;.      p
18ad0 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  Term = pLoop->aL
18ae0 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  Term[j];.      i
18af0 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f  f( pTerm==0 ) co
18b00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
18b10 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
18b20 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20  or & WO_IN ){.  
18b30 20 20 20 20 20 20 63 6f 64 65 45 71 75 61 6c 69        codeEquali
18b40 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
18b50 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c  Term, pLevel, j,
18b60 20 62 52 65 76 2c 20 69 54 61 72 67 65 74 29 3b   bRev, iTarget);
18b70 0a 20 20 20 20 20 20 20 20 61 64 64 72 4e 6f 74  .        addrNot
18b80 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e  Found = pLevel->
18b90 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 20 20 7d  addrNxt;.      }
18ba0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
18bb0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
18bc0 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78  arse, pTerm->pEx
18bd0 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72  pr->pRight, iTar
18be0 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  get);.      }.  
18bf0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
18c00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18c10 49 6e 74 65 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e  Integer, pLoop->
18c20 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 69  u.vtab.idxNum, i
18c30 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Reg);.    sqlite
18c40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18c50 50 5f 49 6e 74 65 67 65 72 2c 20 6e 43 6f 6e 73  P_Integer, nCons
18c60 74 72 61 69 6e 74 2c 20 69 52 65 67 2b 31 29 3b  traint, iReg+1);
18c70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18c80 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69  AddOp4(v, OP_VFi
18c90 6c 74 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72  lter, iCur, addr
18ca0 4e 6f 74 46 6f 75 6e 64 2c 20 69 52 65 67 2c 0a  NotFound, iReg,.
18cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cc0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76        pLoop->u.v
18cd0 74 61 62 2e 69 64 78 53 74 72 2c 0a 20 20 20 20  tab.idxStr,.    
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cf0 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
18d00 6e 65 65 64 46 72 65 65 20 3f 20 50 34 5f 4d 50  needFree ? P4_MP
18d10 52 49 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49  RINTF : P4_STATI
18d20 43 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  C);.    pLoop->u
18d30 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
18d40 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   0;.    for(j=0;
18d50 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26   j<nConstraint &
18d60 26 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20  & j<16; j++){.  
18d70 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
18d80 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e  u.vtab.omitMask>
18d90 3e 6a 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20  >j)&1 ){.       
18da0 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
18db0 76 65 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  vel, pLoop->aLTe
18dc0 72 6d 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  rm[j]);.      }.
18dd0 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
18de0 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b  ->op = OP_VNext;
18df0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
18e00 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76  = iCur;.    pLev
18e10 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33  el->p2 = sqlite3
18e20 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
18e30 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  v);.    sqlite3R
18e40 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
18e50 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43  pParse, iReg, nC
18e60 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20  onstraint+2);.  
18e70 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
18e80 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
18e90 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
18ea0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
18eb0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
18ec0 0a 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77  .  if( (pLoop->w
18ed0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
18ee0 50 4b 29 21 3d 30 0a 20 20 20 26 26 20 28 70 4c  PK)!=0.   && (pL
18ef0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  oop->wsFlags & (
18f00 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c  WHERE_COLUMN_IN|
18f10 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29  WHERE_COLUMN_EQ)
18f20 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  )!=0.  ){.    /*
18f30 20 43 61 73 65 20 32 3a 20 20 57 65 20 63 61 6e   Case 2:  We can
18f40 20 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65   directly refere
18f50 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nce a single row
18f60 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
18f70 20 20 20 20 20 20 20 20 20 20 65 71 75 61 6c 69            equali
18f80 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
18f90 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
18fa0 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a  field.  Or.    *
18fb0 2a 20 20 20 20 20 20 20 20 20 20 77 65 20 72 65  *          we re
18fc0 66 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65  ference multiple
18fd0 20 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72   rows using a "r
18fe0 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20  owid IN (...)". 
18ff0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63     **          c
19000 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f  onstruct..    */
19010 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
19020 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d  op->u.btree.nEq=
19030 3d 31 20 29 3b 0a 20 20 20 20 69 52 65 6c 65 61  =1 );.    iRelea
19040 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  seReg = sqlite3G
19050 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
19060 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70  );.    pTerm = p
19070 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b  Loop->aLTerm[0];
19080 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
19090 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  rm!=0 );.    ass
190a0 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ert( pTerm->pExp
190b0 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  r!=0 );.    asse
190c0 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
190d0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
190e0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
190f0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
19100 29 3b 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67  );.    iRowidReg
19110 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54   = codeEqualityT
19120 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
19130 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52  m, pLevel, 0, bR
19140 65 76 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29  ev, iReleaseReg)
19150 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
19160 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
19170 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19180 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
19190 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65  tBeInt, iRowidRe
191a0 67 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  g, addrNxt);.   
191b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
191c0 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
191d0 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78  ts, iCur, addrNx
191e0 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  t, iRowidReg);. 
191f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
19200 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
19210 65 28 70 50 61 72 73 65 2c 20 69 52 6f 77 69 64  e(pParse, iRowid
19220 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  Reg, 1);.    sql
19230 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
19240 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
19250 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
19260 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
19270 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
19280 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
19290 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69  _Noop;.  }else i
192a0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
192b0 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21  gs & WHERE_IPK)!
192c0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
192d0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
192e0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
192f0 4e 47 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  NGE)!=0.  ){.   
19300 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 57 65 20   /* Case 3:  We 
19310 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  have an inequali
19320 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
19330 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
19340 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  field..    */.  
19350 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f    int testOp = O
19360 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  P_Noop;.    int 
19370 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d  start;.    int m
19380 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a  emEndValue = 0;.
19390 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
193a0 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20  Start, *pEnd;.. 
193b0 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
193c0 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 6a  able==0 );.    j
193d0 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
193e0 20 3d 20 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20   = pEnd = 0;.   
193f0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
19400 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
19410 4c 49 4d 49 54 20 29 20 70 53 74 61 72 74 20 3d  LIMIT ) pStart =
19420 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
19430 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  ++];.    if( pLo
19440 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
19450 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 20  ERE_TOP_LIMIT ) 
19460 70 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  pEnd = pLoop->aL
19470 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61  Term[j++];.    a
19480 73 73 65 72 74 28 20 70 53 74 61 72 74 21 3d 30  ssert( pStart!=0
19490 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20   || pEnd!=0 );. 
194a0 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
194b0 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74       pTerm = pSt
194c0 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72  art;.      pStar
194d0 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  t = pEnd;.      
194e0 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pEnd = pTerm;.  
194f0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61    }.    if( pSta
19500 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  rt ){.      Expr
19510 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
19520 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
19530 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73  ion that defines
19540 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64   the start bound
19550 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31   */.      int r1
19560 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20  , rTemp;        
19570 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f 72  /* Registers for
19580 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61   holding the sta
19590 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a  rt boundary */..
195a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
195b0 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20  lowing constant 
195c0 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73  maps TK_xx codes
195d0 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64   into correspond
195e0 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65  ing .      ** se
195f0 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20  ek opcodes.  It 
19600 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72  depends on a par
19610 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67  ticular ordering
19620 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20   of TK_xx.      
19630 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  */.      const u
19640 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a  8 aMoveOp[] = {.
19650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
19660 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47  _GT */  OP_SeekG
19670 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,.           /*
19680 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65   TK_LE */  OP_Se
19690 65 6b 4c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  ekLe,.          
196a0 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50   /* TK_LT */  OP
196b0 5f 53 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20 20  _SeekLt,.       
196c0 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20      /* TK_GE */ 
196d0 20 4f 50 5f 53 65 65 6b 47 65 0a 20 20 20 20 20   OP_SeekGe.     
196e0 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   };.      assert
196f0 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31  ( TK_LE==TK_GT+1
19700 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65   );      /* Make
19710 20 73 75 72 65 20 74 68 65 20 6f 72 64 65 72 69   sure the orderi
19720 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ng.. */.      as
19730 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f  sert( TK_LT==TK_
19740 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+2 );      /* 
19750 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78   ... of the TK_x
19760 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20  x values... */. 
19770 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
19780 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20  GE==TK_GT+3 );  
19790 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63      /*  ... is c
197a0 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20  orrecct. */..   
197b0 20 20 20 61 73 73 65 72 74 28 20 28 70 53 74 61     assert( (pSta
197c0 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
197d0 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a  RM_VNULL)==0 );.
197e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
197f0 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  pStart->wtFlags 
19800 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
19810 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53 74  ;.      pX = pSt
19820 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  art->pExpr;.    
19830 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
19840 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
19850 65 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43  e( pStart->leftC
19860 75 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f  ursor!=iCur ); /
19870 2a 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e  * transitive con
19880 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
19890 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
198a0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
198b0 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26  e, pX->pRight, &
198c0 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  rTemp);.      sq
198d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
198e0 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f  v, aMoveOp[pX->o
198f0 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20  p-TK_GT], iCur, 
19900 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20  addrBrk, r1);.  
19910 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
19920 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
19930 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
19940 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
19950 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b  (pParse, r1, 1);
19960 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
19970 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
19980 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20  rse, rTemp);.   
19990 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
199a0 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a  Level, pStart);.
199b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
199c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
199d0 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f  p2(v, bRev ? OP_
199e0 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64  Last : OP_Rewind
199f0 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29  , iCur, addrBrk)
19a00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19a10 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78  pEnd ){.      Ex
19a20 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58  pr *pX;.      pX
19a30 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a   = pEnd->pExpr;.
19a40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
19a50 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
19a60 65 72 74 28 20 28 70 45 6e 64 2d 3e 77 74 46 6c  ert( (pEnd->wtFl
19a70 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
19a80 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  )==0 );.      te
19a90 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 6c 65  stcase( pEnd->le
19aa0 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29  ftCursor!=iCur )
19ab0 3b 20 2f 2a 20 54 72 61 6e 73 69 74 69 76 65 20  ; /* Transitive 
19ac0 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
19ad0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
19ae0 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
19af0 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
19b00 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65       memEndValue
19b10 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
19b20 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
19b30 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
19b40 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d   pX->pRight, mem
19b50 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  EndValue);.     
19b60 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
19b70 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LT || pX->op==TK
19b80 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74  _GT ){.        t
19b90 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
19ba0 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20  P_Le : OP_Ge;.  
19bb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19bc0 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76     testOp = bRev
19bd0 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74   ? OP_Lt : OP_Gt
19be0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19bf0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
19c00 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d  el, pEnd);.    }
19c10 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c  .    start = sql
19c20 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
19c30 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76  ddr(v);.    pLev
19c40 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20  el->op = bRev ? 
19c50 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78  OP_Prev : OP_Nex
19c60 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  t;.    pLevel->p
19c70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c  1 = iCur;.    pL
19c80 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74  evel->p2 = start
19c90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
19ca0 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20  evel->p5==0 );. 
19cb0 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f     if( testOp!=O
19cc0 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
19cd0 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c  iRowidReg = iRel
19ce0 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65  easeReg = sqlite
19cf0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
19d00 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
19d10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19d20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20  OP_Rowid, iCur, 
19d30 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
19d40 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
19d50 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
19d60 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
19d70 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
19d80 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19d90 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56   testOp, memEndV
19da0 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69  alue, addrBrk, i
19db0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
19dc0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
19dd0 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41  geP5(v, SQLITE_A
19de0 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c  FF_NUMERIC | SQL
19df0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
19e00 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
19e10 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
19e20 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
19e30 44 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  D ){.    /* Case
19e40 20 34 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67   4: A scan using
19e50 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a   an index..    *
19e60 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
19e70 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
19e80 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65  e may contain ze
19e90 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c  ro or more equal
19ea0 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  ity .    **     
19eb0 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20      terms ("==" 
19ec0 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  or "IN" operator
19ed0 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  s) that refer to
19ee0 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20   the N.    **   
19ef0 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20        left-most 
19f00 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
19f10 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73  ndex. It may als
19f20 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a  o contain.    **
19f30 20 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c           inequal
19f40 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
19f50 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29  (>, <, >= or <=)
19f60 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a   on the indexed.
19f70 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
19f80 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64  olumn that immed
19f90 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74  iately follows t
19fa0 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e  he N equalities.
19fb0 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20   Only .    **   
19fc0 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d        the right-
19fd0 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  most column can 
19fe0 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  be an inequality
19ff0 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74   - the rest must
1a000 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1a010 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64  use the "==" and
1a020 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e   "IN" operators.
1a030 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
1a040 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20   the .    **    
1a050 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e       index is on
1a060 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74   (x,y,z), then t
1a070 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61  he following cla
1a080 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20  uses are all .  
1a090 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74    **         opt
1a0a0 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20  imized:.    **. 
1a0b0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1a0c0 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20   x=5.    **     
1a0d0 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
1a0e0 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  =10.    **      
1a0f0 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c        x=5 AND y<
1a100 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
1a110 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35       x=5 AND y>5
1a120 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
1a130 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1a140 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31  AND y=5 AND z<=1
1a150 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  0.    **.    ** 
1a160 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30          The z<10
1a170 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c   term of the fol
1a180 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65  lowing cannot be
1a190 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20   used, only.    
1a1a0 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78  **         the x
1a1b0 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a  =5 term:.    **.
1a1c0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1a1d0 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20    x=5 AND z<10. 
1a1e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1a1f0 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65       N may be ze
1a200 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
1a210 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1a220 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20  raints..    **  
1a230 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20         If there 
1a240 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74  are no inequalit
1a250 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  y constraints, t
1a260 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20  hen N is at.    
1a270 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74  **         least
1a280 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   one..    **.   
1a290 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73   **         This
1a2a0 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73   case is also us
1a2b0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
1a2c0 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
1a2d0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
1a2e0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74   constraints but
1a2f0 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c   an index is sel
1a300 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e  ected anyway, in
1a310 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20   order.    **   
1a320 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74        to force t
1a330 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  he output order 
1a340 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e  to conform to an
1a350 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a   ORDER BY..    *
1a360 2f 20 20 0a 20 20 20 20 73 74 61 74 69 63 20 63  /  .    static c
1a370 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f 70  onst u8 aStartOp
1a380 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a  [] = {.      0,.
1a390 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f        0,.      O
1a3a0 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20  P_Rewind,       
1a3b0 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72      /* 2: (!star
1a3c0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  t_constraints &&
1a3d0 20 73 74 61 72 74 45 71 20 26 26 20 20 21 62 52   startEq &&  !bR
1a3e0 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1a3f0 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Last,           
1a400 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f    /* 3: (!start_
1a410 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
1a420 74 61 72 74 45 71 20 26 26 20 20 20 62 52 65 76  tartEq &&   bRev
1a430 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
1a440 65 6b 47 74 2c 20 20 20 20 20 20 20 20 20 20 20  ekGt,           
1a450 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 4: (start_con
1a460 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74  straints  && !st
1a470 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20  artEq && !bRev) 
1a480 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
1a490 4c 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Lt,           /*
1a4a0 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   5: (start_const
1a4b0 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
1a4c0 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f  tEq &&  bRev) */
1a4d0 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 65  .      OP_SeekGe
1a4e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36  ,           /* 6
1a4f0 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
1a500 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45  ints  &&  startE
1a510 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  q && !bRev) */. 
1a520 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 65 20 20       OP_SeekLe  
1a530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20            /* 7: 
1a540 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1a550 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
1a560 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &&  bRev) */.   
1a570 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
1a580 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d  onst u8 aEndOp[]
1a590 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f   = {.      OP_No
1a5a0 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
1a5b0 2f 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73  /* 0: (!end_cons
1a5c0 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20  traints) */.    
1a5d0 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20    OP_IdxGE,     
1a5e0 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e         /* 1: (en
1a5f0 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
1a600 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
1a610 20 4f 50 5f 49 64 78 4c 54 20 20 20 20 20 20 20   OP_IdxLT       
1a620 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64        /* 2: (end
1a630 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1a640 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a  bRev) */.    };.
1a650 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c      int nEq = pL
1a660 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1a670 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
1a680 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a  == or IN terms *
1a690 2f 0a 20 20 20 20 69 6e 74 20 69 73 4d 69 6e 51  /.    int isMinQ
1a6a0 75 65 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20  uery = 0;       
1a6b0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
1a6c0 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20  is an optimized 
1a6d0 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e 20  SELECT min(x).. 
1a6e0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42 61  */.    int regBa
1a6f0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
1a700 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
1a710 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e  ster holding con
1a720 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a  straint values *
1a730 2f 0a 20 20 20 20 69 6e 74 20 72 31 3b 20 20 20  /.    int r1;   
1a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a750 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73     /* Temp regis
1a760 74 65 72 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  ter */.    Where
1a770 54 65 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72  Term *pRangeStar
1a780 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75  t = 0;  /* Inequ
1a790 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1a7a0 20 61 74 20 72 61 6e 67 65 20 73 74 61 72 74 20   at range start 
1a7b0 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
1a7c0 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b   *pRangeEnd = 0;
1a7d0 20 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74      /* Inequalit
1a7e0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
1a7f0 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20  range end */.   
1a800 20 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20   int startEq;   
1a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a820 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 73   True if range s
1a830 74 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d  tart uses ==, >=
1a840 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e   or <= */.    in
1a850 74 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20  t endEq;        
1a860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1a870 75 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20  ue if range end 
1a880 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c  uses ==, >= or <
1a890 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61  = */.    int sta
1a8a0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20  rt_constraints; 
1a8b0 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
1a8c0 66 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74  f range is const
1a8d0 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e  rained */.    in
1a8e0 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20  t nConstraint;  
1a8f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1a900 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69  mber of constrai
1a910 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  nt terms */.    
1a920 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
1a930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a940 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c  The index we wil
1a950 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20  l be using */.  
1a960 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20    int iIdxCur;  
1a970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a980 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
1a990 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  r for the index 
1a9a0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72  */.    int nExtr
1a9b0 61 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  aReg = 0;       
1a9c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1a9d0 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73   extra registers
1a9e0 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69   needed */.    i
1a9f0 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
1aa00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1aa10 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64  nstruction opcod
1aa20 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
1aa30 53 74 61 72 74 41 66 66 3b 20 20 20 20 20 20 20  StartAff;       
1aa40 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
1aa50 79 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 72  y for start of r
1aa60 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ange constraint 
1aa70 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 6e  */.    char *zEn
1aa80 64 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  dAff;           
1aa90 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
1aaa0 66 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e 67 65  for end of range
1aab0 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 0a   constraint */..
1aac0 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70      pIdx = pLoop
1aad0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1aae0 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20  ;.    iIdxCur = 
1aaf0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
1ab00 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
1ab10 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20   loop satisfies 
1ab20 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f  a sort order (pO
1ab30 72 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20  rderBy) request 
1ab40 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73  that .    ** was
1ab50 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
1ab60 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c  function to impl
1ab70 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20  ement a "SELECT 
1ab80 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20  min(x) ..." .   
1ab90 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20   ** query, then 
1aba0 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
1abb0 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c  only allow the l
1abc0 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20  oop to run for. 
1abd0 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69     ** a single i
1abe0 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d  teration. This m
1abf0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69  eans that the fi
1ac00 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64  rst row returned
1ac10 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e  .    ** should n
1ac20 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76  ot have a NULL v
1ac30 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27  alue stored in '
1ac40 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78  x'. If column 'x
1ac50 27 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ' is.    ** the 
1ac60 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20  first one after 
1ac70 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79  the nEq equality
1ac80 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
1ac90 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a  the index,.    *
1aca0 2a 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20  * this requires 
1acb0 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e  some special han
1acc0 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  dling..    */.  
1acd0 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
1ace0 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
1acf0 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a  ORDERBY_MIN)!=0.
1ad00 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
1ad10 3e 62 4f 42 53 61 74 21 3d 30 29 0a 20 20 20 20  >bOBSat!=0).    
1ad20 20 26 26 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43   && (pIdx->nKeyC
1ad30 6f 6c 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20  ol>nEq).    ){. 
1ad40 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
1ad50 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d  pOrderBy->nExpr=
1ad60 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f  =1 ); */.      /
1ad70 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72  * assert( pOrder
1ad80 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  By->a[0].pExpr->
1ad90 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61  iColumn==pIdx->a
1ada0 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20  iColumn[nEq] ); 
1adb0 2a 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75  */.      isMinQu
1adc0 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e  ery = 1;.      n
1add0 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
1ade0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64    }..    /* Find
1adf0 20 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20   any inequality 
1ae00 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
1ae10 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 61   for the start a
1ae20 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f  nd end .    ** o
1ae30 66 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20  f the range. .  
1ae40 20 20 2a 2f 0a 20 20 20 20 6a 20 3d 20 6e 45 71    */.    j = nEq
1ae50 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  ;.    if( pLoop-
1ae60 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1ae70 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
1ae80 20 20 20 20 70 52 61 6e 67 65 53 74 61 72 74 20      pRangeStart 
1ae90 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
1aea0 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74  j++];.      nExt
1aeb0 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d  raReg = 1;.    }
1aec0 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1aed0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1aee0 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  TOP_LIMIT ){.   
1aef0 20 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 70     pRangeEnd = p
1af00 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b  Loop->aLTerm[j++
1af10 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52  ];.      nExtraR
1af20 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  eg = 1;.    }.. 
1af30 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
1af40 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
1af50 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  all constraint t
1af60 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72  erms using == or
1af70 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73   IN.    ** and s
1af80 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73 20  tore the values 
1af90 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69  of those terms i
1afa0 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
1afb0 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73  gisters.    ** s
1afc0 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 42 61  tarting at regBa
1afd0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  se..    */.    r
1afe0 65 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c  egBase = codeAll
1aff0 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50  EqualityTerms(pP
1b000 61 72 73 65 2c 70 4c 65 76 65 6c 2c 62 52 65 76  arse,pLevel,bRev
1b010 2c 6e 45 78 74 72 61 52 65 67 2c 26 7a 53 74 61  ,nExtraReg,&zSta
1b020 72 74 41 66 66 29 3b 0a 20 20 20 20 7a 45 6e 64  rtAff);.    zEnd
1b030 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Aff = sqlite3DbS
1b040 74 72 44 75 70 28 64 62 2c 20 7a 53 74 61 72 74  trDup(db, zStart
1b050 41 66 66 29 3b 0a 20 20 20 20 61 64 64 72 4e 78  Aff);.    addrNx
1b060 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  t = pLevel->addr
1b070 4e 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  Nxt;..    /* If 
1b080 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72  we are doing a r
1b090 65 76 65 72 73 65 20 6f 72 64 65 72 20 73 63 61  everse order sca
1b0a0 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e  n on an ascendin
1b0b0 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20  g index, or.    
1b0c0 2a 2a 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64  ** a forward ord
1b0d0 65 72 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73  er scan on a des
1b0e0 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69  cending index, i
1b0f0 6e 74 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a  nterchange the .
1b100 20 20 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64      ** start and
1b110 20 65 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e   end terms (pRan
1b120 67 65 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e  geStart and pRan
1b130 67 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  geEnd)..    */. 
1b140 20 20 20 69 66 28 20 28 6e 45 71 3c 70 49 64 78     if( (nEq<pIdx
1b150 2d 3e 6e 4b 65 79 43 6f 6c 20 26 26 20 62 52 65  ->nKeyCol && bRe
1b160 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f  v==(pIdx->aSortO
1b170 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54  rder[nEq]==SQLIT
1b180 45 5f 53 4f 5f 41 53 43 29 29 0a 20 20 20 20 20  E_SO_ASC)).     
1b190 7c 7c 20 28 62 52 65 76 20 26 26 20 70 49 64 78  || (bRev && pIdx
1b1a0 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 45 71 29 0a  ->nKeyCol==nEq).
1b1b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 53 57 41      ){.      SWA
1b1c0 50 28 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70  P(WhereTerm *, p
1b1d0 52 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65  RangeEnd, pRange
1b1e0 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  Start);.    }.. 
1b1f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
1b200 6e 67 65 53 74 61 72 74 20 26 26 20 28 70 52 61  ngeStart && (pRa
1b210 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
1b220 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20  tor & WO_LE)!=0 
1b230 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1b240 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20   pRangeStart && 
1b250 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f  (pRangeStart->eO
1b260 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29  perator & WO_GE)
1b270 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
1b280 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26  ase( pRangeEnd &
1b290 26 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  & (pRangeEnd->eO
1b2a0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29  perator & WO_LE)
1b2b0 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
1b2c0 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26  ase( pRangeEnd &
1b2d0 26 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  & (pRangeEnd->eO
1b2e0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29  perator & WO_GE)
1b2f0 21 3d 30 20 29 3b 0a 20 20 20 20 73 74 61 72 74  !=0 );.    start
1b300 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74 61 72  Eq = !pRangeStar
1b310 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61 72 74  t || pRangeStart
1b320 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1b330 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20  O_LE|WO_GE);.   
1b340 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e   endEq =   !pRan
1b350 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45  geEnd || pRangeE
1b360 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
1b370 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20  (WO_LE|WO_GE);. 
1b380 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61     start_constra
1b390 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53 74 61  ints = pRangeSta
1b3a0 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20  rt || nEq>0;..  
1b3b0 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 69 6e    /* Seek the in
1b3c0 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20 74 68  dex cursor to th
1b3d0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
1b3e0 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f  ange. */.    nCo
1b3f0 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a  nstraint = nEq;.
1b400 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 53 74      if( pRangeSt
1b410 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70  art ){.      Exp
1b420 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e  r *pRight = pRan
1b430 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e  geStart->pExpr->
1b440 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71  pRight;.      sq
1b450 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1b460 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65  arse, pRight, re
1b470 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
1b480 20 20 69 66 28 20 28 70 52 61 6e 67 65 53 74 61    if( (pRangeSta
1b490 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
1b4a0 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  RM_VNULL)==0 ){.
1b4b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1b4c0 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d  xprCodeIsNullJum
1b4d0 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67  p(v, pRight, reg
1b4e0 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78  Base+nEq, addrNx
1b4f0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1b500 20 20 69 66 28 20 7a 53 74 61 72 74 41 66 66 20    if( zStartAff 
1b510 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
1b520 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1b530 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 53  inity(pRight, zS
1b540 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 3d 3d 53  tartAff[nEq])==S
1b550 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b  QLITE_AFF_NONE){
1b560 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  .          /* Si
1b570 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  nce the comparis
1b580 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72 66  on is to be perf
1b590 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f  ormed with no co
1b5a0 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20  nversions.      
1b5b0 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74      ** applied t
1b5c0 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20  o the operands, 
1b5d0 73 65 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  set the affinity
1b5e0 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69   to apply to pRi
1b5f0 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20  ght to .        
1b600 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    ** SQLITE_AFF_
1b610 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20  NONE.  */.      
1b620 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45      zStartAff[nE
1b630 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  q] = SQLITE_AFF_
1b640 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
1b650 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1b660 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
1b670 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
1b680 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e  ght, zStartAff[n
1b690 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Eq]) ){.        
1b6a0 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d    zStartAff[nEq]
1b6b0 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
1b6c0 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
1b6d0 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20 6e 43      }  .      nC
1b6e0 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
1b6f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
1b700 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67  ngeStart->wtFlag
1b710 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
1b720 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
1b730 28 20 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a  ( isMinQuery ){.
1b740 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b750 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1b760 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e  ll, 0, regBase+n
1b770 45 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73  Eq);.      nCons
1b780 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  traint++;.      
1b790 73 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20  startEq = 0;.   
1b7a0 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61     start_constra
1b7b0 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ints = 1;.    }.
1b7c0 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66      codeApplyAff
1b7d0 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65  inity(pParse, re
1b7e0 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
1b7f0 6e 74 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a  nt, zStartAff);.
1b800 20 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f      op = aStartO
1b810 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  p[(start_constra
1b820 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72  ints<<2) + (star
1b830 74 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b  tEq<<1) + bRev];
1b840 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 21  .    assert( op!
1b850 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
1b860 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e  se( op==OP_Rewin
1b870 64 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  d );.    testcas
1b880 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29  e( op==OP_Last )
1b890 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1b8a0 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b  op==OP_SeekGt );
1b8b0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
1b8c0 70 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a  p==OP_SeekGe );.
1b8d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1b8e0 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20  ==OP_SeekLe );. 
1b8f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1b900 3d 4f 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20  =OP_SeekLt );.  
1b910 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b920 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49  Op4Int(v, op, iI
1b930 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20  dxCur, addrNxt, 
1b940 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72  regBase, nConstr
1b950 61 69 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c  aint);..    /* L
1b960 6f 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f  oad the value fo
1b970 72 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79  r the inequality
1b980 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74   constraint at t
1b990 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
1b9a0 20 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61    ** range (if a
1b9b0 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ny)..    */.    
1b9c0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45  nConstraint = nE
1b9d0 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67  q;.    if( pRang
1b9e0 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78  eEnd ){.      Ex
1b9f0 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61  pr *pRight = pRa
1ba00 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70  ngeEnd->pExpr->p
1ba10 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c  Right;.      sql
1ba20 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
1ba30 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  ove(pParse, regB
1ba40 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20  ase+nEq, 1);.   
1ba50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1ba60 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
1ba70 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  t, regBase+nEq);
1ba80 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e  .      if( (pRan
1ba90 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26  geEnd->wtFlags &
1baa0 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
1bab0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1bac0 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c  e3ExprCodeIsNull
1bad0 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20  Jump(v, pRight, 
1bae0 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64  regBase+nEq, add
1baf0 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rNxt);.      }. 
1bb00 20 20 20 20 20 69 66 28 20 7a 45 6e 64 41 66 66       if( zEndAff
1bb10 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1bb20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1bb30 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a  finity(pRight, z
1bb40 45 6e 64 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51  EndAff[nEq])==SQ
1bb50 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a  LITE_AFF_NONE){.
1bb60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e            /* Sin
1bb70 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ce the compariso
1bb80 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f  n is to be perfo
1bb90 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e  rmed with no con
1bba0 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20  versions.       
1bbb0 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f     ** applied to
1bbc0 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73   the operands, s
1bbd0 65 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  et the affinity 
1bbe0 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67  to apply to pRig
1bbf0 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20  ht to .         
1bc00 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   ** SQLITE_AFF_N
1bc10 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ONE.  */.       
1bc20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20     zEndAff[nEq] 
1bc30 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
1bc40 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
1bc50 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1bc60 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
1bc70 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
1bc80 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 20  , zEndAff[nEq]) 
1bc90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e  ){.          zEn
1bca0 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49  dAff[nEq] = SQLI
1bcb0 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
1bcc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20       }.      }  
1bcd0 0a 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79  .      codeApply
1bce0 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
1bcf0 20 72 65 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c   regBase, nEq+1,
1bd00 20 7a 45 6e 64 41 66 66 29 3b 0a 20 20 20 20 20   zEndAff);.     
1bd10 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
1bd20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bd30 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61  pRangeEnd->wtFla
1bd40 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
1bd50 4c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  L );.    }.    s
1bd60 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1bd70 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20   zStartAff);.   
1bd80 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1bd90 62 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 0a 20 20  b, zEndAff);..  
1bda0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
1bdb0 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20  loop body */.   
1bdc0 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71   pLevel->p2 = sq
1bdd0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1bde0 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  Addr(v);..    /*
1bdf0 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 6e   Check if the in
1be00 64 65 78 20 63 75 72 73 6f 72 20 69 73 20 70 61  dex cursor is pa
1be10 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
1be20 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20  e range. */.    
1be30 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61  op = aEndOp[(pRa
1be40 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a  ngeEnd || nEq) *
1be50 20 28 31 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20   (1 + bRev)];.  
1be60 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1be70 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20 20 74  OP_Noop );.    t
1be80 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1be90 49 64 78 47 45 20 29 3b 0a 20 20 20 20 74 65 73  IdxGE );.    tes
1bea0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64  tcase( op==OP_Id
1beb0 78 4c 54 20 29 3b 0a 20 20 20 20 69 66 28 20 6f  xLT );.    if( o
1bec0 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
1bed0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bee0 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20  ddOp4Int(v, op, 
1bef0 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74  iIdxCur, addrNxt
1bf00 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73  , regBase, nCons
1bf10 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  traint);.      s
1bf20 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1bf30 50 35 28 76 2c 20 65 6e 64 45 71 21 3d 62 52 65  P5(v, endEq!=bRe
1bf40 76 20 3f 31 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a  v ?1:0);.    }..
1bf50 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1bf60 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  are inequality c
1bf70 6f 6e 73 74 72 61 69 6e 74 73 2c 20 63 68 65 63  onstraints, chec
1bf80 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
1bf90 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  .    ** of the t
1bfa0 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74  able column that
1bfb0 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20   the inequality 
1bfc0 63 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f 74  contrains is not
1bfd0 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49 66   NULL..    ** If
1bfe0 20 69 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f 20   it is, jump to 
1bff0 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
1c000 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  on of the loop..
1c010 20 20 20 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20      */.    r1 = 
1c020 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
1c030 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 74  g(pParse);.    t
1c040 65 73 74 63 61 73 65 28 20 70 4c 6f 6f 70 2d 3e  estcase( pLoop->
1c050 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1c060 42 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20  BTM_LIMIT );.   
1c070 20 74 65 73 74 63 61 73 65 28 20 70 4c 6f 6f 70   testcase( pLoop
1c080 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1c090 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a 20  E_TOP_LIMIT );. 
1c0a0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
1c0b0 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
1c0c0 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f  BTM_LIMIT|WHERE_
1c0d0 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 20 29  TOP_LIMIT))!=0 )
1c0e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1c0f0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1c100 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c  Column, iIdxCur,
1c110 20 6e 45 71 2c 20 72 31 29 3b 0a 20 20 20 20 20   nEq, r1);.     
1c120 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c130 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
1c140 20 72 31 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a   r1, addrCont);.
1c150 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1c160 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1c170 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20  pParse, r1);..  
1c180 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61    /* Seek the ta
1c190 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72  ble cursor, if r
1c1a0 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64  equired */.    d
1c1b0 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1c1c0 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b  l, pRangeStart);
1c1d0 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d  .    disableTerm
1c1e0 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45  (pLevel, pRangeE
1c1f0 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 6f 6d 69  nd);.    if( omi
1c200 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  tTable ){.      
1c210 2f 2a 20 70 49 64 78 20 69 73 20 61 20 63 6f 76  /* pIdx is a cov
1c220 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 4e 6f  ering index.  No
1c230 20 6e 65 65 64 20 74 6f 20 61 63 63 65 73 73 20   need to access 
1c240 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20  the main table. 
1c250 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  */.    }else if(
1c260 20 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d 3e   HasRowid(pIdx->
1c270 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20  pTable) ){.     
1c280 20 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65   iRowidReg = iRe
1c290 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74  leaseReg = sqlit
1c2a0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
1c2b0 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1c2c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c2d0 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49   OP_IdxRowid, iI
1c2e0 64 78 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67  dxCur, iRowidReg
1c2f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c300 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
1c310 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
1c320 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1c330 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c340 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c  dOp2(v, OP_Seek,
1c350 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67   iCur, iRowidReg
1c360 29 3b 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20  );  /* Deferred 
1c370 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  seek */.    }els
1c380 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
1c390 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
1c3a0 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64  maryKeyIndex(pId
1c3b0 78 2d 3e 70 54 61 62 6c 65 29 3b 0a 20 20 20 20  x->pTable);.    
1c3c0 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 73 71    iRowidReg = sq
1c3d0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
1c3e0 65 28 70 50 61 72 73 65 2c 20 70 50 6b 2d 3e 6e  e(pParse, pPk->n
1c3f0 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20 66  KeyCol);.      f
1c400 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e  or(j=0; j<pPk->n
1c410 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  KeyCol; j++){.  
1c420 20 20 20 20 20 20 6b 20 3d 20 73 71 6c 69 74 65        k = sqlite
1c430 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70  3ColumnOfIndex(p
1c440 49 64 78 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  Idx, pPk->aiColu
1c450 6d 6e 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20  mn[j]);.        
1c460 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c470 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
1c480 69 49 64 78 43 75 72 2c 20 6b 2c 20 69 52 6f 77  iIdxCur, k, iRow
1c490 69 64 52 65 67 2b 6a 29 3b 0a 20 20 20 20 20 20  idReg+j);.      
1c4a0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
1c4b0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
1c4c0 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 43 75  OP_NotFound, iCu
1c4d0 72 2c 20 61 64 64 72 43 6f 6e 74 2c 0a 20 20 20  r, addrCont,.   
1c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4f0 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 52 65          iRowidRe
1c500 67 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29  g, pPk->nKeyCol)
1c510 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1c520 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72  Record the instr
1c530 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74  uction used to t
1c540 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
1c550 70 2e 20 44 69 73 61 62 6c 65 20 0a 20 20 20 20  p. Disable .    
1c560 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
1c570 74 65 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e  terms made redun
1c580 64 61 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65  dant by the inde
1c590 78 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20  x range scan..  
1c5a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f    */.    if( pLo
1c5b0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1c5c0 45 52 45 5f 4f 4e 45 52 4f 57 20 29 7b 0a 20 20  ERE_ONEROW ){.  
1c5d0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1c5e0 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65   OP_Noop;.    }e
1c5f0 6c 73 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a  lse if( bRev ){.
1c600 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
1c610 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20   = OP_Prev;.    
1c620 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
1c630 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78  vel->op = OP_Nex
1c640 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65  t;.    }.    pLe
1c650 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75  vel->p1 = iIdxCu
1c660 72 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  r;.    if( (pLoo
1c670 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1c680 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 3d 3d  RE_CONSTRAINT)==
1c690 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  0 ){.      pLeve
1c6a0 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53  l->p5 = SQLITE_S
1c6b0 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
1c6c0 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c  AN_STEP;.    }el
1c6d0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1c6e0 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20  ( pLevel->p5==0 
1c6f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
1c700 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1c710 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
1c720 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 6f 6f  ATION.  if( pLoo
1c730 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1c740 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
1c750 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54     /* Case 5:  T
1c760 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
1c770 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65  ately indexed te
1c780 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
1c790 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   OR.    **.    *
1c7a0 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
1c7b0 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  *.    **   CREAT
1c7c0 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63  E TABLE t1(a,b,c
1c7d0 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  ,d);.    **   CR
1c7e0 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
1c7f0 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(a);.    **  
1c800 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
1c810 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a   ON t1(b);.    *
1c820 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
1c830 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20   i3 ON t1(c);.  
1c840 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
1c850 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1c860 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20  HERE a=5 OR b=7 
1c870 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31  OR (c=11 AND d=1
1c880 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  3).    **.    **
1c890 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c   In the example,
1c8a0 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65   there are three
1c8b0 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
1c8c0 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a  onnected by OR..
1c8d0 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f      ** The top o
1c8e0 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73  f the loop looks
1c8f0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
1c900 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1c910 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
1c920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1c930 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
1c940 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
1c950 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f  .    ** Then, fo
1c960 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74  r each indexed t
1c970 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  erm, the followi
1c980 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  ng. The argument
1c990 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53  s to.    ** RowS
1c9a0 65 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20  etTest are such 
1c9b0 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f  that the rowid o
1c9c0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
1c9d0 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20  w is inserted.  
1c9e0 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f    ** into the Ro
1c9f0 77 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61  wSet. If it is a
1ca00 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20  lready present, 
1ca10 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68  control skips th
1ca20 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f  e.    ** Gosub o
1ca30 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20  pcode and jumps 
1ca40 73 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20  straight to the 
1ca50 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
1ca60 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20  y WhereEnd()..  
1ca70 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1ca80 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
1ca90 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20  egin(<term>).   
1caa0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77   **          Row
1cab0 53 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20  SetTest         
1cac0 20 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72           # Inser
1cad0 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77  t rowid into row
1cae0 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  set.    **      
1caf0 20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32      Gosub      2
1cb00 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   A.    **       
1cb10 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1cb20 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ().    **.    **
1cb30 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61   Following the a
1cb40 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65  bove, code to te
1cb50 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
1cb60 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74  . Label A, the t
1cb70 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20  arget.    ** of 
1cb80 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c  the Gosub above,
1cb90 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e   jumps to the in
1cba0 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20  struction right 
1cbb0 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a  after the Goto..
1cbc0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1cbd0 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20         Null     
1cbe0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
1cbf0 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f     # Zero the ro
1cc00 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20  wset in reg 1.  
1cc10 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
1cc20 74 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20  to       B      
1cc30 20 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20            # The 
1cc40 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64  loop is finished
1cc50 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1cc60 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62        A: <loop b
1cc70 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20  ody>            
1cc80 20 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61       # Return da
1cc90 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20  ta, whatever..  
1cca0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1ccb0 20 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20       Return     
1ccc0 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
1ccd0 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20   # Jump back to 
1cce0 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a  the Gosub.    **
1ccf0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a  .    **       B:
1cd00 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70   <after the loop
1cd10 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a  >.    **.    */.
1cd20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
1cd30 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68  *pOrWc;    /* Th
1cd40 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b  e OR-clause brok
1cd50 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74  en out into subt
1cd60 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c  erms */.    SrcL
1cd70 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20 20  ist *pOrTab;    
1cd80 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20     /* Shortened 
1cd90 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52  table list or OR
1cda0 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74 69  -clause generati
1cdb0 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  on */.    Index 
1cdc0 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20 20 20  *pCov = 0;      
1cdd0 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74         /* Potent
1cde0 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ial covering ind
1cdf0 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ex (or NULL) */.
1ce00 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75 72 20      int iCovCur 
1ce10 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
1ce20 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65  ;  /* Cursor use
1ce30 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63 61 6e  d for index scan
1ce40 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20  s (if any) */.. 
1ce50 20 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e     int regReturn
1ce60 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1ce70 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
1ce80 52 65 67 69 73 74 65 72 20 75 73 65 64 20 77 69  Register used wi
1ce90 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20  th OP_Gosub */. 
1cea0 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73 65 74     int regRowset
1ceb0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ced0 52 65 67 69 73 74 65 72 20 66 6f 72 20 52 6f 77  Register for Row
1cee0 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  Set object */.  
1cef0 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d    int regRowid =
1cf00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1cf10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1cf20 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
1cf30 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74  rowid */.    int
1cf40 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c   iLoopBody = sql
1cf50 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1cf60 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72 74 20  l(v);  /* Start 
1cf70 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a  of loop body */.
1cf80 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e 69 74      int iRetInit
1cf90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cfb0 20 41 64 64 72 65 73 73 20 6f 66 20 72 65 67 52   Address of regR
1cfc0 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20  eturn init */.  
1cfd0 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64 54 65    int untestedTe
1cfe0 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  rms = 0;        
1cff0 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72       /* Some ter
1d000 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  ms not completel
1d010 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 20 20  y tested */.    
1d020 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
1d030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d040 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1d050 65 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  er */.    Expr *
1d060 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20 20  pAndExpr = 0;   
1d070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d080 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29  An ".. AND (...)
1d090 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  " expression */.
1d0a0 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20     .    pTerm = 
1d0b0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  pLoop->aLTerm[0]
1d0c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
1d0d0 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  erm!=0 );.    as
1d0e0 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
1d0f0 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29  erator & WO_OR )
1d100 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
1d110 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1d120 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20  TERM_ORINFO)!=0 
1d130 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26  );.    pOrWc = &
1d140 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
1d150 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c  ->wc;.    pLevel
1d160 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e  ->op = OP_Return
1d170 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
1d180 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20   = regReturn;.. 
1d190 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e     /* Set up a n
1d1a0 65 77 20 53 72 63 4c 69 73 74 20 69 6e 20 70 4f  ew SrcList in pO
1d1b0 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rTab containing 
1d1c0 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
1d1d0 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62  scanned.    ** b
1d1e0 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74  y this loop in t
1d1f0 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64  he a[0] slot and
1d200 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61   all notReady ta
1d210 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73  bles in a[1..] s
1d220 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69  lots..    ** Thi
1d230 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72  s becomes the Sr
1d240 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65 63  cList in the rec
1d250 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73  ursive call to s
1d260 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1d270 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ()..    */.    i
1d280 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  f( pWInfo->nLeve
1d290 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  l>1 ){.      int
1d2a0 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20   nNotReady;     
1d2b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d2c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74  he number of not
1d2d0 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a  Ready tables */.
1d2e0 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
1d2f0 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53  List_item *origS
1d300 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  rc;     /* Origi
1d310 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c  nal list of tabl
1d320 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74  es */.      nNot
1d330 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e  Ready = pWInfo->
1d340 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20  nLevel - iLevel 
1d350 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61  - 1;.      pOrTa
1d360 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b  b = sqlite3Stack
1d370 41 6c 6c 6f 63 52 61 77 28 64 62 2c 0a 20 20 20  AllocRaw(db,.   
1d380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d390 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
1d3a0 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65  *pOrTab)+ nNotRe
1d3b0 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61  ady*sizeof(pOrTa
1d3c0 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20  b->a[0]));.     
1d3d0 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20 29   if( pOrTab==0 )
1d3e0 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79   return notReady
1d3f0 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e  ;.      pOrTab->
1d400 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29 28 6e 4e  nAlloc = (u8)(nN
1d410 6f 74 52 65 61 64 79 20 2b 20 31 29 3b 0a 20 20  otReady + 1);.  
1d420 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63      pOrTab->nSrc
1d430 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f   = pOrTab->nAllo
1d440 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  c;.      memcpy(
1d450 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61 62 49  pOrTab->a, pTabI
1d460 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61  tem, sizeof(*pTa
1d470 62 49 74 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f  bItem));.      o
1d480 72 69 67 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d  rigSrc = pWInfo-
1d490 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20  >pTabList->a;.  
1d4a0 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d      for(k=1; k<=
1d4b0 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b  nNotReady; k++){
1d4c0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1d4d0 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26  &pOrTab->a[k], &
1d4e0 6f 72 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b  origSrc[pLevel[k
1d4f0 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66  ].iFrom], sizeof
1d500 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b  (pOrTab->a[k]));
1d510 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1d520 73 65 7b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  se{.      pOrTab
1d530 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
1d540 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ist;.    }..    
1d550 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1d560 65 20 72 6f 77 73 65 74 20 72 65 67 69 73 74 65  e rowset registe
1d570 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c  r to contain NUL
1d580 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69  L. An SQL NULL i
1d590 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76 61  s .    ** equiva
1d5a0 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74 79  lent to an empty
1d5b0 20 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a   rowset..    **.
1d5c0 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74      ** Also init
1d5d0 69 61 6c 69 7a 65 20 72 65 67 52 65 74 75 72 6e  ialize regReturn
1d5e0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1d5f0 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69  address of the i
1d600 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20 20 20 20  nstruction .    
1d610 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ** immediately f
1d620 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f  ollowing the OP_
1d630 52 65 74 75 72 6e 20 61 74 20 74 68 65 20 62 6f  Return at the bo
1d640 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ttom of the loop
1d650 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73  . This.    ** is
1d660 20 72 65 71 75 69 72 65 64 20 69 6e 20 61 20 66   required in a f
1d670 65 77 20 6f 62 73 63 75 72 65 20 4c 45 46 54 20  ew obscure LEFT 
1d680 4a 4f 49 4e 20 63 61 73 65 73 20 77 68 65 72 65  JOIN cases where
1d690 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20   control jumps. 
1d6a0 20 20 20 2a 2a 20 6f 76 65 72 20 74 68 65 20 74     ** over the t
1d6b0 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  op of the loop i
1d6c0 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20  nto the body of 
1d6d0 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  it. In this case
1d6e0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72   the .    ** cor
1d6f0 72 65 63 74 20 72 65 73 70 6f 6e 73 65 20 66 6f  rect response fo
1d700 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f  r the end-of-loo
1d710 70 20 63 6f 64 65 20 28 74 68 65 20 4f 50 5f 52  p code (the OP_R
1d720 65 74 75 72 6e 29 20 69 73 20 74 6f 20 0a 20 20  eturn) is to .  
1d730 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67    ** fall throug
1d740 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
1d750 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20  struction, just 
1d760 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f  as an OP_Next do
1d770 65 73 20 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c  es if.    ** cal
1d780 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74  led on an uninit
1d790 69 61 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a  ialized cursor..
1d7a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1d7b0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
1d7c0 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49  gs & WHERE_DUPLI
1d7d0 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a  CATES_OK)==0 ){.
1d7e0 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20        regRowset 
1d7f0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1d800 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64  ;.      regRowid
1d810 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1d820 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
1d830 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d840 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77  _Null, 0, regRow
1d850 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  set);.    }.    
1d860 69 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74  iRetInit = sqlit
1d870 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d880 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
1d890 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20  egReturn);..    
1d8a0 2f 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  /* If the origin
1d8b0 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  al WHERE clause 
1d8c0 69 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d  is z of the form
1d8d0 3a 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20  :  (x1 OR x2 OR 
1d8e0 2e 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a  ...) AND y.    *
1d8f0 2a 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79  * Then for every
1d900 20 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61   term xN, evalua
1d910 74 65 20 61 73 20 74 68 65 20 73 75 62 65 78 70  te as the subexp
1d920 72 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20  ression: xN AND 
1d930 7a 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61  z.    ** That wa
1d940 79 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68  y, terms in y th
1d950 61 74 20 61 72 65 20 66 61 63 74 6f 72 65 64 20  at are factored 
1d960 69 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63  into the disjunc
1d970 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  tion will.    **
1d980 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 62 79   be picked up by
1d990 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63   the recursive c
1d9a0 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57  alls to sqlite3W
1d9b0 68 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f  hereBegin() belo
1d9c0 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  w..    **.    **
1d9d0 20 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20   Actually, each 
1d9e0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
1d9f0 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78   converted to "x
1da00 4e 20 41 4e 44 20 77 22 20 77 68 65 72 65 20 77  N AND w" where w
1da10 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22   is.    ** the "
1da20 69 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65 72  interesting" ter
1da30 6d 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20  ms of z - terms 
1da40 74 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69  that did not ori
1da50 67 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20  ginate in the.  
1da60 20 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47    ** ON or USING
1da70 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46   clause of a LEF
1da80 54 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d  T JOIN, and term
1da90 73 20 74 68 61 74 20 61 72 65 20 75 73 61 62 6c  s that are usabl
1daa0 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64  e as .    ** ind
1dab0 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ices..    **.   
1dac0 20 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a   ** This optimiz
1dad0 61 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20  ation also only 
1dae0 61 70 70 6c 69 65 73 20 69 66 20 74 68 65 20 28  applies if the (
1daf0 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29  x1 OR x2 OR ...)
1db00 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20   term.    ** is 
1db10 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
1db20 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f   the ON clause o
1db30 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20  f a LEFT JOIN.. 
1db40 20 20 20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74     ** See ticket
1db50 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69   http://www.sqli
1db60 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f  te.org/src/info/
1db70 66 32 33 36 39 33 30 34 65 34 0a 20 20 20 20 2a  f2369304e4.    *
1db80 2f 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 6e  /.    if( pWC->n
1db90 54 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20  Term>1 ){.      
1dba0 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 20  int iTerm;.     
1dbb0 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69 54   for(iTerm=0; iT
1dbc0 65 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  erm<pWC->nTerm; 
1dbd0 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  iTerm++){.      
1dbe0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
1dbf0 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45  pWC->a[iTerm].pE
1dc00 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
1dc10 20 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20   &pWC->a[iTerm] 
1dc20 3d 3d 20 70 54 65 72 6d 20 29 20 63 6f 6e 74 69  == pTerm ) conti
1dc30 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
1dc40 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1dc50 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
1dc60 6f 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  oin) ) continue;
1dc70 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57 43  .        if( pWC
1dc80 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61  ->a[iTerm].wtFla
1dc90 67 73 20 26 20 28 54 45 52 4d 5f 4f 52 49 4e 46  gs & (TERM_ORINF
1dca0 4f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  O) ) continue;. 
1dcb0 20 20 20 20 20 20 20 69 66 28 20 28 70 57 43 2d         if( (pWC-
1dcc0 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61  >a[iTerm].eOpera
1dcd0 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30  tor & WO_ALL)==0
1dce0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1dcf0 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
1dd00 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
1dd10 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
1dd20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71     pAndExpr = sq
1dd30 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
1dd40 20 70 41 6e 64 45 78 70 72 2c 20 70 45 78 70 72   pAndExpr, pExpr
1dd50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1dd60 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b   if( pAndExpr ){
1dd70 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70  .        pAndExp
1dd80 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
1dd90 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c  (pParse, TK_AND,
1dda0 20 30 2c 20 70 41 6e 64 45 78 70 72 2c 20 30 29   0, pAndExpr, 0)
1ddb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ddc0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
1ddd0 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20  i<pOrWc->nTerm; 
1dde0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65  ii++){.      Whe
1ddf0 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20  reTerm *pOrTerm 
1de00 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b  = &pOrWc->a[ii];
1de10 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
1de20 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
1de30 69 43 75 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d  iCur || (pOrTerm
1de40 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1de50 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  _AND)!=0 ){.    
1de60 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70      WhereInfo *p
1de70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  SubWInfo;       
1de80 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73     /* Info for s
1de90 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63  ingle OR-term sc
1dea0 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  an */.        Ex
1deb0 70 72 20 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f  pr *pOrExpr = pO
1dec0 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  rTerm->pExpr;.  
1ded0 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78        if( pAndEx
1dee0 70 72 20 26 26 20 21 45 78 70 72 48 61 73 50 72  pr && !ExprHasPr
1def0 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c 20  operty(pOrExpr, 
1df00 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
1df10 20 20 20 20 20 20 20 20 20 20 70 41 6e 64 45 78            pAndEx
1df20 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45  pr->pLeft = pOrE
1df30 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  xpr;.          p
1df40 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78 70  OrExpr = pAndExp
1df50 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
1df60 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
1df70 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69  ough table entri
1df80 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65  es that match te
1df90 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20  rm pOrTerm. */. 
1dfa0 20 20 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f         pSubWInfo
1dfb0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
1dfc0 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 4f 72  egin(pParse, pOr
1dfd0 54 61 62 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c  Tab, pOrExpr, 0,
1dfe0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
1e000 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53  E_OMIT_OPEN_CLOS
1e010 45 20 7c 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e  E | WHERE_AND_ON
1e020 4c 59 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  LY |.           
1e030 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
1e040 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c  RE_FORCE_TABLE |
1e050 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
1e060 4f 4e 4c 59 2c 20 69 43 6f 76 43 75 72 29 3b 0a  ONLY, iCovCur);.
1e070 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1e080 70 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61  pSubWInfo || pPa
1e090 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
1e0a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1e0b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75  .        if( pSu
1e0c0 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  bWInfo ){.      
1e0d0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
1e0e0 53 75 62 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  SubLoop;.       
1e0f0 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61     explainOneSca
1e100 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n(.             
1e110 20 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c   pParse, pOrTab,
1e120 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30   &pSubWInfo->a[0
1e130 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65  ], iLevel, pLeve
1e140 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20  l->iFrom, 0.    
1e150 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
1e160 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
1e170 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1e180 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b  RE_DUPLICATES_OK
1e190 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1e1a0 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28      int iSet = (
1e1b0 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  (ii==pOrWc->nTer
1e1c0 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20  m-1)?-1:ii);.   
1e1d0 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a           int r;.
1e1e0 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20              r = 
1e1f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1e200 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
1e210 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c   pTabItem->pTab,
1e220 20 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20 20 20   -1, iCur, .    
1e230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e250 20 20 20 20 20 72 65 67 52 6f 77 69 64 2c 20 30       regRowid, 0
1e260 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
1e270 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1e280 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74  Int(v, OP_RowSet
1e290 54 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c  Test, regRowset,
1e2a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
1e2d0 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72  rentAddr(v)+2, r
1e2e0 2c 20 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20  , iSet);.       
1e2f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
1e300 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e310 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
1e320 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f  gReturn, iLoopBo
1e330 64 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  dy);..          
1e340 2f 2a 20 54 68 65 20 70 53 75 62 57 49 6e 66 6f  /* The pSubWInfo
1e350 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
1e360 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20  flag means that 
1e370 74 68 69 73 20 4f 52 20 74 65 72 6d 0a 20 20 20  this OR term.   
1e380 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
1e390 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ned one or more 
1e3a0 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20 61 20  AND term from a 
1e3b0 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 2e 20  notReady table. 
1e3c0 20 54 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   The.          *
1e3d0 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  * terms from the
1e3e0 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 20   notReady table 
1e3f0 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 65 73  could not be tes
1e400 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20  ted and will.   
1e410 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74         ** need t
1e420 6f 20 62 65 20 74 65 73 74 65 64 20 6c 61 74 65  o be tested late
1e430 72 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  r..          */.
1e440 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
1e450 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65  ubWInfo->unteste
1e460 64 54 65 72 6d 73 20 29 20 75 6e 74 65 73 74 65  dTerms ) unteste
1e470 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20  dTerms = 1;..   
1e480 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
1e490 20 6f 66 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65   of the OR-conne
1e4a0 63 74 65 64 20 74 65 72 6d 73 20 61 72 65 20 6f  cted terms are o
1e4b0 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 74  ptimized using t
1e4c0 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20  he same.        
1e4d0 20 20 2a 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20    ** index, and 
1e4e0 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f 70 65  the index is ope
1e4f0 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61  ned using the sa
1e500 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  me cursor number
1e510 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79  .          ** by
1e520 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71   each call to sq
1e530 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1e540 29 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 6c  ) made by this l
1e550 6f 6f 70 2c 20 69 74 20 6d 61 79 0a 20 20 20 20  oop, it may.    
1e560 20 20 20 20 20 20 2a 2a 20 62 65 20 70 6f 73 73        ** be poss
1e570 69 62 6c 65 20 74 6f 20 75 73 65 20 74 68 61 74  ible to use that
1e580 20 69 6e 64 65 78 20 61 73 20 61 20 63 6f 76 65   index as a cove
1e590 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20 20  ring index..    
1e5a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1e5b0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c     ** If the cal
1e5c0 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  l to sqlite3Wher
1e5d0 65 42 65 67 69 6e 28 29 20 61 62 6f 76 65 20 72  eBegin() above r
1e5e0 65 73 75 6c 74 65 64 20 69 6e 20 61 20 73 63 61  esulted in a sca
1e5f0 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  n that.         
1e600 20 2a 2a 20 75 73 65 73 20 61 6e 20 69 6e 64 65   ** uses an inde
1e610 78 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 65  x, and this is e
1e620 69 74 68 65 72 20 74 68 65 20 66 69 72 73 74 20  ither the first 
1e630 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72  OR-connected ter
1e640 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  m.          ** p
1e650 72 6f 63 65 73 73 65 64 20 6f 72 20 74 68 65 20  rocessed or the 
1e660 69 6e 64 65 78 20 69 73 20 74 68 65 20 73 61 6d  index is the sam
1e670 65 20 61 73 20 74 68 61 74 20 75 73 65 64 20 62  e as that used b
1e680 79 20 61 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20  y all previous. 
1e690 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d           ** term
1e6a0 73 2c 20 73 65 74 20 70 43 6f 76 20 74 6f 20 74  s, set pCov to t
1e6b0 68 65 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76  he candidate cov
1e6c0 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68  ering index. Oth
1e6d0 65 72 77 69 73 65 2c 20 73 65 74 20 0a 20 20 20  erwise, set .   
1e6e0 20 20 20 20 20 20 20 2a 2a 20 70 43 6f 76 20 74         ** pCov t
1e6f0 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61  o NULL to indica
1e700 74 65 20 74 68 61 74 20 6e 6f 20 63 61 6e 64 69  te that no candi
1e710 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e  date covering in
1e720 64 65 78 20 77 69 6c 6c 20 0a 20 20 20 20 20 20  dex will .      
1e730 20 20 20 20 2a 2a 20 62 65 20 61 76 61 69 6c 61      ** be availa
1e740 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ble..          *
1e750 2f 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62  /.          pSub
1e760 4c 6f 6f 70 20 3d 20 70 53 75 62 57 49 6e 66 6f  Loop = pSubWInfo
1e770 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20  ->a[0].pWLoop;. 
1e780 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1e790 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c   (pSubLoop->wsFl
1e7a0 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
1e7b0 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20  _INDEX)==0 );.  
1e7c0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 53 75          if( (pSu
1e7d0 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  bLoop->wsFlags &
1e7e0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
1e7f0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
1e800 20 28 69 69 3d 3d 30 20 7c 7c 20 70 53 75 62 4c   (ii==0 || pSubL
1e810 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
1e820 64 65 78 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20  dex==pCov).     
1e830 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1e840 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
1e850 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78  WInfo->a[0].iIdx
1e860 43 75 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b 0a  Cur==iCovCur );.
1e870 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76              pCov
1e880 20 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62   = pSubLoop->u.b
1e890 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
1e8a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1e8b0 20 20 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d            pCov =
1e8c0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
1e8d0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  .          /* Fi
1e8e0 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70 20 74 68  nish the loop th
1e8f0 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72  rough table entr
1e900 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  ies that match t
1e910 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a  erm pOrTerm. */.
1e920 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e930 33 57 68 65 72 65 45 6e 64 28 70 53 75 62 57 49  3WhereEnd(pSubWI
1e940 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nfo);.        }.
1e950 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e960 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76    pLevel->u.pCov
1e970 69 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20  idx = pCov;.    
1e980 69 66 28 20 70 43 6f 76 20 29 20 70 4c 65 76 65  if( pCov ) pLeve
1e990 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 43 6f  l->iIdxCur = iCo
1e9a0 76 43 75 72 3b 0a 20 20 20 20 69 66 28 20 70 41  vCur;.    if( pA
1e9b0 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  ndExpr ){.      
1e9c0 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20  pAndExpr->pLeft 
1e9d0 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
1e9e0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1e9f0 20 70 41 6e 64 45 78 70 72 29 3b 0a 20 20 20 20   pAndExpr);.    
1ea00 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1ea10 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52 65  eChangeP1(v, iRe
1ea20 74 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56 64  tInit, sqlite3Vd
1ea30 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1ea40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1ea50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1ea60 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  oto, 0, pLevel->
1ea70 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 73 71  addrBrk);.    sq
1ea80 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1ea90 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f  Label(v, iLoopBo
1eaa0 64 79 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 57  dy);..    if( pW
1eab0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29  Info->nLevel>1 )
1eac0 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65   sqlite3StackFre
1ead0 65 28 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20  e(db, pOrTab);. 
1eae0 20 20 20 69 66 28 20 21 75 6e 74 65 73 74 65 64     if( !untested
1eaf0 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65 54  Terms ) disableT
1eb00 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
1eb10 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  m);.  }else.#end
1eb20 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1eb30 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
1eb40 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a  N */..  {.    /*
1eb50 20 43 61 73 65 20 36 3a 20 20 54 68 65 72 65 20   Case 6:  There 
1eb60 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64  is no usable ind
1eb70 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20  ex.  We must do 
1eb80 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a  a complete.    *
1eb90 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e 20  *          scan 
1eba0 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 61  of the entire ta
1ebb0 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
1ebc0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
1ebd0 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e  aStep[] = { OP_N
1ebe0 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a  ext, OP_Prev };.
1ebf0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1ec00 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b   u8 aStart[] = {
1ec10 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c   OP_Rewind, OP_L
1ec20 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72  ast };.    asser
1ec30 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52  t( bRev==0 || bR
1ec40 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 70 4c 65  ev==1 );.    pLe
1ec50 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b  vel->op = aStep[
1ec60 62 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65  bRev];.    pLeve
1ec70 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
1ec80 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31    pLevel->p2 = 1
1ec90 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
1eca0 64 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62  dOp2(v, aStart[b
1ecb0 52 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72  Rev], iCur, addr
1ecc0 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Brk);.    pLevel
1ecd0 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54  ->p5 = SQLITE_ST
1ece0 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
1ecf0 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a 0a 20 20 2f  N_STEP;.  }..  /
1ed00 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f  * Insert code to
1ed10 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65   test every sube
1ed20 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
1ed30 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  an be completely
1ed40 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75  .  ** computed u
1ed50 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  sing the current
1ed60 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a   set of tables..
1ed70 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d    */.  for(pTerm
1ed80 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e  =pWC->a, j=pWC->
1ed90 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  nTerm; j>0; j--,
1eda0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45   pTerm++){.    E
1edb0 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74 65 73  xpr *pE;.    tes
1edc0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
1edd0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1ede0 54 55 41 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  TUAL );.    test
1edf0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
1ee00 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
1ee10 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  D );.    if( pTe
1ee20 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
1ee30 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
1ee40 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
1ee50 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ue;.    if( (pTe
1ee60 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
1ee70 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
1ee80 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  )!=0 ){.      te
1ee90 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e  stcase( pWInfo->
1eea0 75 6e 74 65 73 74 65 64 54 65 72 6d 73 3d 3d 30  untestedTerms==0
1eeb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1eec0 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
1eed0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
1eee0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30  NETABLE_ONLY)!=0
1eef0 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   );.      pWInfo
1ef00 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
1ef10 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 1;.      conti
1ef20 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nue;.    }.    p
1ef30 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
1ef40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
1ef50 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
1ef60 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
1ef70 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
1ef80 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d  erty(pE, EP_From
1ef90 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 63  Join) ){.      c
1efa0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
1efb0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1efc0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
1efd0 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
1efe0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
1eff0 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
1f000 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
1f010 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65  ;.  }..  /* Inse
1f020 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20  rt code to test 
1f030 66 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e 73  for implied cons
1f040 74 72 61 69 6e 74 73 20 62 61 73 65 64 20 6f 6e  traints based on
1f050 20 74 72 61 6e 73 69 74 69 76 69 74 79 0a 20 20   transitivity.  
1f060 2a 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22 20 6f  ** of the "==" o
1f070 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20  perator..  **.  
1f080 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74  ** Example: If t
1f090 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1f0a0 63 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d 74  contains "t1.a=t
1f0b0 32 2e 62 22 20 61 6e 64 20 22 74 32 2e 62 3d 31  2.b" and "t2.b=1
1f0c0 32 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20  23".  ** and we 
1f0d0 61 72 65 20 63 6f 64 69 6e 67 20 74 68 65 20 74  are coding the t
1f0e0 31 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20 74  1 loop and the t
1f0f0 32 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20 79  2 loop has not y
1f100 65 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20 74  et coded,.  ** t
1f110 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75 73  hen we cannot us
1f120 65 20 74 68 65 20 22 74 31 2e 61 3d 74 32 2e 62  e the "t1.a=t2.b
1f130 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62 75  " constraint, bu
1f140 74 20 77 65 20 63 61 6e 20 63 6f 64 65 0a 20 20  t we can code.  
1f150 2a 2a 20 74 68 65 20 69 6d 70 6c 69 65 64 20 22  ** the implied "
1f160 74 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74 72  t1.a=123" constr
1f170 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  aint..  */.  for
1f180 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
1f190 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30  =pWC->nTerm; j>0
1f1a0 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
1f1b0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20 2a  .    Expr *pE, *
1f1c0 70 45 41 6c 74 3b 0a 20 20 20 20 57 68 65 72 65  pEAlt;.    Where
1f1d0 54 65 72 6d 20 2a 70 41 6c 74 3b 0a 20 20 20 20  Term *pAlt;.    
1f1e0 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
1f1f0 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
1f200 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  AL|TERM_CODED) )
1f210 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
1f220 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
1f230 74 6f 72 21 3d 28 57 4f 5f 45 51 55 49 56 7c 57  tor!=(WO_EQUIV|W
1f240 4f 5f 45 51 29 20 29 20 63 6f 6e 74 69 6e 75 65  O_EQ) ) continue
1f250 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
1f260 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
1f270 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
1f280 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
1f290 65 66 74 4a 6f 69 6e 20 29 20 63 6f 6e 74 69 6e  eftJoin ) contin
1f2a0 75 65 3b 0a 20 20 20 20 70 45 20 3d 20 70 54 65  ue;.    pE = pTe
1f2b0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61  rm->pExpr;.    a
1f2c0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1f2d0 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
1f2e0 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20 20 20  romJoin) );.    
1f2f0 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
1f300 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4c  prereqRight & pL
1f310 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21  evel->notReady)!
1f320 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c 74 20 3d  =0 );.    pAlt =
1f330 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
1f340 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  Cur, pTerm->u.le
1f350 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61  ftColumn, notRea
1f360 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c  dy, WO_EQ|WO_IN,
1f370 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 41 6c   0);.    if( pAl
1f380 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t==0 ) continue;
1f390 0a 20 20 20 20 69 66 28 20 70 41 6c 74 2d 3e 77  .    if( pAlt->w
1f3a0 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43  tFlags & (TERM_C
1f3b0 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
1f3c0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1f3d0 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pAlt->eOperator 
1f3e0 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 74  & WO_EQ );.    t
1f3f0 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65  estcase( pAlt->e
1f400 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
1f410 20 29 3b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70   );.    VdbeNoop
1f420 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67  Comment((v, "beg
1f430 69 6e 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f  in transitive co
1f440 6e 73 74 72 61 69 6e 74 22 29 29 3b 0a 20 20 20  nstraint"));.   
1f450 20 70 45 41 6c 74 20 3d 20 73 71 6c 69 74 65 33   pEAlt = sqlite3
1f460 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62  StackAllocRaw(db
1f470 2c 20 73 69 7a 65 6f 66 28 2a 70 45 41 6c 74 29  , sizeof(*pEAlt)
1f480 29 3b 0a 20 20 20 20 69 66 28 20 70 45 41 6c 74  );.    if( pEAlt
1f490 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 41 6c 74   ){.      *pEAlt
1f4a0 20 3d 20 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b   = *pAlt->pExpr;
1f4b0 0a 20 20 20 20 20 20 70 45 41 6c 74 2d 3e 70 4c  .      pEAlt->pL
1f4c0 65 66 74 20 3d 20 70 45 2d 3e 70 4c 65 66 74 3b  eft = pE->pLeft;
1f4d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f4e0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1f4f0 2c 20 70 45 41 6c 74 2c 20 61 64 64 72 43 6f 6e  , pEAlt, addrCon
1f500 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  t, SQLITE_JUMPIF
1f510 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
1f520 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64 62  ite3StackFree(db
1f530 2c 20 70 45 41 6c 74 29 3b 0a 20 20 20 20 7d 0a  , pEAlt);.    }.
1f540 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20    }..  /* For a 
1f550 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c  LEFT OUTER JOIN,
1f560 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
1f570 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20  hat will record 
1f580 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20  the fact that.  
1f590 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ** at least one 
1f5a0 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68 74  row of the right
1f5b0 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68   table has match
1f5c0 65 64 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  ed the left tabl
1f5d0 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  e.  .  */.  if( 
1f5e0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
1f5f0 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  n ){.    pLevel-
1f600 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c  >addrFirst = sql
1f610 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1f620 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
1f630 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f640 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
1f650 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
1f660 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  n);.    VdbeComm
1f670 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20  ent((v, "record 
1f680 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29  LEFT JOIN hit"))
1f690 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1f6a0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
1f6b0 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65  se);.    for(pTe
1f6c0 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20  rm=pWC->a, j=0; 
1f6d0 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b  j<pWC->nTerm; j+
1f6e0 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
1f6f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
1f700 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
1f710 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
1f720 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1f730 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
1f740 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20  ERM_CODED );.   
1f750 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
1f760 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
1f770 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
1f780 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
1f790 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
1f7a0 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76  prereqAll & pLev
1f7b0 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30  el->notReady)!=0
1f7c0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1f7d0 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65  rt( pWInfo->unte
1f7e0 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20  stedTerms );.   
1f7f0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1f800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
1f810 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ert( pTerm->pExp
1f820 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r );.      sqlit
1f830 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1f840 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78  arse, pTerm->pEx
1f850 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  pr, addrCont, SQ
1f860 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1f870 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
1f880 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
1f890 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ODED;.    }.  }.
1f8a0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1f8b0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1f8c0 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20  iReleaseReg);.. 
1f8d0 20 72 65 74 75 72 6e 20 70 4c 65 76 65 6c 2d 3e   return pLevel->
1f8e0 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66  notReady;.}..#if
1f8f0 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52   defined(WHERETR
1f900 41 43 45 5f 45 4e 41 42 4c 45 44 29 20 26 26 20  ACE_ENABLED) && 
1f910 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1f920 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41  NABLE_TREE_EXPLA
1f930 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  IN)./*.** Genera
1f940 74 65 20 22 45 78 70 6c 61 6e 61 74 69 6f 6e 22  te "Explanation"
1f950 20 74 65 78 74 20 66 6f 72 20 61 20 57 68 65 72   text for a Wher
1f960 65 54 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  eTerm..*/.static
1f970 20 76 6f 69 64 20 77 68 65 72 65 45 78 70 6c 61   void whereExpla
1f980 69 6e 54 65 72 6d 28 56 64 62 65 20 2a 76 2c 20  inTerm(Vdbe *v, 
1f990 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1f9a0 29 7b 0a 20 20 63 68 61 72 20 7a 54 79 70 65 5b  ){.  char zType[
1f9b0 34 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 54 79  4];.  memcpy(zTy
1f9c0 70 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20  pe, "...", 4);. 
1f9d0 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
1f9e0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1f9f0 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20  AL ) zType[0] = 
1fa00 27 56 27 3b 0a 20 20 69 66 28 20 70 54 65 72 6d  'V';.  if( pTerm
1fa10 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1fa20 5f 45 51 55 49 56 20 20 29 20 7a 54 79 70 65 5b  _EQUIV  ) zType[
1fa30 31 5d 20 3d 20 27 45 27 3b 0a 20 20 69 66 28 20  1] = 'E';.  if( 
1fa40 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1fa50 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
1fa60 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 7a 54 79  _FromJoin) ) zTy
1fa70 70 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a 20 20 73  pe[2] = 'L';.  s
1fa80 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1fa90 6e 74 66 28 76 2c 20 22 25 73 20 22 2c 20 7a 54  ntf(v, "%s ", zT
1faa0 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ype);.  sqlite3E
1fab0 78 70 6c 61 69 6e 45 78 70 72 28 76 2c 20 70 54  xplainExpr(v, pT
1fac0 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 23  erm->pExpr);.}.#
1fad0 65 6e 64 69 66 20 2f 2a 20 57 48 45 52 45 54 52  endif /* WHERETR
1fae0 41 43 45 5f 45 4e 41 42 4c 45 44 20 26 26 20 53  ACE_ENABLED && S
1faf0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45  QLITE_ENABLE_TRE
1fb00 45 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 23  E_EXPLAIN */...#
1fb10 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
1fb20 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50  _ENABLED./*.** P
1fb30 72 69 6e 74 20 61 20 57 68 65 72 65 4c 6f 6f 70  rint a WhereLoop
1fb40 20 6f 62 6a 65 63 74 20 66 6f 72 20 64 65 62 75   object for debu
1fb50 67 67 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a  gging purposes.*
1fb60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
1fb70 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65  ereLoopPrint(Whe
1fb80 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65  reLoop *p, Where
1fb90 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20  Clause *pWC){.  
1fba0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1fbb0 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b  o = pWC->pWInfo;
1fbc0 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70  .  int nb = 1+(p
1fbd0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
1fbe0 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a 20 20 73 74  >nSrc+7)/8;.  st
1fbf0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1fc00 6d 20 2a 70 49 74 65 6d 20 3d 20 70 57 49 6e 66  m *pItem = pWInf
1fc10 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b  o->pTabList->a +
1fc20 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c   p->iTab;.  Tabl
1fc30 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  e *pTab = pItem-
1fc40 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  >pTab;.  sqlite3
1fc50 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 63 25  DebugPrintf("%c%
1fc60 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78  2d.%0*llx.%0*llx
1fc70 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20  ", p->cId,.     
1fc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc90 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e  p->iTab, nb, p->
1fca0 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d  maskSelf, nb, p-
1fcb0 3e 70 72 65 72 65 71 29 3b 0a 20 20 73 71 6c 69  >prereq);.  sqli
1fcc0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1fcd0 20 25 31 32 73 22 2c 0a 20 20 20 20 20 20 20 20   %12s",.        
1fce0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
1fcf0 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74  em->zAlias ? pIt
1fd00 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61  em->zAlias : pTa
1fd10 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b->zName);.  if(
1fd20 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
1fd30 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1fd40 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 63 6f  E)==0 ){.     co
1fd50 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
1fd60 0a 20 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 62  .     if( p->u.b
1fd70 74 72 65 65 2e 70 49 6e 64 65 78 20 26 26 20 28  tree.pIndex && (
1fd80 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72  zName = p->u.btr
1fd90 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ee.pIndex->zName
1fda0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
1fdb0 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c  ( strncmp(zName,
1fdc0 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64   "sqlite_autoind
1fdd0 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a  ex_", 17)==0 ){.
1fde0 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20          int i = 
1fdf0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1fe00 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20  zName) - 1;.    
1fe10 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65      while( zName
1fe20 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a  [i]!='_' ) i--;.
1fe30 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d          zName +=
1fe40 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
1fe50 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1fe60 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25 32 64  intf(".%-16s %2d
1fe70 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62  ", zName, p->u.b
1fe80 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d  tree.nEq);.    }
1fe90 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
1fea0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1feb0 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d  %20s","");.    }
1fec0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
1fed0 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70  ar *z;.    if( p
1fee0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
1fef0 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  ){.      z = sql
1ff00 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25  ite3_mprintf("(%
1ff10 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20  d,\"%s\",%x)",. 
1ff20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1ff30 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c  ->u.vtab.idxNum,
1ff40 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74   p->u.vtab.idxSt
1ff50 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  r, p->u.vtab.omi
1ff60 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73  tMask);.    }els
1ff70 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  e{.      z = sql
1ff80 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25  ite3_mprintf("(%
1ff90 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61  d,%x)", p->u.vta
1ffa0 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76  b.idxNum, p->u.v
1ffb0 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20  tab.omitMask);. 
1ffc0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1ffd0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 2d  DebugPrintf(" %-
1ffe0 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71  19s", z);.    sq
1fff0 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
20000 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75   }.  sqlite3Debu
20010 67 50 72 69 6e 74 66 28 22 20 66 20 25 30 34 78  gPrintf(" f %04x
20020 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61   N %d", p->wsFla
20030 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a  gs, p->nLTerm);.
20040 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
20050 69 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25  intf(" cost %d,%
20060 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74  d,%d\n", p->rSet
20070 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e  up, p->rRun, p->
20080 6e 4f 75 74 29 3b 0a 23 69 66 64 65 66 20 53 51  nOut);.#ifdef SQ
20090 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
200a0 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66  _EXPLAIN.  /* If
200b0 20 74 68 65 20 30 78 31 30 30 20 62 69 74 20 6f   the 0x100 bit o
200c0 66 20 77 68 65 72 65 74 72 61 63 69 6e 67 20 69  f wheretracing i
200d0 73 20 73 65 74 2c 20 74 68 65 6e 20 73 68 6f 77  s set, then show
200e0 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6e 73   all of the cons
200f0 74 72 61 69 6e 74 0a 20 20 2a 2a 20 65 78 70 72  traint.  ** expr
20100 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57  essions in the W
20110 68 65 72 65 4c 6f 6f 70 2e 61 4c 54 65 72 6d 5b  hereLoop.aLTerm[
20120 5d 20 61 72 72 61 79 2e 0a 20 20 2a 2f 0a 20 20  ] array..  */.  
20130 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26  if( p->nLTerm &&
20140 20 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   (sqlite3WhereTr
20150 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30 20  ace & 0x100)!=0 
20160 29 7b 20 20 2f 2a 20 57 48 45 52 45 54 52 41 43  ){  /* WHERETRAC
20170 45 20 30 78 31 30 30 20 2a 2f 0a 20 20 20 20 69  E 0x100 */.    i
20180 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt i;.    Vdbe *
20190 76 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  v = pWInfo->pPar
201a0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 73  se->pVdbe;.    s
201b0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 42 65 67  qlite3ExplainBeg
201c0 69 6e 28 76 29 3b 0a 20 20 20 20 66 6f 72 28 69  in(v);.    for(i
201d0 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b  =0; i<p->nLTerm;
201e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65   i++){.      Whe
201f0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20  reTerm *pTerm = 
20200 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3b 0a 20 20  p->aLTerm[i];.  
20210 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
20220 69 6e 50 72 69 6e 74 66 28 76 2c 20 22 20 20 28  inPrintf(v, "  (
20230 25 64 29 20 23 25 2d 32 64 20 22 2c 20 69 2b 31  %d) #%-2d ", i+1
20240 2c 20 28 69 6e 74 29 28 70 54 65 72 6d 2d 70 57  , (int)(pTerm-pW
20250 43 2d 3e 61 29 29 3b 0a 20 20 20 20 20 20 73 71  C->a));.      sq
20260 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68  lite3ExplainPush
20270 28 76 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65  (v);.      where
20280 45 78 70 6c 61 69 6e 54 65 72 6d 28 76 2c 20 70  ExplainTerm(v, p
20290 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  Term);.      sql
202a0 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 76  ite3ExplainPop(v
202b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
202c0 45 78 70 6c 61 69 6e 4e 4c 28 76 29 3b 0a 20 20  ExplainNL(v);.  
202d0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
202e0 78 70 6c 61 69 6e 46 69 6e 69 73 68 28 76 29 3b  xplainFinish(v);
202f0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
20300 67 50 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  gPrintf("%s", sq
20310 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 6e 61  lite3VdbeExplana
20320 74 69 6f 6e 28 76 29 29 3b 0a 20 20 7d 0a 23 65  tion(v));.  }.#e
20330 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ndif.}.#endif../
20340 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c  *.** Convert bul
20350 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20  k memory into a 
20360 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70 20  valid WhereLoop 
20370 74 68 61 74 20 63 61 6e 20 62 65 20 70 61 73 73  that can be pass
20380 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f  ed.** to whereLo
20390 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73 73  opClear harmless
203a0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
203b0 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  id whereLoopInit
203c0 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a  (WhereLoop *p){.
203d0 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d    p->aLTerm = p-
203e0 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20 20  >aLTermSpace;.  
203f0 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20  p->nLTerm = 0;. 
20400 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72   p->nLSlot = Arr
20410 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d  aySize(p->aLTerm
20420 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46  Space);.  p->wsF
20430 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  lags = 0;.}../*.
20440 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68 65  ** Clear the Whe
20450 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20  reLoop.u union. 
20460 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f 70   Leave WhereLoop
20470 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a  .pLTerm intact..
20480 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
20490 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
204a0 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  on(sqlite3 *db, 
204b0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
204c0 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20   if( p->wsFlags 
204d0 26 20 28 57 48 45 52 45 5f 56 49 52 54 55 41 4c  & (WHERE_VIRTUAL
204e0 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f  TABLE|WHERE_AUTO
204f0 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 69  _INDEX) ){.    i
20500 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
20510 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
20520 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e  BLE)!=0 && p->u.
20530 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b  vtab.needFree ){
20540 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
20550 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64  ree(p->u.vtab.id
20560 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e  xStr);.      p->
20570 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
20580 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  = 0;.      p->u.
20590 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30 3b  vtab.idxStr = 0;
205a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
205b0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
205c0 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
205d0 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e  0 && p->u.btree.
205e0 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20  pIndex!=0 ){.   
205f0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
20600 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  (db, p->u.btree.
20610 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29  pIndex->zColAff)
20620 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b  ;.      sqlite3K
20630 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 2d 3e 75  eyInfoUnref(p->u
20640 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 70  .btree.pIndex->p
20650 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  KeyInfo);.      
20660 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
20670 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  , p->u.btree.pIn
20680 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75  dex);.      p->u
20690 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
206a0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
206b0 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
206c0 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72 79   internal memory
206d0 20 75 73 65 64 20 62 79 20 61 20 57 68 65 72 65   used by a Where
206e0 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  Loop object.*/.s
206f0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
20700 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74 65  LoopClear(sqlite
20710 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
20720 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61   *p){.  if( p->a
20730 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d  LTerm!=p->aLTerm
20740 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33 44  Space ) sqlite3D
20750 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54  bFree(db, p->aLT
20760 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  erm);.  whereLoo
20770 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20  pClearUnion(db, 
20780 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49  p);.  whereLoopI
20790 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nit(p);.}../*.**
207a0 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6d 65   Increase the me
207b0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
207c0 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  for pLoop->aLTer
207d0 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c 65 61  m[] to be at lea
207e0 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  st n..*/.static 
207f0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  int whereLoopRes
20800 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ize(sqlite3 *db,
20810 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 69   WhereLoop *p, i
20820 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65 54 65  nt n){.  WhereTe
20830 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69 66  rm **paNew;.  if
20840 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29  ( p->nLSlot>=n )
20850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20860 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26 7e  K;.  n = (n+7)&~
20870 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73 71 6c  7;.  paNew = sql
20880 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
20890 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  db, sizeof(p->aL
208a0 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69  Term[0])*n);.  i
208b0 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65  f( paNew==0 ) re
208c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
208d0 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65  M;.  memcpy(paNe
208e0 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69  w, p->aLTerm, si
208f0 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30  zeof(p->aLTerm[0
20900 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20  ])*p->nLSlot);. 
20910 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
20920 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
20930 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
20940 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
20950 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61 4e   p->aLTerm = paN
20960 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20  ew;.  p->nLSlot 
20970 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = n;.  return SQ
20980 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
20990 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74 65  * Transfer conte
209a0 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  nt from the seco
209b0 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74 68  nd pLoop into th
209c0 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74  e first..*/.stat
209d0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
209e0 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62  Xfer(sqlite3 *db
209f0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f  , WhereLoop *pTo
20a00 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46 72  , WhereLoop *pFr
20a10 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  om){.  whereLoop
20a20 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70  ClearUnion(db, p
20a30 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65 72 65  To);.  if( where
20a40 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
20a50 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72  To, pFrom->nLTer
20a60 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  m) ){.    memset
20a70 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a  (&pTo->u, 0, siz
20a80 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20 20  eof(pTo->u));.  
20a90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20aa0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
20ab0 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20  cpy(pTo, pFrom, 
20ac0 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f  WHERE_LOOP_XFER_
20ad0 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  SZ);.  memcpy(pT
20ae0 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d  o->aLTerm, pFrom
20af0 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e  ->aLTerm, pTo->n
20b00 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f  LTerm*sizeof(pTo
20b10 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20  ->aLTerm[0]));. 
20b20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c   if( pFrom->wsFl
20b30 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
20b40 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20  UALTABLE ){.    
20b50 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65  pFrom->u.vtab.ne
20b60 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  edFree = 0;.  }e
20b70 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e  lse if( (pFrom->
20b80 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
20b90 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29  AUTO_INDEX)!=0 )
20ba0 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62  {.    pFrom->u.b
20bb0 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
20bc0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
20bd0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
20be0 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65 72 65  * Delete a Where
20bf0 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  Loop object.*/.s
20c00 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
20c10 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c 69 74  LoopDelete(sqlit
20c20 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
20c30 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f  p *p){.  whereLo
20c40 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a  opClear(db, p);.
20c50 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
20c60 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
20c70 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e 66   Free a WhereInf
20c80 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73  o structure.*/.s
20c90 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
20ca0 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33  InfoFree(sqlite3
20cb0 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20   *db, WhereInfo 
20cc0 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20  *pWInfo){.  if( 
20cd0 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29  ALWAYS(pWInfo) )
20ce0 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  {.    whereClaus
20cf0 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e  eClear(&pWInfo->
20d00 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  sWC);.    while(
20d10 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
20d20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f  ){.      WhereLo
20d30 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  op *p = pWInfo->
20d40 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70 57  pLoops;.      pW
20d50 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70  Info->pLoops = p
20d60 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
20d70 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65     whereLoopDele
20d80 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d  te(db, p);.    }
20d90 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
20da0 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
20db0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73    }.}../*.** Ins
20dc0 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20 61  ert or replace a
20dd0 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79   WhereLoop entry
20de0 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70 6c   using the templ
20df0 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a  ate supplied..**
20e00 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20  .** An existing 
20e10 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20  WhereLoop entry 
20e20 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77 72 69  might be overwri
20e30 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77 20  tten if the new 
20e40 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62  template.** is b
20e50 65 74 74 65 72 20 61 6e 64 20 68 61 73 20 66 65  etter and has fe
20e60 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
20e70 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c 61  .  Or the templa
20e80 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  te will be ignor
20e90 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73  ed.** and no ins
20ea0 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20 69  ert will occur i
20eb0 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  f an existing Wh
20ec0 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74 65  ereLoop is faste
20ed0 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77  r and has.** few
20ee0 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  er dependencies 
20ef0 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  than the templat
20f00 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 20  e.  Otherwise a 
20f10 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  new WhereLoop is
20f20 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64 20  .** added based 
20f30 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e  on the template.
20f40 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64  .**.** If pBuild
20f50 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f  er->pOrSet is no
20f60 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20 6f  t NULL then we o
20f70 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 6f  nly care about o
20f80 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65  nly the.** prere
20f90 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52 75  quisites and rRu
20fa0 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73  n and nOut costs
20fb0 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c   of the N best l
20fc0 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69  oops.  That.** i
20fd0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61  nformation is ga
20fe0 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70 42  thered in the pB
20ff0 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f  uilder->pOrSet o
21000 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70 65  bject.  This spe
21010 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69  cial.** processi
21020 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
21030 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75  only for OR clau
21040 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
21050 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75  *.** When accumu
21060 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  lating multiple 
21070 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69  loops (when pBui
21080 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
21090 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c  NULL) we.** stil
210a0 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  l might overwrit
210b0 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20  e similar loops 
210c0 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d  with the new tem
210d0 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  plate if the.** 
210e0 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74  template is bett
210f0 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62  er.  Loops may b
21100 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66  e overwritten if
21110 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a   the following .
21120 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72  ** conditions ar
21130 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  e met:.**.**    
21140 28 31 29 20 20 54 68 65 79 20 68 61 76 65 20 74  (1)  They have t
21150 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a  he same iTab..**
21160 20 20 20 20 28 32 29 20 20 54 68 65 79 20 68 61      (2)  They ha
21170 76 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72  ve the same iSor
21180 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20  tIdx..**    (3) 
21190 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61   The template ha
211a0 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20  s same or fewer 
211b0 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
211c0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  n the current lo
211d0 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68  op.**    (4)  Th
211e0 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74  e template has t
211f0 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
21200 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63   cost than the c
21210 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20  urrent loop.**  
21220 20 20 28 35 29 20 20 54 68 65 20 74 65 6d 70 6c    (5)  The templ
21230 61 74 65 20 75 73 65 73 20 6d 6f 72 65 20 74 65  ate uses more te
21240 72 6d 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  rms of the same 
21250 69 6e 64 65 78 20 62 75 74 20 68 61 73 20 6e 6f  index but has no
21260 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 20   additional.**  
21270 20 20 20 20 20 20 20 64 65 70 65 6e 64 65 6e 63         dependenc
21280 69 65 73 20 20 20 20 20 20 20 20 20 20 0a 2a 2f  ies          .*/
21290 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
212a0 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72  eLoopInsert(Wher
212b0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
212c0 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f  uilder, WhereLoo
212d0 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20  p *pTemplate){. 
212e0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50   WhereLoop **ppP
212f0 72 65 76 2c 20 2a 70 2c 20 2a 70 4e 65 78 74 20  rev, *p, *pNext 
21300 3d 20 30 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f  = 0;.  WhereInfo
21310 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
21320 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73  der->pWInfo;.  s
21330 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
21340 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
21350 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64  ..  /* If pBuild
21360 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 64 65  er->pOrSet is de
21370 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79  fined, then only
21380 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   keep track of t
21390 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61 6e  he costs.  ** an
213a0 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f 0a  d prereqs..  */.
213b0 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e    if( pBuilder->
213c0 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 23 69 66  pOrSet!=0 ){.#if
213d0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
213e0 4c 45 44 0a 20 20 20 20 75 31 36 20 6e 20 3d 20  LED.    u16 n = 
213f0 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
21400 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d  ->n;.    int x =
21410 0a 23 65 6e 64 69 66 0a 20 20 20 20 77 68 65 72  .#endif.    wher
21420 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69 6c 64  eOrInsert(pBuild
21430 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65 6d  er->pOrSet, pTem
21440 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c 20 70  plate->prereq, p
21450 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a  Template->rRun,.
21460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21480 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e      pTemplate->n
21490 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52 45 54  Out);.#if WHERET
214a0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
214b0 30 78 38 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  0x8 */.    if( s
214c0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
214d0 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20   & 0x8 ){.      
214e0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
214f0 74 66 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20  tf(x?"   or-%d: 
21500 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c   ":"   or-X:  ",
21510 20 6e 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65   n);.      where
21520 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
21530 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
21540 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  WC);.    }.#endi
21550 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
21560 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
21570 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
21580 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
21590 6f 70 20 74 6f 20 6f 76 65 72 77 72 69 74 65 2c  op to overwrite,
215a0 20 6f 72 20 77 68 69 63 68 20 74 61 6b 65 73 0a   or which takes.
215b0 20 20 2a 2a 20 70 72 69 6f 72 69 74 79 20 6f 76    ** priority ov
215c0 65 72 20 70 54 65 6d 70 6c 61 74 65 2e 0a 20 20  er pTemplate..  
215d0 2a 2f 0a 20 20 66 6f 72 28 70 70 50 72 65 76 3d  */.  for(ppPrev=
215e0 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c  &pWInfo->pLoops,
215f0 20 70 3d 2a 70 70 50 72 65 76 3b 20 70 3b 20 70   p=*ppPrev; p; p
21600 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c  pPrev=&p->pNextL
21610 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b  oop, p=*ppPrev){
21620 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62  .    if( p->iTab
21630 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61  !=pTemplate->iTa
21640 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78  b || p->iSortIdx
21650 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f  !=pTemplate->iSo
21660 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f  rtIdx ){.      /
21670 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20  * If either the 
21680 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78  iTab or iSortIdx
21690 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20   values for two 
216a0 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69  WhereLoop are di
216b0 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  fferent.      **
216c0 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72   then those Wher
216d0 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62  eLoops need to b
216e0 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70  e considered sep
216f0 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65  arately.  Neithe
21700 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  r is.      ** a 
21710 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70  candidate to rep
21720 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20  lace the other. 
21730 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  */.      continu
21740 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  e;.    }.    /* 
21750 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  In the current i
21760 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74  mplementation, t
21770 68 65 20 72 53 65 74 75 70 20 76 61 6c 75 65 20  he rSetup value 
21780 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20  is either zero. 
21790 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73     ** or the cos
217a0 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e  t of building an
217b0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
217c0 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65   (NlogN) and the
217d0 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73   NlogN.    ** is
217e0 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f   the same for co
217f0 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f  mpatible WhereLo
21800 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ops. */.    asse
21810 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30  rt( p->rSetup==0
21820 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72   || pTemplate->r
21830 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20  Setup==0 .      
21840 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
21850 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61  >rSetup==pTempla
21860 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20  te->rSetup );.. 
21870 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41     /* whereLoopA
21880 64 64 42 74 72 65 65 28 29 20 61 6c 77 61 79 73  ddBtree() always
21890 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69   generates and i
218a0 6e 73 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d  nserts the autom
218b0 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a  atic index.    *
218c0 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20 20 48  * case first.  H
218d0 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  ence compatible 
218e0 63 61 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c  candidate WhereL
218f0 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65 20  oops never have 
21900 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20  a larger.    ** 
21910 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69  rSetup. Call thi
21920 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e  s SETUP-INVARIAN
21930 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  T */.    assert(
21940 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d   p->rSetup>=pTem
21950 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
21960 0a 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  ..    if( (p->pr
21970 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
21980 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72  ->prereq)==p->pr
21990 65 72 65 71 0a 20 20 20 20 20 26 26 20 70 2d 3e  ereq.     && p->
219a0 72 53 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61 74  rSetup<=pTemplat
219b0 65 2d 3e 72 53 65 74 75 70 0a 20 20 20 20 20 26  e->rSetup.     &
219c0 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70  & p->rRun<=pTemp
219d0 6c 61 74 65 2d 3e 72 52 75 6e 0a 20 20 20 20 20  late->rRun.     
219e0 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d  && p->nOut<=pTem
219f0 70 6c 61 74 65 2d 3e 6e 4f 75 74 0a 20 20 20 20  plate->nOut.    
21a00 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
21a10 20 62 72 61 6e 63 68 20 74 61 6b 65 6e 20 77 68   branch taken wh
21a20 65 6e 20 70 20 69 73 20 65 71 75 61 6c 20 6f 72  en p is equal or
21a30 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 54 65   better than pTe
21a40 6d 70 6c 61 74 65 20 69 6e 20 0a 20 20 20 20 20  mplate in .     
21a50 20 2a 2a 20 61 6c 6c 20 6f 66 20 28 31 29 20 64   ** all of (1) d
21a60 65 70 65 6e 64 65 6e 63 69 65 73 20 28 32 29 20  ependencies (2) 
21a70 73 65 74 75 70 2d 63 6f 73 74 2c 20 28 33 29 20  setup-cost, (3) 
21a80 72 75 6e 2d 63 6f 73 74 2c 20 61 6e 64 0a 20 20  run-cost, and.  
21a90 20 20 20 20 2a 2a 20 28 34 29 20 6e 75 6d 62 65      ** (4) numbe
21aa0 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
21ab0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
21ac0 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54  t( p->rSetup==pT
21ad0 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
21ae0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
21af0 70 72 65 72 65 71 3d 3d 70 54 65 6d 70 6c 61 74  prereq==pTemplat
21b00 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20 20  e->prereq.      
21b10 20 26 26 20 70 2d 3e 6e 4c 54 65 72 6d 3c 70 54   && p->nLTerm<pT
21b20 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 0a  emplate->nLTerm.
21b30 20 20 20 20 20 20 20 26 26 20 28 70 2d 3e 77 73         && (p->ws
21b40 46 6c 61 67 73 20 26 20 70 54 65 6d 70 6c 61 74  Flags & pTemplat
21b50 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  e->wsFlags & WHE
21b60 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
21b70 20 20 20 20 20 20 26 26 20 28 70 2d 3e 75 2e 62        && (p->u.b
21b80 74 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70 54 65  tree.pIndex==pTe
21b90 6d 70 6c 61 74 65 2d 3e 75 2e 62 74 72 65 65 2e  mplate->u.btree.
21ba0 70 49 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20  pIndex.         
21bb0 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72   || pTemplate->r
21bc0 52 75 6e 2b 70 2d 3e 6e 4c 54 65 72 6d 3c 3d 70  Run+p->nLTerm<=p
21bd0 2d 3e 72 52 75 6e 2b 70 54 65 6d 70 6c 61 74 65  ->rRun+pTemplate
21be0 2d 3e 6e 4c 54 65 72 6d 29 0a 20 20 20 20 20 20  ->nLTerm).      
21bf0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 76  ){.        /* Ov
21c00 65 72 77 72 69 74 65 20 61 6e 20 65 78 69 73 74  erwrite an exist
21c10 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 77 69  ing WhereLoop wi
21c20 74 68 20 61 6e 20 73 69 6d 69 6c 61 72 20 6f 6e  th an similar on
21c30 65 20 74 68 61 74 20 75 73 65 73 0a 20 20 20 20  e that uses.    
21c40 20 20 20 20 2a 2a 20 6d 6f 72 65 20 74 65 72 6d      ** more term
21c50 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a  s of the index *
21c60 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74 20  /.        pNext 
21c70 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  = p->pNextLoop;.
21c80 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
21c90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21ca0 20 20 20 20 2f 2a 20 70 54 65 6d 70 6c 61 74 65      /* pTemplate
21cb0 20 69 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c 2e   is not helpful.
21cc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65 74 75  .        ** Retu
21cd0 72 6e 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  rn without chang
21ce0 69 6e 67 20 6f 72 20 61 64 64 69 6e 67 20 61 6e  ing or adding an
21cf0 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  ything */.      
21d00 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70    goto whereLoop
21d10 49 6e 73 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20  Insert_noop;.   
21d20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
21d30 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  f( (p->prereq & 
21d40 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
21d50 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q)==pTemplate->p
21d60 72 65 72 65 71 0a 20 20 20 20 20 26 26 20 70 2d  rereq.     && p-
21d70 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65  >rRun>=pTemplate
21d80 2d 3e 72 52 75 6e 0a 20 20 20 20 20 26 26 20 70  ->rRun.     && p
21d90 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74  ->nOut>=pTemplat
21da0 65 2d 3e 6e 4f 75 74 0a 20 20 20 20 29 7b 0a 20  e->nOut.    ){. 
21db0 20 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74       /* Overwrit
21dc0 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  e an existing Wh
21dd0 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 20 62  ereLoop with a b
21de0 65 74 74 65 72 20 6f 6e 65 3a 20 6f 6e 65 20 74  etter one: one t
21df0 68 61 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  hat is.      ** 
21e00 62 65 74 74 65 72 20 61 74 20 6f 6e 65 20 6f 66  better at one of
21e10 20 28 31 29 20 64 65 70 65 6e 64 65 6e 63 69 65   (1) dependencie
21e20 73 2c 20 28 32 29 20 73 65 74 75 70 2d 63 6f 73  s, (2) setup-cos
21e30 74 2c 20 28 33 29 20 72 75 6e 2d 63 6f 73 74 0a  t, (3) run-cost.
21e40 20 20 20 20 20 20 2a 2a 20 6f 72 20 28 34 29 20        ** or (4) 
21e50 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
21e60 20 72 6f 77 73 2c 20 61 6e 64 20 69 73 20 6e 6f   rows, and is no
21e70 20 77 6f 72 73 65 20 69 6e 20 61 6e 79 20 6f 66   worse in any of
21e80 20 74 68 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20   those.      ** 
21e90 63 61 74 65 67 6f 72 69 65 73 2e 20 2a 2f 0a 20  categories. */. 
21ea0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
21eb0 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74  rSetup>=pTemplat
21ec0 65 2d 3e 72 53 65 74 75 70 20 29 3b 20 2f 2a 20  e->rSetup ); /* 
21ed0 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20  SETUP-INVARIANT 
21ee0 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 70  above */.      p
21ef0 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c  Next = p->pNextL
21f00 6f 6f 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  oop;.      break
21f10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
21f20 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
21f30 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e  is point it mean
21f40 73 20 74 68 61 74 20 65 69 74 68 65 72 20 70 5b  s that either p[
21f50 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72  ] should be over
21f60 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74  written.  ** wit
21f70 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66  h pTemplate[] if
21f80 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20   p[] exists, or 
21f90 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20  if p==NULL then 
21fa0 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20  allocate a new. 
21fb0 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e   ** WhereLoop an
21fc0 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a  d insert it..  *
21fd0 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  /.#if WHERETRACE
21fe0 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20  _ENABLED /* 0x8 
21ff0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
22000 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
22010 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30   ){.    if( p!=0
22020 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22030 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e  3DebugPrintf("in
22040 73 2d 64 65 6c 3a 20 20 22 29 3b 0a 20 20 20 20  s-del:  ");.    
22050 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
22060 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  (p, pBuilder->pW
22070 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  C);.    }.    sq
22080 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
22090 28 22 69 6e 73 2d 6e 65 77 3a 20 20 22 29 3b 0a  ("ins-new:  ");.
220a0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
220b0 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42  nt(pTemplate, pB
220c0 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
220d0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
220e0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 20 3d 20 73  ==0 ){.    p = s
220f0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
22100 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 57 68 65  w(db, sizeof(Whe
22110 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20 20 69 66  reLoop));.    if
22120 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
22130 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
22140 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
22150 70 29 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c  p);.  }.  whereL
22160 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70  oopXfer(db, p, p
22170 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70 2d 3e  Template);.  p->
22180 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 70 4e 65 78  pNextLoop = pNex
22190 74 3b 0a 20 20 2a 70 70 50 72 65 76 20 3d 20 70  t;.  *ppPrev = p
221a0 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  ;.  if( (p->wsFl
221b0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
221c0 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a  UALTABLE)==0 ){.
221d0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65      Index *pInde
221e0 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  x = p->u.btree.p
221f0 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
22200 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d  Index && pIndex-
22210 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  >tnum==0 ){.    
22220 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e    p->u.btree.pIn
22230 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  dex = 0;.    }. 
22240 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
22250 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
22260 70 20 68 65 72 65 20 69 66 20 74 68 65 20 69 6e  p here if the in
22270 73 65 72 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20  sert is a no-op 
22280 2a 2f 0a 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65  */.whereLoopInse
22290 72 74 5f 6e 6f 6f 70 3a 0a 23 69 66 20 57 48 45  rt_noop:.#if WHE
222a0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
222b0 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69 66 28 20  /* 0x8 */.  if( 
222c0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
222d0 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 73  e & 0x8 ){.    s
222e0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
222f0 66 28 22 69 6e 73 2d 6e 6f 6f 70 3a 20 22 29 3b  f("ins-noop: ");
22300 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72  .    whereLoopPr
22310 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  int(pTemplate, p
22320 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
22330 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
22340 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a  rn SQLITE_OK;  .
22350 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
22360 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f  the WhereLoop.nO
22370 75 74 20 76 61 6c 75 65 20 64 6f 77 6e 77 61 72  ut value downwar
22380 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  d to account for
22390 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
223a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
223b0 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
223c0 20 6c 6f 6f 70 20 62 75 74 20 77 68 69 63 68 20   loop but which 
223d0 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62 79 20  are not used by 
223e0 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a  an.** index..**.
223f0 2a 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e  ** In the curren
22400 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
22410 2c 20 74 68 65 20 66 69 72 73 74 20 65 78 74 72  , the first extr
22420 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
22430 65 72 6d 20 72 65 64 75 63 65 73 0a 2a 2a 20 74  erm reduces.** t
22440 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
22450 70 75 74 20 72 6f 77 73 20 62 79 20 61 20 66 61  put rows by a fa
22460 63 74 6f 72 20 6f 66 20 31 30 20 61 6e 64 20 65  ctor of 10 and e
22470 61 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 74  ach additional t
22480 65 72 6d 0a 2a 2a 20 72 65 64 75 63 65 73 20 74  erm.** reduces t
22490 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
224a0 70 75 74 20 72 6f 77 73 20 62 79 20 73 71 72 74  put rows by sqrt
224b0 28 32 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  (2)..*/.static v
224c0 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74  oid whereLoopOut
224d0 70 75 74 41 64 6a 75 73 74 28 57 68 65 72 65 43  putAdjust(WhereC
224e0 6c 61 75 73 65 20 2a 70 57 43 2c 20 57 68 65 72  lause *pWC, Wher
224f0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 29 7b 0a 20  eLoop *pLoop){. 
22500 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
22510 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73  m, *pX;.  Bitmas
22520 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e  k notAllowed = ~
22530 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70  (pLoop->prereq|p
22540 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b  Loop->maskSelf);
22550 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20  .  int i, j;..  
22560 69 66 28 20 21 4f 70 74 69 6d 69 7a 61 74 69 6f  if( !Optimizatio
22570 6e 45 6e 61 62 6c 65 64 28 70 57 43 2d 3e 70 57  nEnabled(pWC->pW
22580 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
22590 2c 20 53 51 4c 49 54 45 5f 41 64 6a 75 73 74 4f  , SQLITE_AdjustO
225a0 75 74 45 73 74 29 20 29 7b 0a 20 20 20 20 72 65  utEst) ){.    re
225b0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  turn;.  }.  for(
225c0 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20 70 54  i=pWC->nTerm, pT
225d0 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e 30 3b  erm=pWC->a; i>0;
225e0 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i--, pTerm++){.
225f0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
22600 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
22610 49 52 54 55 41 4c 29 21 3d 30 20 29 20 62 72 65  IRTUAL)!=0 ) bre
22620 61 6b 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ak;.    if( (pTe
22630 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
22640 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
22650 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
22660 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
22670 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 41  prereqAll & notA
22680 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20 63 6f 6e  llowed)!=0 ) con
22690 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a  tinue;.    for(j
226a0 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31  =pLoop->nLTerm-1
226b0 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20  ; j>=0; j--){.  
226c0 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e      pX = pLoop->
226d0 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20  aLTerm[j];.     
226e0 20 69 66 28 20 70 58 3d 3d 70 54 65 72 6d 20 29   if( pX==pTerm )
226f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
22700 28 20 70 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30  ( pX->iParent>=0
22710 20 26 26 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d   && (&pWC->a[pX-
22720 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72  >iParent])==pTer
22730 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  m ) break;.    }
22740 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20 70  .    if( j<0 ) p
22750 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54  Loop->nOut += pT
22760 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a  erm->truthProb;.
22770 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20    }.}../*.** We 
22780 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63  have so far matc
22790 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  hed pBuilder->pN
227a0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
227b0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64  terms of the ind
227c0 65 78 20 70 49 6e 64 65 78 2e 0a 2a 2a 20 54 72  ex pIndex..** Tr
227d0 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d  y to match one m
227e0 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50  ore..**.** If pP
227f0 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74  robe->tnum==0, t
22800 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78  hat means pIndex
22810 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78   is a fake index
22820 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a   used for the.**
22830 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
22840 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   KEY..*/.static 
22850 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
22860 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68  BtreeIndex(.  Wh
22870 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
22880 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a  pBuilder,     /*
22890 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66   The WhereLoop f
228a0 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75  actory */.  stru
228b0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
228c0 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46  *pSrc,      /* F
228d0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
228e0 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a  being analyzed *
228f0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62  /.  Index *pProb
22900 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
22910 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
22920 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67  on pSrc */.  Log
22930 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20  Est nInMul      
22940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22950 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74  log(Number of it
22960 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20  erations due to 
22970 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  IN) */.){.  Wher
22980 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
22990 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
229a0 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c  ;  /* WHERE anal
229b0 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  yse context */. 
229c0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
229d0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
229e0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
229f0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
22a00 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
22a10 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
22a20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
22a30 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f  ection malloc co
22a40 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
22a50 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20  Loop *pNew;     
22a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
22a70 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  mplate WhereLoop
22a80 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
22a90 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ion */.  WhereTe
22aa0 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
22ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68           /* A Wh
22ac0 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f  ereTerm under co
22ad0 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  nsideration */. 
22ae0 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20   int opMask;    
22af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b00 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74   /* Valid operat
22b10 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69  ors for constrai
22b20 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63  nts */.  WhereSc
22b30 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20  an scan;        
22b40 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
22b50 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74  ator for WHERE t
22b60 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  erms */.  Bitmas
22b70 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20  k saved_prereq; 
22b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
22b90 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
22ba0 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20  New->prereq */. 
22bb0 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72   u16 saved_nLTer
22bc0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
22bd0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
22be0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65  ue of pNew->nLTe
22bf0 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65  rm */.  int save
22c00 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20  d_nEq;          
22c10 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
22c20 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
22c30 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a  w->u.btree.nEq *
22c40 2f 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77 73  /.  u32 saved_ws
22c50 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
22c60 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
22c70 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77  value of pNew->w
22c80 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67 45  sFlags */.  LogE
22c90 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20  st saved_nOut;  
22ca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
22cb0 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
22cc0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20   pNew->nOut */. 
22cd0 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20   int iCol;      
22ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cf0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
22d00 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74   column in the t
22d10 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  able */.  int rc
22d20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
22d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
22d40 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f  urn code */.  Lo
22d50 67 45 73 74 20 6e 52 6f 77 45 73 74 3b 20 20 20  gEst nRowEst;   
22d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22d70 20 45 73 74 69 6d 61 74 65 64 20 69 6e 64 65 78   Estimated index
22d80 20 73 65 6c 65 63 74 69 76 69 74 79 20 2a 2f 0a   selectivity */.
22d90 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a    LogEst rLogSiz
22da0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
22db0 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f    /* Logarithm o
22dc0 66 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a  f table size */.
22dd0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f    WhereTerm *pTo
22de0 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30  p = 0, *pBtm = 0
22df0 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74  ; /* Top and bot
22e00 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  tom range constr
22e10 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77  aints */..  pNew
22e20 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
22e30 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  w;.  if( db->mal
22e40 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
22e50 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
22e60 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65  ..  assert( (pNe
22e70 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
22e80 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
22e90 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
22ea0 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
22eb0 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
22ec0 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  T)==0 );.  if( p
22ed0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
22ee0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
22ef0 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57  {.    opMask = W
22f00 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65  O_LT|WO_LE;.  }e
22f10 6c 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e  lse if( pProbe->
22f20 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70 53 72 63  tnum<=0 || (pSrc
22f30 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
22f40 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  LEFT)!=0 ){.    
22f50 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57  opMask = WO_EQ|W
22f60 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_IN|WO_GT|WO_GE
22f70 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20  |WO_LT|WO_LE;.  
22f80 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61 73  }else{.    opMas
22f90 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c  k = WO_EQ|WO_IN|
22fa0 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47 54 7c  WO_ISNULL|WO_GT|
22fb0 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_GE|WO_LT|WO_L
22fc0 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72  E;.  }.  if( pPr
22fd0 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  obe->bUnordered 
22fe0 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f  ) opMask &= ~(WO
22ff0 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c  _GT|WO_GE|WO_LT|
23000 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72  WO_LE);..  asser
23010 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  t( pNew->u.btree
23020 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 4b  .nEq<=pProbe->nK
23030 65 79 43 6f 6c 20 29 3b 0a 20 20 69 66 28 20 70  eyCol );.  if( p
23040 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
23050 20 3c 20 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43   < pProbe->nKeyC
23060 6f 6c 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  ol ){.    iCol =
23070 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
23080 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  n[pNew->u.btree.
23090 6e 45 71 5d 3b 0a 20 20 20 20 6e 52 6f 77 45 73  nEq];.    nRowEs
230a0 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
230b0 74 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45  t(pProbe->aiRowE
230c0 73 74 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  st[pNew->u.btree
230d0 2e 6e 45 71 2b 31 5d 29 3b 0a 20 20 20 20 69 66  .nEq+1]);.    if
230e0 28 20 6e 52 6f 77 45 73 74 3d 3d 30 20 26 26 20  ( nRowEst==0 && 
230f0 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 3d  pProbe->onError=
23100 3d 4f 45 5f 4e 6f 6e 65 20 29 20 6e 52 6f 77 45  =OE_None ) nRowE
23110 73 74 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  st = 1;.  }else{
23120 0a 20 20 20 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a  .    iCol = -1;.
23130 20 20 20 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b      nRowEst = 0;
23140 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 77  .  }.  pTerm = w
23150 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63  hereScanInit(&sc
23160 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  an, pBuilder->pW
23170 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  C, pSrc->iCursor
23180 2c 20 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  , iCol,.        
23190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231a0 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b  opMask, pProbe);
231b0 0a 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70  .  saved_nEq = p
231c0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
231d0 3b 0a 20 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d  ;.  saved_nLTerm
231e0 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b   = pNew->nLTerm;
231f0 0a 20 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73  .  saved_wsFlags
23200 20 3d 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73   = pNew->wsFlags
23210 3b 0a 20 20 73 61 76 65 64 5f 70 72 65 72 65 71  ;.  saved_prereq
23220 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b   = pNew->prereq;
23230 0a 20 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20  .  saved_nOut = 
23240 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 4e  pNew->nOut;.  pN
23250 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
23260 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74    rLogSize = est
23270 4c 6f 67 28 73 71 6c 69 74 65 33 4c 6f 67 45 73  Log(sqlite3LogEs
23280 74 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45  t(pProbe->aiRowE
23290 73 74 5b 30 5d 29 29 3b 0a 20 20 66 6f 72 28 3b  st[0]));.  for(;
232a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
232b0 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72  & pTerm!=0; pTer
232c0 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78  m = whereScanNex
232d0 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 69  t(&scan)){.    i
232e0 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64  nt nIn = 0;.#ifd
232f0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
23300 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
23310 20 20 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69      int nRecVali
23320 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  d = pBuilder->nR
23330 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a  ecValid;.#endif.
23340 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
23350 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53  eOperator==WO_IS
23360 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e  NULL || (pTerm->
23370 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55  wtFlags&TERM_VNU
23380 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20  LL)!=0).     && 
23390 28 69 43 6f 6c 3c 30 20 7c 7c 20 70 53 72 63 2d  (iCol<0 || pSrc-
233a0 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  >pTab->aCol[iCol
233b0 5d 2e 6e 6f 74 4e 75 6c 6c 29 0a 20 20 20 20 29  ].notNull).    )
233c0 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
233d0 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b  ; /* ignore IS [
233e0 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72  NOT] NULL constr
233f0 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c  aints on NOT NUL
23400 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  L columns */.   
23410 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d   }.    if( pTerm
23420 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
23430 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29  pNew->maskSelf )
23440 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
23450 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
23460 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29  ut==saved_nOut )
23470 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  ;..    pNew->wsF
23480 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46  lags = saved_wsF
23490 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  lags;.    pNew->
234a0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61  u.btree.nEq = sa
234b0 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65  ved_nEq;.    pNe
234c0 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
234d0 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66  d_nLTerm;.    if
234e0 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
234f0 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
23500 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72  ->nLTerm+1) ) br
23510 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20  eak; /* OOM */. 
23520 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
23530 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
23540 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65  = pTerm;.    pNe
23550 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76  w->prereq = (sav
23560 65 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72  ed_prereq | pTer
23570 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20  m->prereqRight) 
23580 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c  & ~pNew->maskSel
23590 66 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  f;.    pNew->rRu
235a0 6e 20 3d 20 72 4c 6f 67 53 69 7a 65 3b 20 2f 2a  n = rLogSize; /*
235b0 20 42 61 73 65 6c 69 6e 65 20 63 6f 73 74 20 69   Baseline cost i
235c0 73 20 6c 6f 67 32 28 4e 29 2e 20 20 41 64 6a 75  s log2(N).  Adju
235d0 73 74 6d 65 6e 74 73 20 62 65 6c 6f 77 20 2a 2f  stments below */
235e0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
235f0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
23600 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N ){.      Expr 
23610 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
23620 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  pExpr;.      pNe
23630 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
23640 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20  ERE_COLUMN_IN;. 
23650 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
23660 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
23670 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
23680 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
23690 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a  N (SELECT ...)":
236a0 20 20 54 55 4e 49 4e 47 3a 20 74 68 65 20 53 45    TUNING: the SE
236b0 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20  LECT returns 25 
236c0 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rows */.        
236d0 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73 65 72  nIn = 46;  asser
236e0 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 46==sqlite3Lo
236f0 67 45 73 74 28 32 35 29 20 29 3b 0a 20 20 20 20  gEst(25) );.    
23700 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
23710 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  YS(pExpr->x.pLis
23720 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t && pExpr->x.pL
23730 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
23740 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20         /* "x IN 
23750 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e  (value, value, .
23760 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  ..)" */.        
23770 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  nIn = sqlite3Log
23780 45 73 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  Est(pExpr->x.pLi
23790 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
237a0 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e    }.      pNew->
237b0 72 52 75 6e 20 2b 3d 20 6e 49 6e 3b 0a 20 20 20  rRun += nIn;.   
237c0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
237d0 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e  .nEq++;.      pN
237e0 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45  ew->nOut = nRowE
237f0 73 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49  st + nInMul + nI
23800 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  n;.    }else if(
23810 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
23820 72 20 26 20 28 57 4f 5f 45 51 29 20 29 7b 0a 20  r & (WO_EQ) ){. 
23830 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4e       assert( (pN
23840 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  ew->wsFlags & (W
23850 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
23860 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e  |WHERE_COLUMN_IN
23870 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ))!=0.          
23880 20 20 20 20 20 20 20 20 7c 7c 20 6e 49 6e 4d 75          || nInMu
23890 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e  l==0 );.      pN
238a0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
238b0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a  HERE_COLUMN_EQ;.
238c0 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
238d0 20 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50    .       || (pP
238e0 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  robe->onError!=O
238f0 45 5f 4e 6f 6e 65 20 26 26 20 6e 49 6e 4d 75 6c  E_None && nInMul
23900 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
23910 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  & pNew->u.btree.
23920 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65  nEq==pProbe->nKe
23930 79 43 6f 6c 2d 31 29 0a 20 20 20 20 20 20 29 7b  yCol-1).      ){
23940 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
23950 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
23960 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  & WHERE_COLUMN_I
23970 4e 29 3d 3d 30 20 7c 7c 20 69 43 6f 6c 3c 30 20  N)==0 || iCol<0 
23980 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
23990 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
239a0 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20  E_ONEROW;.      
239b0 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  }.      pNew->u.
239c0 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20  btree.nEq++;.   
239d0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
239e0 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c  nRowEst + nInMul
239f0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
23a00 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
23a10 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29   & (WO_ISNULL) )
23a20 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  {.      pNew->ws
23a30 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
23a40 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20  OLUMN_NULL;.    
23a50 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
23a60 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 2f 2a 20  nEq++;.      /* 
23a70 54 55 4e 49 4e 47 3a 20 49 53 20 4e 55 4c 4c 20  TUNING: IS NULL 
23a80 73 65 6c 65 63 74 73 20 32 20 72 6f 77 73 20 2a  selects 2 rows *
23a90 2f 0a 20 20 20 20 20 20 6e 49 6e 20 3d 20 31 30  /.      nIn = 10
23aa0 3b 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73  ;  assert( 10==s
23ab0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20  qlite3LogEst(2) 
23ac0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  );.      pNew->n
23ad0 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20  Out = nRowEst + 
23ae0 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20  nInMul + nIn;.  
23af0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72    }else if( pTer
23b00 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
23b10 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a  WO_GT|WO_GE) ){.
23b20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
23b30 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
23b40 20 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20   & WO_GT );.    
23b50 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
23b60 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
23b70 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 70 4e  O_GE );.      pN
23b80 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
23b90 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
23ba0 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  E|WHERE_BTM_LIMI
23bb0 54 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20  T;.      pBtm = 
23bc0 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f  pTerm;.      pTo
23bd0 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  p = 0;.    }else
23be0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
23bf0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
23c00 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29   & (WO_LT|WO_LE)
23c10 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
23c20 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
23c30 61 74 6f 72 20 26 20 57 4f 5f 4c 54 20 29 3b 0a  ator & WO_LT );.
23c40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
23c50 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
23c60 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20   & WO_LE );.    
23c70 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
23c80 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
23c90 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f  RANGE|WHERE_TOP_
23ca0 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 54 6f  LIMIT;.      pTo
23cb0 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  p = pTerm;.     
23cc0 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77   pBtm = (pNew->w
23cd0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
23ce0 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20  TM_LIMIT)!=0 ?. 
23cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d00 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
23d10 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d  [pNew->nLTerm-2]
23d20 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   : 0;.    }.    
23d30 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
23d40 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
23d50 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
23d60 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 61  /* Adjust nOut a
23d70 6e 64 20 72 52 75 6e 20 66 6f 72 20 53 54 41 54  nd rRun for STAT
23d80 33 20 72 61 6e 67 65 20 76 61 6c 75 65 73 20 2a  3 range values *
23d90 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
23da0 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65  pNew->nOut==save
23db0 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20 20  d_nOut );.      
23dc0 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
23dd0 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
23de0 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20  er, pBtm, pTop, 
23df0 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 23 69 66  pNew);.    }.#if
23e00 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
23e10 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
23e20 0a 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d  .    if( nInMul=
23e30 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 72 6f  =0 .     && pPro
23e40 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20  be->nSample .   
23e50 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72    && pNew->u.btr
23e60 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e  ee.nEq<=pProbe->
23e70 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20  nSampleCol.     
23e80 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
23e90 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
23ea0 45 5f 53 74 61 74 33 29 20 0a 20 20 20 20 29 7b  E_Stat3) .    ){
23eb0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
23ec0 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
23ed0 72 3b 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74  r;.      tRowcnt
23ee0 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20   nOut = 0;.     
23ef0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
23f00 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c  erator & (WO_EQ|
23f10 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 20 29  WO_ISNULL))!=0 )
23f20 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
23f30 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
23f40 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
23f50 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
23f60 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
23f70 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
23f80 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
23f90 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
23fa0 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
23fb0 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r, pExpr->pRight
23fc0 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  , &nOut);.      
23fd0 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d  }else if( (pTerm
23fe0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
23ff0 5f 49 4e 29 0a 20 20 20 20 20 20 20 20 20 20 20  _IN).           
24000 20 20 26 26 20 20 21 45 78 70 72 48 61 73 50 72    &&  !ExprHasPr
24010 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
24020 5f 78 49 73 53 65 6c 65 63 74 29 20 20 29 7b 0a  _xIsSelect)  ){.
24030 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
24040 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72  reInScanEst(pPar
24050 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45  se, pBuilder, pE
24060 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e  xpr->x.pList, &n
24070 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Out);.      }.  
24080 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f 75 74      assert( nOut
24090 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
240a0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
240b0 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  ( nOut ){.      
240c0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
240d0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75  qlite3LogEst(nOu
240e0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
240f0 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64  pNew->nOut>saved
24100 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f  _nOut ) pNew->nO
24110 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
24120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
24130 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70  endif.    if( (p
24140 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  New->wsFlags & (
24150 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57  WHERE_IDX_ONLY|W
24160 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b  HERE_IPK))==0 ){
24170 0a 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 72  .      /* Each r
24180 6f 77 20 69 6e 76 6f 6c 76 65 73 20 61 20 73 74  ow involves a st
24190 65 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c  ep of the index,
241a0 20 74 68 65 6e 20 61 20 62 69 6e 61 72 79 20 73   then a binary s
241b0 65 61 72 63 68 20 6f 66 0a 20 20 20 20 20 20 2a  earch of.      *
241c0 2a 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  * the main table
241d0 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
241e0 72 52 75 6e 20 3d 20 20 73 71 6c 69 74 65 33 4c  rRun =  sqlite3L
241f0 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72  ogEstAdd(pNew->r
24200 52 75 6e 2c 72 4c 6f 67 53 69 7a 65 3e 32 37 20  Run,rLogSize>27 
24210 3f 20 72 4c 6f 67 53 69 7a 65 2d 31 37 20 3a 20  ? rLogSize-17 : 
24220 31 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  10);.    }.    /
24230 2a 20 53 74 65 70 20 63 6f 73 74 20 66 6f 72 20  * Step cost for 
24240 65 61 63 68 20 6f 75 74 70 75 74 20 72 6f 77 20  each output row 
24250 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  */.    pNew->rRu
24260 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
24270 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  tAdd(pNew->rRun,
24280 20 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20   pNew->nOut);.  
24290 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
242a0 74 41 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72  tAdjust(pBuilder
242b0 2d 3e 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20 20  ->pWC, pNew);.  
242c0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
242d0 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
242e0 20 70 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20   pNew);.    if( 
242f0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
24300 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
24310 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65  )==0.     && pNe
24320 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 28  w->u.btree.nEq<(
24330 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 20  pProbe->nKeyCol 
24340 2b 20 28 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65  + (pProbe->zName
24350 21 3d 30 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  !=0)).    ){.   
24360 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42     whereLoopAddB
24370 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64  treeIndex(pBuild
24380 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65  er, pSrc, pProbe
24390 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20  , nInMul+nIn);. 
243a0 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e     }.    pNew->n
243b0 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
243c0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
243d0 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
243e0 53 54 41 54 34 0a 20 20 20 20 70 42 75 69 6c 64  STAT4.    pBuild
243f0 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
24400 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69  nRecValid;.#endi
24410 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72  f.  }.  pNew->pr
24420 65 72 65 71 20 3d 20 73 61 76 65 64 5f 70 72 65  ereq = saved_pre
24430 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62  req;.  pNew->u.b
24440 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64  tree.nEq = saved
24450 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 77 73  _nEq;.  pNew->ws
24460 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
24470 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e  Flags;.  pNew->n
24480 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
24490 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ;.  pNew->nLTerm
244a0 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b   = saved_nLTerm;
244b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
244c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72  ./*.** Return Tr
244d0 75 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ue if it is poss
244e0 69 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78  ible that pIndex
244f0 20 6d 69 67 68 74 20 62 65 20 75 73 65 66 75 6c   might be useful
24500 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   in.** implement
24510 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
24520 20 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c   clause in pBuil
24530 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  der..**.** Retur
24540 6e 20 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c  n False if pBuil
24550 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  der does not con
24560 74 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59  tain an ORDER BY
24570 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66   clause or.** if
24580 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
24590 20 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62   for pIndex to b
245a0 65 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c  e useful in impl
245b0 65 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a  ementing that.**
245c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
245d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
245e0 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69  indexMightHelpWi
245f0 74 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65  thOrderBy(.  Whe
24600 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
24610 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78  Builder,.  Index
24620 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20   *pIndex,.  int 
24630 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70  iCursor.){.  Exp
24640 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 69 6e  rList *pOB;.  in
24650 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28  t ii, jj;..  if(
24660 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65   pIndex->bUnorde
24670 72 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  red ) return 0;.
24680 20 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75    if( (pOB = pBu
24690 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70  ilder->pWInfo->p
246a0 4f 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65  OrderBy)==0 ) re
246b0 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69  turn 0;.  for(ii
246c0 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70  =0; ii<pOB->nExp
246d0 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78  r; ii++){.    Ex
246e0 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69  pr *pExpr = sqli
246f0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
24700 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45  te(pOB->a[ii].pE
24710 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45  xpr);.    if( pE
24720 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
24730 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MN ) return 0;. 
24740 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
24750 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b  able==iCursor ){
24760 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b  .      for(jj=0;
24770 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79   jj<pIndex->nKey
24780 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20  Col; jj++){.    
24790 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
247a0 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e  Column==pIndex->
247b0 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72  aiColumn[jj] ) r
247c0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
247d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
247e0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
247f0 52 65 74 75 72 6e 20 61 20 62 69 74 6d 61 73 6b  Return a bitmask
24800 20 77 68 65 72 65 20 31 73 20 69 6e 64 69 63 61   where 1s indica
24810 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  te that the corr
24820 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e  esponding column
24830 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
24840 20 69 73 20 75 73 65 64 20 62 79 20 61 6e 20 69   is used by an i
24850 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20  ndex.  Only the 
24860 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73  first 63 columns
24870 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e   are considered.
24880 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
24890 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  sk columnsInInde
248a0 78 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  x(Index *pIdx){.
248b0 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b    Bitmask m = 0;
248c0 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28  .  int j;.  for(
248d0 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d  j=pIdx->nColumn-
248e0 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
248f0 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d     int x = pIdx-
24900 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
24910 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20    if( x>=0 ){.  
24920 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
24930 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
24940 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
24950 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -2 );.      if( 
24960 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d  x<BMS-1 ) m |= M
24970 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d  ASKBIT(x);.    }
24980 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b  .  }.  return m;
24990 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20  .}../* Check to 
249a0 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c  see if a partial
249b0 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72   index with pPar
249c0 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20  tIndexWhere can 
249d0 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68  be used.** in th
249e0 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e  e current query.
249f0 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
24a00 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66   it can be and f
24a10 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  alse if not..*/.
24a20 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
24a30 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
24a40 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65  ex(int iTab, Whe
24a50 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
24a60 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20  xpr *pWhere){.  
24a70 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
24a80 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 66 6f 72  rm *pTerm;.  for
24a90 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  (i=0, pTerm=pWC-
24aa0 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
24ab0 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
24ac0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
24ad0 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
24ae0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 70 57  pTerm->pExpr, pW
24af0 68 65 72 65 2c 20 69 54 61 62 29 20 29 20 72 65  here, iTab) ) re
24b00 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
24b10 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
24b20 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
24b30 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
24b40 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66   single table of
24b50 20 74 68 65 20 6a 6f 69 6e 20 77 68 65 72 65 20   the join where 
24b60 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20  the table.** is 
24b70 69 64 65 6e 66 69 65 64 20 62 79 20 70 42 75 69  idenfied by pBui
24b80 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
24b90 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
24ba0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
24bb0 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61  e.** a b-tree ta
24bc0 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75  ble, not a virtu
24bd0 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
24be0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
24bf0 70 41 64 64 42 74 72 65 65 28 0a 20 20 57 68 65  pAddBtree(.  Whe
24c00 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
24c10 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52  Builder, /* WHER
24c20 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61  E clause informa
24c30 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
24c40 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20 20 20  k mExtra        
24c50 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70        /* Extra p
24c60 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72  rerequesites for
24c70 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c   using this tabl
24c80 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  e */.){.  WhereI
24c90 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
24ca0 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61        /* WHERE a
24cb0 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20  nalysis context 
24cc0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
24cd0 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
24ce0 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20   /* An index we 
24cf0 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a  are evaluating *
24d00 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20  /.  Index sPk;  
24d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20  /* A fake index 
24d30 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70  object for the p
24d40 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20  rimary key */.  
24d50 74 52 6f 77 63 6e 74 20 61 69 52 6f 77 45 73 74  tRowcnt aiRowEst
24d60 50 6b 5b 32 5d 3b 20 20 20 20 20 20 2f 2a 20 54  Pk[2];      /* T
24d70 68 65 20 61 69 52 6f 77 45 73 74 5b 5d 20 76 61  he aiRowEst[] va
24d80 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20  lue for the sPk 
24d90 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61  index */.  i16 a
24da0 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20  iColumnPk = -1; 
24db0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43         /* The aC
24dc0 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f  olumn[] value fo
24dd0 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
24de0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
24df0 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  abList;         
24e00 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
24e10 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
24e20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
24e30 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc;  /* The FROM
24e40 20 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65   clause btree te
24e50 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57  rm to add */.  W
24e60 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20  hereLoop *pNew; 
24e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
24e80 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  mplate WhereLoop
24e90 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
24ea0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
24ec0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
24ed0 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20   iSortIdx = 1;  
24ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
24ef0 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  x number */.  in
24f00 74 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  t b;            
24f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62            /* A b
24f20 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a  oolean value */.
24f30 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20    LogEst rSize; 
24f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24f50 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
24f60 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
24f70 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a    LogEst rLogSiz
24f80 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
24f90 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   Logarithm of th
24fa0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
24fb0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
24fc0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
24fd0 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f  pWC;           /
24fe0 2a 20 54 68 65 20 70 61 72 73 65 64 20 57 48 45  * The parsed WHE
24ff0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54  RE clause */.  T
25000 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
25010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
25020 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65  ble being querie
25030 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d  d */.  .  pNew =
25040 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
25050 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  .  pWInfo = pBui
25060 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
25070 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
25080 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70  o->pTabList;.  p
25090 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Src = pTabList->
250a0 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a  a + pNew->iTab;.
250b0 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70    pTab = pSrc->p
250c0 54 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75  Tab;.  pWC = pBu
250d0 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73  ilder->pWC;.  as
250e0 73 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c  sert( !IsVirtual
250f0 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a  (pSrc->pTab) );.
25100 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e  .  if( pSrc->pIn
25110 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e  dex ){.    /* An
25120 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
25130 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70  se specifies a p
25140 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
25150 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50  to use */.    pP
25160 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e  robe = pSrc->pIn
25170 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  dex;.  }else if(
25180 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
25190 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d   ){.    pProbe =
251a0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
251b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
251c0 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58  here is no INDEX
251d0 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43  ED BY clause.  C
251e0 72 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64  reate a fake Ind
251f0 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63  ex object in loc
25200 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  al.    ** variab
25210 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73  le sPk to repres
25220 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72  ent the rowid pr
25230 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e  imary key index.
25240 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20    Make this.    
25250 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68  ** fake index th
25260 65 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61  e first in a cha
25270 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65  in of Index obje
25280 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20  cts with all of 
25290 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20  the real.    ** 
252a0 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f  indices to follo
252b0 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  w */.    Index *
252c0 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
252d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
252e0 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65  t of real indice
252f0 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s on the table *
25300 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50  /.    memset(&sP
25310 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64  k, 0, sizeof(Ind
25320 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b  ex));.    sPk.nK
25330 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73  eyCol = 1;.    s
25340 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61  Pk.aiColumn = &a
25350 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73  iColumnPk;.    s
25360 50 6b 2e 61 69 52 6f 77 45 73 74 20 3d 20 61 69  Pk.aiRowEst = ai
25370 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50  RowEstPk;.    sP
25380 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52  k.onError = OE_R
25390 65 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e  eplace;.    sPk.
253a0 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20  pTable = pTab;. 
253b0 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d     aiRowEstPk[0]
253c0 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74   = pTab->nRowEst
253d0 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b  ;.    aiRowEstPk
253e0 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70 46 69  [1] = 1;.    pFi
253f0 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  rst = pSrc->pTab
25400 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  ->pIndex;.    if
25410 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78  ( pSrc->notIndex
25420 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ed==0 ){.      /
25430 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63  * The real indic
25440 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  es of the table 
25450 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65  are only conside
25460 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20  red if the.     
25470 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20   ** NOT INDEXED 
25480 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69  qualifier is omi
25490 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52  tted from the FR
254a0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
254b0 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70     sPk.pNext = p
254c0 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20  First;.    }.   
254d0 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a   pProbe = &sPk;.
254e0 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 73 71    }.  rSize = sq
254f0 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 54 61 62  lite3LogEst(pTab
25500 2d 3e 6e 52 6f 77 45 73 74 29 3b 0a 20 20 72 4c  ->nRowEst);.  rL
25510 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28  ogSize = estLog(
25520 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e 64 65 66  rSize);..#ifndef
25530 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
25540 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 2f  OMATIC_INDEX.  /
25550 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  * Automatic inde
25560 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42  xes */.  if( !pB
25570 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 0a 20  uilder->pOrSet. 
25580 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50    && (pWInfo->pP
25590 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
255a0 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64  & SQLITE_AutoInd
255b0 65 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72  ex)!=0.   && pSr
255c0 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20  c->pIndex==0.   
255d0 26 26 20 21 70 53 72 63 2d 3e 76 69 61 43 6f 72  && !pSrc->viaCor
255e0 6f 75 74 69 6e 65 0a 20 20 20 26 26 20 21 70 53  outine.   && !pS
255f0 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a 20  rc->notIndexed. 
25600 20 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 54    && HasRowid(pT
25610 61 62 29 0a 20 20 20 26 26 20 21 70 53 72 63 2d  ab).   && !pSrc-
25620 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 0a 20 20  >isCorrelated.  
25630 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ){.    /* Genera
25640 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68  te auto-index Wh
25650 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20  ereLoops */.    
25660 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
25670 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
25680 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61  *pWCEnd = pWC->a
25690 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20   + pWC->nTerm;. 
256a0 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
256b0 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ->a; rc==SQLITE_
256c0 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45  OK && pTerm<pWCE
256d0 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
256e0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
256f0 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
25700 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
25710 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
25720 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
25730 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
25740 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   0) ){.        p
25750 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
25760 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 1;.        pN
25770 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
25780 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ex = 0;.        
25790 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  pNew->nLTerm = 1
257a0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
257b0 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
257c0 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  m;.        /* TU
257d0 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63  NING: One-time c
257e0 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e  ost for computin
257f0 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  g the automatic 
25800 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20 20 20  index is.       
25810 20 2a 2a 20 61 70 70 72 6f 78 69 6d 61 74 65 6c   ** approximatel
25820 79 20 37 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68  y 7*N*log2(N) wh
25830 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
25840 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20  ber of rows in. 
25850 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61         ** the ta
25860 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65  ble being indexe
25870 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  d. */.        pN
25880 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f  ew->rSetup = rLo
25890 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 20 2b 20  gSize + rSize + 
258a0 32 38 3b 20 20 61 73 73 65 72 74 28 20 32 38 3d  28;  assert( 28=
258b0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 37  =sqlite3LogEst(7
258c0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) );.        /* 
258d0 54 55 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64  TUNING: Each ind
258e0 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73  ex lookup yields
258f0 20 32 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20   20 rows in the 
25900 74 61 62 6c 65 2e 20 20 54 68 69 73 0a 20 20 20  table.  This.   
25910 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20       ** is more 
25920 74 68 61 6e 20 74 68 65 20 75 73 75 61 6c 20 67  than the usual g
25930 75 65 73 73 20 6f 66 20 31 30 20 72 6f 77 73 2c  uess of 10 rows,
25940 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6e   since we have n
25950 6f 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a  o way.        **
25960 20 6f 66 20 6b 6e 6f 77 6e 69 6e 67 20 68 6f 77   of knowning how
25970 20 73 65 6c 65 63 74 69 76 65 20 74 68 65 20 69   selective the i
25980 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61  ndex will ultima
25990 74 65 6c 79 20 62 65 2e 20 20 49 74 20 77 6f 75  tely be.  It wou
259a0 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  ld.        ** no
259b0 74 20 62 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c  t be unreasonabl
259c0 65 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 76  e to make this v
259d0 61 6c 75 65 20 6d 75 63 68 20 6c 61 72 67 65 72  alue much larger
259e0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  . */.        pNe
259f0 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61  w->nOut = 43;  a
25a00 73 73 65 72 74 28 20 34 33 3d 3d 73 71 6c 69 74  ssert( 43==sqlit
25a10 65 33 4c 6f 67 45 73 74 28 32 30 29 20 29 3b 0a  e3LogEst(20) );.
25a20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
25a30 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
25a40 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70  stAdd(rLogSize,p
25a50 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20  New->nOut);.    
25a60 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
25a70 73 20 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s = WHERE_AUTO_I
25a80 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70 4e  NDEX;.        pN
25a90 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78  ew->prereq = mEx
25aa0 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65  tra | pTerm->pre
25ab0 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20  reqRight;.      
25ac0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
25ad0 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
25ae0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a   pNew);.      }.
25af0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
25b00 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
25b10 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
25b20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76  */..  /* Loop ov
25b30 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20  er all indices. 
25b40 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d   */.  for(; rc==
25b50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 72  SQLITE_OK && pPr
25b60 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f  obe; pProbe=pPro
25b70 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74  be->pNext, iSort
25b80 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  Idx++){.    if( 
25b90 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78  pProbe->pPartIdx
25ba0 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20 26 26  Where!=0.     &&
25bb0 20 21 77 68 65 72 65 55 73 61 62 6c 65 50 61 72   !whereUsablePar
25bc0 74 69 61 6c 49 6e 64 65 78 28 70 4e 65 77 2d 3e  tialIndex(pNew->
25bd0 69 54 61 62 2c 20 70 57 43 2c 20 70 50 72 6f 62  iTab, pWC, pProb
25be0 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  e->pPartIdxWhere
25bf0 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69  ) ){.      conti
25c00 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c  nue;  /* Partial
25c10 20 69 6e 64 65 78 20 69 6e 61 70 70 72 6f 70 72   index inappropr
25c20 69 61 74 65 20 66 6f 72 20 74 68 69 73 20 71 75  iate for this qu
25c30 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ery */.    }.   
25c40 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
25c50 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  Eq = 0;.    pNew
25c60 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20  ->nLTerm = 0;.  
25c70 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78    pNew->iSortIdx
25c80 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
25c90 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20  rSetup = 0;.    
25ca0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d  pNew->prereq = m
25cb0 45 78 74 72 61 3b 0a 20 20 20 20 70 4e 65 77 2d  Extra;.    pNew-
25cc0 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20  >nOut = rSize;. 
25cd0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
25ce0 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62 65  .pIndex = pProbe
25cf0 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78 4d  ;.    b = indexM
25d00 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65  ightHelpWithOrde
25d10 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70 50  rBy(pBuilder, pP
25d20 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75 72  robe, pSrc->iCur
25d30 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  sor);.    /* The
25d40 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44   ONEPASS_DESIRED
25d50 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f 63 63   flags never occ
25d60 75 72 73 20 74 6f 67 65 74 68 65 72 20 77 69 74  urs together wit
25d70 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20  h ORDER BY */.  
25d80 20 20 61 73 73 65 72 74 28 20 28 70 57 49 6e 66    assert( (pWInf
25d90 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
25da0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
25db0 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d  SIRED)==0 || b==
25dc0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 72  0 );.    if( pPr
25dd0 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a  obe->tnum<=0 ){.
25de0 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
25df0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
25e00 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  ex */.      pNew
25e10 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
25e20 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a  E_IPK;..      /*
25e30 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   Full table scan
25e40 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
25e50 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69  iSortIdx = b ? i
25e60 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20  SortIdx : 0;.   
25e70 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
25e80 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c 65  st of full table
25e90 20 73 63 61 6e 20 69 73 20 33 2a 28 4e 20 2b 20   scan is 3*(N + 
25ea0 6c 6f 67 32 28 4e 29 29 2e 0a 20 20 20 20 20 20  log2(N))..      
25eb0 2a 2a 20 20 2b 20 20 54 68 65 20 65 78 74 72 61  **  +  The extra
25ec0 20 33 20 66 61 63 74 6f 72 20 69 73 20 74 6f 20   3 factor is to 
25ed0 65 6e 63 6f 75 72 61 67 65 20 74 68 65 20 75 73  encourage the us
25ee0 65 20 6f 66 20 69 6e 64 65 78 65 64 20 6c 6f 6f  e of indexed loo
25ef0 6b 75 70 73 0a 20 20 20 20 20 20 2a 2a 20 20 20  kups.      **   
25f00 20 20 6f 76 65 72 20 66 75 6c 6c 20 73 63 61 6e    over full scan
25f10 73 2e 20 20 46 49 58 4d 45 20 2a 2f 0a 20 20 20  s.  FIXME */.   
25f20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
25f30 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
25f40 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69 7a 65 29  (rSize,rLogSize)
25f50 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 77 68 65   + 16;.      whe
25f60 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
25f70 73 74 28 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20  st(pWC, pNew);. 
25f80 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
25f90 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
25fa0 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
25fb0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
25fc0 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ize;.      if( r
25fd0 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  c ) break;.    }
25fe0 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d  else{.      Bitm
25ff0 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28  ask m;.      if(
26000 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72   pProbe->isCover
26010 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ing ){.        p
26020 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
26030 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20  HERE_IDX_ONLY | 
26040 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
26050 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20         m = 0;.  
26060 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26070 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c     m = pSrc->col
26080 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49  Used & ~columnsI
26090 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29 3b 0a  nIndex(pProbe);.
260a0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
260b0 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f  Flags = (m==0) ?
260c0 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   (WHERE_IDX_ONLY
260d0 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20  |WHERE_INDEXED) 
260e0 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  : WHERE_INDEXED;
260f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
26100 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61  /* Full scan via
26110 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
26120 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20  if( b.       || 
26130 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a  !HasRowid(pTab).
26140 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30         || ( m==0
26150 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72  .         && pPr
26160 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d  obe->bUnordered=
26170 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
26180 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
26190 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29  <pTab->szTabRow)
261a0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57  .         && (pW
261b0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
261c0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
261d0 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20  _DESIRED)==0.   
261e0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
261f0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73  GlobalConfig.bUs
26200 65 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26  eCis.         &&
26210 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
26220 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61  bled(pWInfo->pPa
26230 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
26240 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20  CoverIdxScan).  
26250 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20          ).      
26260 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
26270 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
26280 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20  iSortIdx : 0;.  
26290 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29        if( m==0 )
262a0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
262b0 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61  UNING: Cost of a
262c0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
262d0 73 63 61 6e 20 69 73 20 4b 2a 28 4e 20 2b 20 6c  scan is K*(N + l
262e0 6f 67 32 28 4e 29 29 2e 0a 20 20 20 20 20 20 20  og2(N))..       
262f0 20 20 20 2a 2a 20 20 2b 20 20 54 68 65 20 65 78     **  +  The ex
26300 74 72 61 20 66 61 63 74 6f 72 20 4b 20 6f 66 20  tra factor K of 
26310 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20  between 1.1 and 
26320 33 2e 30 20 74 68 61 74 20 64 65 70 65 6e 64 73  3.0 that depends
26330 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20  .          **   
26340 20 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76    on the relativ
26350 65 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20 74  e sizes of the t
26360 61 62 6c 65 20 61 6e 64 20 74 68 65 20 69 6e 64  able and the ind
26370 65 78 2e 20 20 4b 0a 20 20 20 20 20 20 20 20 20  ex.  K.         
26380 20 2a 2a 20 20 20 20 20 69 73 20 73 6d 61 6c 6c   **     is small
26390 65 72 20 66 6f 72 20 73 6d 61 6c 6c 65 72 20 69  er for smaller i
263a0 6e 64 69 63 65 73 2c 20 74 68 75 73 20 66 61 76  ndices, thus fav
263b0 6f 72 69 6e 67 20 74 68 65 6d 2e 0a 20 20 20 20  oring them..    
263c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
263d0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
263e0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
263f0 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69 7a 65 29  (rSize,rLogSize)
26400 20 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20   + 1 +.         
26410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
26420 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78  15*pProbe->szIdx
26430 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62  Row)/pTab->szTab
26440 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  Row;.        }el
26450 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
26460 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
26470 20 73 63 61 6e 6e 69 6e 67 20 61 20 6e 6f 6e 2d   scanning a non-
26480 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 69  covering index i
26490 73 20 28 4e 2b 31 29 2a 6c 6f 67 32 28 4e 29 0a  s (N+1)*log2(N).
264a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 68 69            ** whi
264b0 63 68 20 77 65 20 77 69 6c 6c 20 73 69 6d 70 6c  ch we will simpl
264c0 69 66 79 20 74 6f 20 6a 75 73 74 20 4e 2a 6c 6f  ify to just N*lo
264d0 67 32 28 4e 29 20 2a 2f 0a 20 20 20 20 20 20 20  g2(N) */.       
264e0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
264f0 72 53 69 7a 65 20 2b 20 72 4c 6f 67 53 69 7a 65  rSize + rLogSize
26500 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26510 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74      whereLoopOut
26520 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70  putAdjust(pWC, p
26530 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 72 63  New);.        rc
26540 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
26550 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
26560 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  w);.        pNew
26570 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a  ->nOut = rSize;.
26580 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
26590 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
265a0 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
265b0 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
265c0 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c  eIndex(pBuilder,
265d0 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 30   pSrc, pProbe, 0
265e0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
265f0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
26600 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c 69 74  _STAT4.    sqlit
26610 65 33 53 74 61 74 34 50 72 6f 62 65 46 72 65 65  e3Stat4ProbeFree
26620 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 29  (pBuilder->pRec)
26630 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ;.    pBuilder->
26640 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20  nRecValid = 0;. 
26650 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65     pBuilder->pRe
26660 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  c = 0;.#endif.. 
26670 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
26680 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  as an INDEXED BY
26690 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e   clause, then on
266a0 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65  ly that one inde
266b0 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  x is.    ** cons
266c0 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  idered. */.    i
266d0 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20  f( pSrc->pIndex 
266e0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
266f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
26700 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
26710 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
26720 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
26730 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
26740 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65  r a table of the
26750 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64   join identified
26760 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d   by.** pBuilder-
26770 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68  >pNew->iTab.  Th
26780 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72  at table is guar
26790 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 76  anteed to be a v
267a0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  irtual table..*/
267b0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
267c0 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
267d0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
267e0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20  der *pBuilder,  
267f0 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
26800 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
26810 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 0a   Bitmask mExtra.
26820 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
26830 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
26840 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
26850 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  sis context */. 
26860 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
26870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26880 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
26890 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
268a0 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20  lause *pWC;     
268b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
268c0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
268d0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
268e0 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20  tem *pSrc;   /* 
268f0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
26900 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
26910 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
26920 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
26930 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
26940 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a  info *pIdxInfo;.
26950 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
26960 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
26970 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73  t *pIdxCons;.  s
26980 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
26990 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
269a0 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20  sage *pUsage;.  
269b0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
269c0 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
269d0 69 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54 65 72  int iTerm, mxTer
269e0 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  m;.  int nConstr
269f0 61 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e  aint;.  int seen
26a00 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  In = 0;         
26a10 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
26a20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  an IN operator i
26a30 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  s seen */.  int 
26a40 73 65 65 6e 56 61 72 20 3d 20 30 3b 20 20 20 20  seenVar = 0;    
26a50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
26a60 20 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61   if a non-consta
26a70 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  nt constraint is
26a80 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69   seen */.  int i
26a90 50 68 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  Phase;          
26aa0 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 63 6f          /* 0: co
26ab0 6e 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20 63  nst w/o IN, 1: c
26ac0 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20  onst, 2: no IN, 
26ad0 20 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65 72   2: IN */.  Wher
26ae0 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 69  eLoop *pNew;.  i
26af0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26b00 4b 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70  K;..  pWInfo = p
26b10 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
26b20 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e  .  pParse = pWIn
26b30 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  fo->pParse;.  db
26b40 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
26b50 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d   pWC = pBuilder-
26b60 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70  >pWC;.  pNew = p
26b70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
26b80 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d   pSrc = &pWInfo-
26b90 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65  >pTabList->a[pNe
26ba0 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54 61 62  w->iTab];.  pTab
26bb0 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
26bc0 20 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75   assert( IsVirtu
26bd0 61 6c 28 70 54 61 62 29 20 29 3b 0a 20 20 70 49  al(pTab) );.  pI
26be0 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74  dxInfo = allocat
26bf0 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73  eIndexInfo(pPars
26c00 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 70 42  e, pWC, pSrc, pB
26c10 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79  uilder->pOrderBy
26c20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66  );.  if( pIdxInf
26c30 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  o==0 ) return SQ
26c40 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e  LITE_NOMEM;.  pN
26c50 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a  ew->prereq = 0;.
26c60 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
26c70 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c   0;.  pNew->wsFl
26c80 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54  ags = WHERE_VIRT
26c90 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77  UALTABLE;.  pNew
26ca0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20  ->nLTerm = 0;.  
26cb0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
26cc0 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 70 55 73  dFree = 0;.  pUs
26cd0 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  age = pIdxInfo->
26ce0 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
26cf0 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20  ;.  nConstraint 
26d00 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  = pIdxInfo->nCon
26d10 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28 20 77  straint;.  if( w
26d20 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
26d30 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72  b, pNew, nConstr
26d40 61 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  aint) ){.    sql
26d50 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
26d60 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 72 65  IdxInfo);.    re
26d70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
26d80 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 50  M;.  }..  for(iP
26d90 68 61 73 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d  hase=0; iPhase<=
26da0 33 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20  3; iPhase++){.  
26db0 20 20 69 66 28 20 21 73 65 65 6e 49 6e 20 26 26    if( !seenIn &&
26dc0 20 28 69 50 68 61 73 65 26 31 29 21 3d 30 20 29   (iPhase&1)!=0 )
26dd0 7b 0a 20 20 20 20 20 20 69 50 68 61 73 65 2b 2b  {.      iPhase++
26de0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 68 61  ;.      if( iPha
26df0 73 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a 20 20  se>3 ) break;.  
26e00 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65    }.    if( !see
26e10 6e 56 61 72 20 26 26 20 69 50 68 61 73 65 3e 31  nVar && iPhase>1
26e20 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49   ) break;.    pI
26e30 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63  dxCons = *(struc
26e40 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
26e50 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
26e60 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
26e70 69 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  int;.    for(i=0
26e80 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  ; i<pIdxInfo->nC
26e90 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20  onstraint; i++, 
26ea0 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20  pIdxCons++){.   
26eb0 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d     j = pIdxCons-
26ec0 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  >iTermOffset;.  
26ed0 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
26ee0 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77  ->a[j];.      sw
26ef0 69 74 63 68 28 20 69 50 68 61 73 65 20 29 7b 0a  itch( iPhase ){.
26f00 20 20 20 20 20 20 20 20 63 61 73 65 20 30 3a 20          case 0: 
26f10 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20     /* Constants 
26f20 77 69 74 68 6f 75 74 20 49 4e 20 6f 70 65 72 61  without IN opera
26f30 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tor */.         
26f40 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
26f50 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
26f60 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
26f70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21  erator & WO_IN)!
26f80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
26f90 20 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20    seenIn = 1;.  
26fa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26fb0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
26fc0 72 65 72 65 71 52 69 67 68 74 21 3d 30 20 29 7b  rereqRight!=0 ){
26fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65  .            see
26fe0 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  nVar = 1;.      
26ff0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
27000 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
27010 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20  & WO_IN)==0 ){. 
27020 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43             pIdxC
27030 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b  ons->usable = 1;
27040 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27050 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
27060 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 20 20        case 1:   
27070 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69   /* Constants wi
27080 74 68 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  th IN operators 
27090 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
270a0 65 72 74 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20  ert( seenIn );. 
270b0 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
270c0 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65  s->usable = (pTe
270d0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d  rm->prereqRight=
270e0 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  =0);.          b
270f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
27100 73 65 20 32 3a 20 20 20 20 2f 2a 20 56 61 72 69  se 2:    /* Vari
27110 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e  ables without IN
27120 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
27130 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 29 3b  sert( seenVar );
27140 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43  .          pIdxC
27150 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70  ons->usable = (p
27160 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
27170 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20  & WO_IN)==0;.   
27180 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
27190 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20        default:  
271a0 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69   /* Variables wi
271b0 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20  th IN */.       
271c0 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56     assert( seenV
271d0 61 72 20 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a  ar && seenIn );.
271e0 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
271f0 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a  ns->usable = 1;.
27200 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
27210 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27220 20 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65     memset(pUsage
27230 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61  , 0, sizeof(pUsa
27240 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d  ge[0])*pIdxInfo-
27250 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20  >nConstraint);. 
27260 20 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d     if( pIdxInfo-
27270 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
27280 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  r ) sqlite3_free
27290 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74  (pIdxInfo->idxSt
272a0 72 29 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f  r);.    pIdxInfo
272b0 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  ->idxStr = 0;.  
272c0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e    pIdxInfo->idxN
272d0 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  um = 0;.    pIdx
272e0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
272f0 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
27300 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
27310 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
27320 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
27330 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c  imatedCost = SQL
27340 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64  ITE_BIG_DBL / (d
27350 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20 70 49 64  ouble)2;.    pId
27360 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
27370 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20 20 20 72  Rows = 25;.    r
27380 63 20 3d 20 76 74 61 62 42 65 73 74 49 6e 64 65  c = vtabBestInde
27390 78 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  x(pParse, pTab, 
273a0 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 69  pIdxInfo);.    i
273b0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65  f( rc ) goto whe
273c0 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78  reLoopAddVtab_ex
273d0 69 74 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  it;.    pIdxCons
273e0 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69   = *(struct sqli
273f0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
27400 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
27410 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->aConstraint;. 
27420 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
27430 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 6d 78  = mExtra;.    mx
27440 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 61  Term = -1;.    a
27450 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53  ssert( pNew->nLS
27460 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  lot>=nConstraint
27470 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
27480 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   i<nConstraint; 
27490 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72  i++) pNew->aLTer
274a0 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e  m[i] = 0;.    pN
274b0 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d  ew->u.vtab.omitM
274c0 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ask = 0;.    for
274d0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61  (i=0; i<nConstra
274e0 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f  int; i++, pIdxCo
274f0 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ns++){.      if(
27500 20 28 69 54 65 72 6d 20 3d 20 70 55 73 61 67 65   (iTerm = pUsage
27510 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d 20  [i].argvIndex - 
27520 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)>=0 ){.       
27530 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69   j = pIdxCons->i
27540 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
27550 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e      if( iTerm>=n
27560 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20  Constraint.     
27570 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20      || j<0.     
27580 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e      || j>=pWC->n
27590 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 7c 7c  Term.         ||
275a0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54   pNew->aLTerm[iT
275b0 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20 20  erm]!=0.        
275c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
275d0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
275e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
275f0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
27600 2c 20 22 25 73 2e 78 42 65 73 74 49 6e 64 65 78  , "%s.xBestIndex
27610 28 29 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c  () malfunction",
27620 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
27630 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68           goto wh
27640 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65  ereLoopAddVtab_e
27650 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xit;.        }. 
27660 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
27670 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61   iTerm==nConstra
27680 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  int-1 );.       
27690 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20   testcase( j==0 
276a0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
276b0 61 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65  ase( j==pWC->nTe
276c0 72 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  rm-1 );.        
276d0 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
276e0 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  j];.        pNew
276f0 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65 72  ->prereq |= pTer
27700 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
27710 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27720 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c  iTerm<pNew->nLSl
27730 6f 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  ot );.        pN
27740 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d  ew->aLTerm[iTerm
27750 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
27760 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d 78 54     if( iTerm>mxT
27770 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20 69  erm ) mxTerm = i
27780 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 74 65  Term;.        te
27790 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31  stcase( iTerm==1
277a0 35 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  5 );.        tes
277b0 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 36  tcase( iTerm==16
277c0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
277d0 69 54 65 72 6d 3c 31 36 20 26 26 20 70 55 73 61  iTerm<16 && pUsa
277e0 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65  ge[i].omit ) pNe
277f0 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  w->u.vtab.omitMa
27800 73 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a  sk |= 1<<iTerm;.
27810 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
27820 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
27830 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20  WO_IN)!=0 ){.   
27840 20 20 20 20 20 20 20 69 66 28 20 70 55 73 61 67         if( pUsag
27850 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a  e[i].omit==0 ){.
27860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
27870 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
27880 20 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74   use an IN const
27890 72 61 69 6e 74 20 69 66 20 74 68 65 20 76 69 72  raint if the vir
278a0 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20  tual table.     
278b0 20 20 20 20 20 20 20 2a 2a 20 73 61 79 73 20 74         ** says t
278c0 68 61 74 20 74 68 65 20 65 71 75 69 76 61 6c 65  hat the equivale
278d0 6e 74 20 45 51 20 63 6f 6e 73 74 72 61 69 6e 74  nt EQ constraint
278e0 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c   cannot be safel
278f0 79 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20 20  y omitted..     
27900 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65 20         ** If we 
27910 64 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  do attempt to us
27920 65 20 73 75 63 68 20 61 20 63 6f 6e 73 74 72 61  e such a constra
27930 69 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d  int, some rows m
27940 69 67 68 74 20 62 65 0a 20 20 20 20 20 20 20 20  ight be.        
27950 20 20 20 20 2a 2a 20 72 65 70 65 61 74 65 64 20      ** repeated 
27960 69 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 20 2a  in the output. *
27970 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  /.            br
27980 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
27990 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  .          /* A 
279a0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
279b0 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  at is constraine
279c0 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75 73  d by an IN claus
279d0 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20 20  e may not.      
279e0 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74      ** consume t
279f0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
27a00 73 65 20 62 65 63 61 75 73 65 20 28 31 29 20 74  se because (1) t
27a10 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 74  he order of IN t
27a20 65 72 6d 73 0a 20 20 20 20 20 20 20 20 20 20 2a  erms.          *
27a30 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  * is not necessa
27a40 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20  rily related to 
27a50 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75 74  the order of out
27a60 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20 20  put terms and.  
27a70 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20 4d          ** (2) M
27a80 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73 20  ultiple outputs 
27a90 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e  from a single IN
27aa0 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20   value will not 
27ab0 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20 20 20  merge.          
27ac0 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f  ** together.  */
27ad0 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 49  .          pIdxI
27ae0 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
27af0 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  umed = 0;.      
27b00 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27b10 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 6f  }.    if( i>=nCo
27b20 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20  nstraint ){.    
27b30 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
27b40 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 20 20 20   mxTerm+1;.     
27b50 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
27b60 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53  LTerm<=pNew->nLS
27b70 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  lot );.      pNe
27b80 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  w->u.vtab.idxNum
27b90 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78   = pIdxInfo->idx
27ba0 4e 75 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  Num;.      pNew-
27bb0 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
27bc0 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65   = pIdxInfo->nee
27bd0 64 54 6f 46 72 65 65 49 64 78 53 74 72 3b 0a 20  dToFreeIdxStr;. 
27be0 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e       pIdxInfo->n
27bf0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
27c00 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 0;.      pNew-
27c10 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d  >u.vtab.idxStr =
27c20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74   pIdxInfo->idxSt
27c30 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  r;.      pNew->u
27c40 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20  .vtab.isOrdered 
27c50 3d 20 28 75 38 29 28 28 70 49 64 78 49 6e 66 6f  = (u8)((pIdxInfo
27c60 2d 3e 6e 4f 72 64 65 72 42 79 21 3d 30 29 0a 20  ->nOrderBy!=0). 
27c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c90 20 20 20 20 26 26 20 70 49 64 78 49 6e 66 6f 2d      && pIdxInfo-
27ca0 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
27cb0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  );.      pNew->r
27cc0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20  Setup = 0;.     
27cd0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
27ce0 6c 69 74 65 33 4c 6f 67 45 73 74 46 72 6f 6d 44  lite3LogEstFromD
27cf0 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e  ouble(pIdxInfo->
27d00 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
27d10 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
27d20 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
27d30 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d  (pIdxInfo->estim
27d40 61 74 65 64 52 6f 77 73 29 3b 0a 20 20 20 20 20  atedRows);.     
27d50 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
27d60 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
27d70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
27d80 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
27d90 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
27da0 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
27db0 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
27dc0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
27dd0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
27de0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
27df0 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65 4c 6f 6f  .  }  ..whereLoo
27e00 70 41 64 64 56 74 61 62 5f 65 78 69 74 3a 0a 20  pAddVtab_exit:. 
27e10 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e   if( pIdxInfo->n
27e20 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
27e30 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  ) sqlite3_free(p
27e40 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29  IdxInfo->idxStr)
27e50 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
27e60 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  e(db, pIdxInfo);
27e70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27e80 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
27e90 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
27ea0 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  LE */../*.** Add
27eb0 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69   WhereLoop entri
27ec0 65 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20  es to handle OR 
27ed0 74 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f 72  terms.  This wor
27ee0 6b 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a  ks for either.**
27ef0 20 62 74 72 65 65 73 20 6f 72 20 76 69 72 74 75   btrees or virtu
27f00 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74  al tables..*/.st
27f10 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
27f20 6f 70 41 64 64 4f 72 28 57 68 65 72 65 4c 6f 6f  opAddOr(WhereLoo
27f30 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
27f40 65 72 2c 20 42 69 74 6d 61 73 6b 20 6d 45 78 74  er, Bitmask mExt
27f50 72 61 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  ra){.  WhereInfo
27f60 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
27f70 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 57  der->pWInfo;.  W
27f80 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
27f90 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
27fa0 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ew;.  WhereTerm 
27fb0 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b  *pTerm, *pWCEnd;
27fc0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
27fd0 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75  TE_OK;.  int iCu
27fe0 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  r;.  WhereClause
27ff0 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72 65   tempWC;.  Where
28000 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75 62  LoopBuilder sSub
28010 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f 72  Build;.  WhereOr
28020 53 65 74 20 73 53 75 6d 2c 20 73 43 75 72 2c 20  Set sSum, sCur, 
28030 73 50 72 65 76 3b 0a 20 20 73 74 72 75 63 74 20  sPrev;.  struct 
28040 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
28050 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20  tem;.  .  pWC = 
28060 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
28070 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74   if( pWInfo->wct
28080 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
28090 41 4e 44 5f 4f 4e 4c 59 20 29 20 72 65 74 75 72  AND_ONLY ) retur
280a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
280b0 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b  WCEnd = pWC->a +
280c0 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70   pWC->nTerm;.  p
280d0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
280e0 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pNew;.  memset(&
280f0 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sSum, 0, sizeof(
28100 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20  sSum));.  pItem 
28110 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
28120 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54  st->a + pNew->iT
28130 61 62 3b 0a 20 20 69 66 28 20 21 48 61 73 52 6f  ab;.  if( !HasRo
28140 77 69 64 28 70 49 74 65 6d 2d 3e 70 54 61 62 29  wid(pItem->pTab)
28150 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
28160 5f 4f 4b 3b 0a 20 20 69 43 75 72 20 3d 20 70 49  _OK;.  iCur = pI
28170 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20  tem->iCursor;.. 
28180 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
28190 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20  a; pTerm<pWCEnd 
281a0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
281b0 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
281c0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
281d0 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d  rator & WO_OR)!=
281e0 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  0.     && (pTerm
281f0 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  ->u.pOrInfo->ind
28200 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d  exable & pNew->m
28210 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20 20  askSelf)!=0 .   
28220 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43   ){.      WhereC
28230 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f  lause * const pO
28240 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e  rWC = &pTerm->u.
28250 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  pOrInfo->wc;.   
28260 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63     WhereTerm * c
28270 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20  onst pOrWCEnd = 
28280 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d  &pOrWC->a[pOrWC-
28290 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57  >nTerm];.      W
282a0 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
282b0 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63  m;.      int onc
282c0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74  e = 1;.      int
282d0 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20   i, j;.    .    
282e0 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70    sSubBuild = *p
282f0 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73  Builder;.      s
28300 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42  SubBuild.pOrderB
28310 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75  y = 0;.      sSu
28320 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20  bBuild.pOrSet = 
28330 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 66 6f  &sCur;..      fo
28340 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d  r(pOrTerm=pOrWC-
28350 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57  >a; pOrTerm<pOrW
28360 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29  CEnd; pOrTerm++)
28370 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
28380 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
28390 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29  r & WO_AND)!=0 )
283a0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62  {.          sSub
283b0 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72  Build.pWC = &pOr
283c0 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
283d0 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  ->wc;.        }e
283e0 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
283f0 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
28400 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  r ){.          t
28410 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70  empWC.pWInfo = p
28420 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20  WC->pWInfo;.    
28430 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75        tempWC.pOu
28440 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  ter = pWC;.     
28450 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d       tempWC.op =
28460 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20   TK_AND;.       
28470 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20     tempWC.nTerm 
28480 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 1;.          t
28490 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72  empWC.a = pOrTer
284a0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  m;.          sSu
284b0 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65  bBuild.pWC = &te
284c0 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65  mpWC;.        }e
284d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
284e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
284f0 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72 2e   }.        sCur.
28500 6e 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  n = 0;.#ifndef S
28510 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
28520 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20  ALTABLE.        
28530 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49  if( IsVirtual(pI
28540 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  tem->pTab) ){.  
28550 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
28560 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
28570 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78  (&sSubBuild, mEx
28580 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  tra);.        }e
28590 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
285a0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72     {.          r
285b0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
285c0 42 74 72 65 65 28 26 73 53 75 62 42 75 69 6c 64  Btree(&sSubBuild
285d0 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20  , mExtra);.     
285e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
285f0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
28600 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30 20  OK || sCur.n==0 
28610 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
28620 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  Cur.n==0 ){.    
28630 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30        sSum.n = 0
28640 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
28650 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
28660 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20   if( once ){.   
28670 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f         whereOrMo
28680 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72 29  ve(&sSum, &sCur)
28690 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65  ;.          once
286a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
286b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
286c0 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 50 72 65  hereOrMove(&sPre
286d0 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20 20 20  v, &sSum);.     
286e0 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b       sSum.n = 0;
286f0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
28700 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69  =0; i<sPrev.n; i
28710 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
28720 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72   for(j=0; j<sCur
28730 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; j++){.      
28740 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 49          whereOrI
28750 6e 73 65 72 74 28 26 73 53 75 6d 2c 20 73 50 72  nsert(&sSum, sPr
28760 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c  ev.a[i].prereq |
28770 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65   sCur.a[j].prere
28780 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  q,.             
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
287a0 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
287b0 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c  sPrev.a[i].rRun,
287c0 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29   sCur.a[j].rRun)
287d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
287e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
287f0 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73  lite3LogEstAdd(s
28800 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20  Prev.a[i].nOut, 
28810 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29  sCur.a[j].nOut))
28820 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
28830 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28840 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
28850 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
28860 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 1;.      pNew
28870 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
28880 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  erm;.      pNew-
28890 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
288a0 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20  _MULTI_OR;.     
288b0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
288c0 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  0;.      pNew->i
288d0 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20  SortIdx = 0;.   
288e0 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d     memset(&pNew-
288f0 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e  >u, 0, sizeof(pN
28900 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20 66  ew->u));.      f
28910 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
28920 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e  TE_OK && i<sSum.
28930 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
28940 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 75 6c 74   /* TUNING: Mult
28950 69 70 6c 65 20 62 79 20 33 2e 35 20 66 6f 72 20  iple by 3.5 for 
28960 74 68 65 20 73 65 63 6f 6e 64 61 72 79 20 74 61  the secondary ta
28970 62 6c 65 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20  ble lookup */.  
28980 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
28990 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75   = sSum.a[i].rRu
289a0 6e 20 2b 20 31 38 3b 0a 20 20 20 20 20 20 20 20  n + 18;.        
289b0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75  pNew->nOut = sSu
289c0 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20  m.a[i].nOut;.   
289d0 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
289e0 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72  q = sSum.a[i].pr
289f0 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63  ereq;.        rc
28a00 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
28a10 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
28a20 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
28a30 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
28a40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
28a50 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
28a60 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74 61  jects for all ta
28a70 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20  bles .*/.static 
28a80 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
28a90 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  All(WhereLoopBui
28aa0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b  lder *pBuilder){
28ab0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
28ac0 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
28ad0 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61  >pWInfo;.  Bitma
28ae0 73 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20  sk mExtra = 0;. 
28af0 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20   Bitmask mPrior 
28b00 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  = 0;.  int iTab;
28b10 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
28b20 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
28b30 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  TabList;.  struc
28b40 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
28b50 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
28b60 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   *db = pWInfo->p
28b70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
28b80 20 6e 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e   nTabList = pWIn
28b90 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e  fo->nLevel;.  in
28ba0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
28bb0 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e  ;.  u8 priorJoin
28bc0 54 79 70 65 20 3d 20 30 3b 0a 20 20 57 68 65 72  Type = 0;.  Wher
28bd0 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20  eLoop *pNew;..  
28be0 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65  /* Loop over the
28bf0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a   tables in the j
28c00 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74  oin, from left t
28c10 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65  o right */.  pNe
28c20 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
28c30 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49  ew;.  whereLoopI
28c40 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72  nit(pNew);.  for
28c50 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70  (iTab=0, pItem=p
28c60 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 54 61 62  TabList->a; iTab
28c70 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54 61 62 2b  <nTabList; iTab+
28c80 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
28c90 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54   pNew->iTab = iT
28ca0 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61  ab;.    pNew->ma
28cb0 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b  skSelf = getMask
28cc0 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
28cd0 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  et, pItem->iCurs
28ce0 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  or);.    if( ((p
28cf0 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c 70  Item->jointype|p
28d00 72 69 6f 72 4a 6f 69 6e 54 79 70 65 29 20 26 20  riorJoinType) & 
28d10 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
28d20 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  S))!=0 ){.      
28d30 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b  mExtra = mPrior;
28d40 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72  .    }.    prior
28d50 4a 6f 69 6e 54 79 70 65 20 3d 20 70 49 74 65 6d  JoinType = pItem
28d60 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  ->jointype;.    
28d70 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49  if( IsVirtual(pI
28d80 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  tem->pTab) ){.  
28d90 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
28da0 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70 42 75  opAddVirtual(pBu
28db0 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a  ilder, mExtra);.
28dc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28dd0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
28de0 64 64 42 74 72 65 65 28 70 42 75 69 6c 64 65 72  ddBtree(pBuilder
28df0 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d  , mExtra);.    }
28e00 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
28e10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28e20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
28e30 64 4f 72 28 70 42 75 69 6c 64 65 72 2c 20 6d 45  dOr(pBuilder, mE
28e40 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xtra);.    }.   
28e50 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d   mPrior |= pNew-
28e60 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69  >maskSelf;.    i
28e70 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c  f( rc || db->mal
28e80 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
28e90 6b 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f  k;.  }.  whereLo
28ea0 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65 77  opClear(db, pNew
28eb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
28ec0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65  }../*.** Examine
28ed0 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77 69   a WherePath (wi
28ee0 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20  th the addition 
28ef0 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68 65  of the extra Whe
28f00 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35 74  reLoop of the 5t
28f10 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 29  h.** parameters)
28f20 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f 75   to see if it ou
28f30 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74 68  tputs rows in th
28f40 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44 45  e requested ORDE
28f50 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55  R BY.** (or GROU
28f60 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72 65  P BY) without re
28f70 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72 61  quiring a separa
28f80 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69 6f  te sort operatio
28f90 6e 2e 20 20 52 65 74 75 72 6e 3a 0a 2a 2a 20 0a  n.  Return:.** .
28fa0 2a 2a 20 20 20 20 30 3a 20 20 4f 52 44 45 52 20  **    0:  ORDER 
28fb0 42 59 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66  BY is not satisf
28fc0 69 65 64 2e 20 20 53 6f 72 74 69 6e 67 20 72 65  ied.  Sorting re
28fd0 71 75 69 72 65 64 0a 2a 2a 20 20 20 20 31 3a 20  quired.**    1: 
28fe0 20 4f 52 44 45 52 20 42 59 20 69 73 20 73 61 74   ORDER BY is sat
28ff0 69 73 66 69 65 64 2e 20 20 20 20 20 20 4f 6d 69  isfied.      Omi
29000 74 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 20 20 2d  t sorting.**   -
29010 31 3a 20 20 55 6e 6b 6e 6f 77 6e 20 61 74 20 74  1:  Unknown at t
29020 68 69 73 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 4e  his time.**.** N
29030 6f 74 65 20 74 68 61 74 20 70 72 6f 63 65 73 73  ote that process
29040 69 6e 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52  ing for WHERE_GR
29050 4f 55 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f  OUPBY and WHERE_
29060 44 49 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f  DISTINCTBY is no
29070 74 20 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20  t as.** strict. 
29080 20 57 69 74 68 20 47 52 4f 55 50 20 42 59 20 61   With GROUP BY a
29090 6e 64 20 44 49 53 54 49 4e 43 54 20 74 68 65 20  nd DISTINCT the 
290a0 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74  only requirement
290b0 20 69 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69   is that.** equi
290c0 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65  valent rows appe
290d0 61 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ar immediately a
290e0 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61  djacent to one a
290f0 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42  nother.  GROUP B
29100 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 54  Y.** and DISTINT
29110 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20   do not require 
29120 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20 69  rows to appear i
29130 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  n any particular
29140 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a   order as long.*
29150 2a 20 61 73 20 65 71 75 69 76 65 6c 65 6e 74 20  * as equivelent 
29160 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65 64  rows are grouped
29170 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75 73   together.  Thus
29180 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61 6e   for GROUP BY an
29190 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68  d DISTINCT.** th
291a0 65 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73  e pOrderBy terms
291b0 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20   can be matched 
291c0 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20 57  in any order.  W
291d0 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74 68  ith ORDER BY, th
291e0 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 74  e .** pOrderBy t
291f0 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61 74  erms must be mat
29200 63 68 65 64 20 69 6e 20 73 74 72 69 63 74 20 6c  ched in strict l
29210 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64  eft-to-right ord
29220 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
29230 74 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  t wherePathSatis
29240 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57  fiesOrderBy(.  W
29250 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
29260 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52  ,    /* The WHER
29270 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
29280 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
29290 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  ,   /* ORDER BY 
292a0 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44  or GROUP BY or D
292b0 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74  ISTINCT clause t
292c0 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65  o check */.  Whe
292d0 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20  rePath *pPath,  
292e0 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50     /* The WhereP
292f0 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ath to check */.
29300 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
29310 2c 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74  ,       /* Might
29320 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 5f 47   contain WHERE_G
29330 52 4f 55 50 42 59 20 6f 72 20 57 48 45 52 45 5f  ROUPBY or WHERE_
29340 44 49 53 54 49 4e 43 54 42 59 20 2a 2f 0a 20 20  DISTINCTBY */.  
29350 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20  u16 nLoop,      
29360 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
29370 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50  of entries in pP
29380 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a  ath->aLoop[] */.
29390 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61    WhereLoop *pLa
293a0 73 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74  st,     /* Add t
293b0 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f  his WhereLoop to
293c0 20 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74   the end of pPat
293d0 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20  h->aLoop[] */.  
293e0 42 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73  Bitmask *pRevMas
293f0 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61  k     /* OUT: Ma
29400 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73  sk of WhereLoops
29410 20 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72   to run in rever
29420 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20  se order */.){. 
29430 20 75 38 20 72 65 76 53 65 74 3b 20 20 20 20 20   u8 revSet;     
29440 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
29450 66 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a  f rev is known *
29460 2f 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20 20  /.  u8 rev;     
29470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
29480 70 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65  posite sort orde
29490 72 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78  r */.  u8 revIdx
294a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
294b0 49 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72  Index sort order
294c0 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72   */.  u8 isOrder
294d0 44 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41  Distinct;   /* A
294e0 6c 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f  ll prior WhereLo
294f0 6f 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69  ops are order-di
29500 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64  stinct */.  u8 d
29510 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20  istinctColumns; 
29520 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
29530 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45   loop has UNIQUE
29540 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e   NOT NULL column
29550 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63  s */.  u8 isMatc
29560 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h;           /* 
29570 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20  iColumn matches 
29580 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  a term of the OR
29590 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
295a0 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20  .  u16 nKeyCol; 
295b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
295c0 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e  er of key column
295d0 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20  s in pIndex */. 
295e0 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20   u16 nColumn;   
295f0 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
29600 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64 65 72 65  number of ordere
29610 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  d columns in the
29620 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20   index */.  u16 
29630 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
29640 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d    /* Number term
29650 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
29660 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
29670 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t iLoop;        
29680 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
29690 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61  WhereLoop in pPa
296a0 74 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  th being process
296b0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  ed */.  int i, j
296c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
296d0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
296e0 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20  /.  int iCur;   
296f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
29700 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63  sor number for c
29710 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70  urrent WhereLoop
29720 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
29730 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  n;          /* A
29740 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77   column number w
29750 69 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75 72  ithin table iCur
29760 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
29770 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43  *pLoop = 0; /* C
29780 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70  urrent WhereLoop
29790 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
297a0 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  . */.  WhereTerm
297b0 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20   *pTerm;     /* 
297c0 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
297d0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
297e0 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42  e */.  Expr *pOB
297f0 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  Expr;        /* 
29800 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  An expression fr
29810 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  om the ORDER BY 
29820 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c  clause */.  Coll
29830 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
29840 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e    /* COLLATE fun
29850 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52  ction from an OR
29860 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
29870 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  rm */.  Index *p
29880 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f 2a  Index;        /*
29890 20 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f 63   The index assoc
298a0 69 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f 70  iated with pLoop
298b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
298c0 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
298d0 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
298e0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
298f0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 53  */.  Bitmask obS
29900 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61  at = 0;    /* Ma
29910 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74  sk of ORDER BY t
29920 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 73  erms satisfied s
29930 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61  o far */.  Bitma
29940 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20  sk obDone;      
29950 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
29960 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
29970 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64 65  /.  Bitmask orde
29980 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20  rDistinctMask;  
29990 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77  /* Mask of all w
299a0 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70  ell-ordered loop
299b0 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72  s */.  Bitmask r
299c0 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20  eady;           
299d0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e     /* Mask of in
299e0 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20  ner loops */..  
299f0 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74  /*.  ** We say t
29a00 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  he WhereLoop is 
29a10 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74 20  "one-row" if it 
29a20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72  generates no mor
29a30 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20  e than one.  ** 
29a40 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20  row of output.  
29a50 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f  A WhereLoop is o
29a60 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66  ne-row if all of
29a70 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
29a80 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28  re true:.  **  (
29a90 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c  a) All index col
29aa0 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68 20  umns match with 
29ab0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e  WHERE_COLUMN_EQ.
29ac0 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20 69  .  **  (b) The i
29ad0 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a 20  ndex is unique. 
29ae0 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f   ** Any WhereLoo
29af0 70 20 77 69 74 68 20 61 6e 20 57 48 45 52 45 5f  p with an WHERE_
29b00 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72  COLUMN_EQ constr
29b10 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69  aint on the rowi
29b20 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20  d is one-row..  
29b30 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77  ** Every one-row
29b40 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20   WhereLoop will 
29b50 68 61 76 65 20 74 68 65 20 57 48 45 52 45 5f 4f  have the WHERE_O
29b60 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20 69 6e  NEROW bit set in
29b70 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20   wsFlags..  **. 
29b80 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57   ** We say the W
29b90 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64  hereLoop is "ord
29ba0 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66 20  er-distinct" if 
29bb0 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d  the set of colum
29bc0 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61  ns from.  ** tha
29bd0 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  t WhereLoop that
29be0 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44 45   are in the ORDE
29bf0 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
29c00 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
29c10 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  ery.  ** row of 
29c20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20  the WhereLoop.  
29c30 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68  Every one-row Wh
29c40 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d  ereLoop is autom
29c50 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72  atically.  ** or
29c60 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20 20  der-distinct.   
29c70 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  A WhereLoop that
29c80 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20   has no columns 
29c90 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
29ca0 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e  clause.  ** is n
29cb0 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  ot order-distinc
29cc0 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64  t. To be order-d
29cd0 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20 71  istinct is not q
29ce0 75 69 74 65 20 74 68 65 20 73 61 6d 65 20 61 73  uite the same as
29cf0 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51   being.  ** UNIQ
29d00 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51 55  UE since a UNIQU
29d10 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65  E column or inde
29d20 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  x can have multi
29d30 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a 20  ple rows that . 
29d40 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64   ** are NULL and
29d50 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65   NULL values are
29d60 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 20   equivalent for 
29d70 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 6f  the purpose of o
29d80 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20  rder-distinct.. 
29d90 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72 2d   ** To be order-
29da0 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63 6f  distinct, the co
29db0 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55 4e  lumns must be UN
29dc0 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c  IQUE and NOT NUL
29dd0 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  L..  **.  ** The
29de0 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61 62   rowid for a tab
29df0 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e 49  le is always UNI
29e00 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c  QUE and NOT NULL
29e10 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68 65   so whenever the
29e20 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70 65  .  ** rowid appe
29e30 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  ars in the ORDER
29e40 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 20   BY clause, the 
29e50 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68  corresponding Wh
29e60 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20  ereLoop is.  ** 
29e70 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72  automatically or
29e80 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20  der-distinct..  
29e90 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  */..  assert( pO
29ea0 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 0a 20 20  rderBy!=0 );..  
29eb0 2f 2a 20 53 6f 72 74 61 62 69 6c 69 74 79 20 6f  /* Sortability o
29ec0 66 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  f virtual tables
29ed0 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
29ee0 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  y the xBestIndex
29ef0 20 6d 65 74 68 6f 64 0a 20 20 2a 2a 20 6f 66 20   method.  ** of 
29f00 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
29f10 65 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20 69 66  e itself */.  if
29f20 28 20 70 4c 61 73 74 2d 3e 77 73 46 6c 61 67 73  ( pLast->wsFlags
29f30 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
29f40 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 74 65 73  TABLE ){.    tes
29f50 74 63 61 73 65 28 20 6e 4c 6f 6f 70 3e 30 20 29  tcase( nLoop>0 )
29f60 3b 20 20 2f 2a 20 54 72 75 65 20 77 68 65 6e 20  ;  /* True when 
29f70 6f 75 74 65 72 20 6c 6f 6f 70 73 20 61 72 65 20  outer loops are 
29f80 6f 6e 65 2d 72 6f 77 20 61 6e 64 20 6d 61 74 63  one-row and matc
29f90 68 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h .             
29fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
29fb0 6e 6f 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  no ORDER BY term
29fc0 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  s */.    return 
29fd0 70 4c 61 73 74 2d 3e 75 2e 76 74 61 62 2e 69 73  pLast->u.vtab.is
29fe0 4f 72 64 65 72 65 64 3b 0a 20 20 7d 0a 20 20 69  Ordered;.  }.  i
29ff0 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69  f( nLoop && Opti
2a000 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
2a010 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65  (db, SQLITE_Orde
2a020 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72 65  rByIdxJoin) ) re
2a030 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65  turn 0;..  nOrde
2a040 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  rBy = pOrderBy->
2a050 6e 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61 73  nExpr;.  testcas
2a060 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53  e( nOrderBy==BMS
2a070 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64  -1 );.  if( nOrd
2a080 65 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65 74  erBy>BMS-1 ) ret
2a090 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f  urn 0;  /* Canno
2a0a0 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c  t optimize overl
2a0b0 79 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42 59  y large ORDER BY
2a0c0 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44 69  s */.  isOrderDi
2a0d0 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62  stinct = 1;.  ob
2a0e0 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e  Done = MASKBIT(n
2a0f0 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72  OrderBy)-1;.  or
2a100 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20  derDistinctMask 
2a110 3d 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20 30  = 0;.  ready = 0
2a120 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b  ;.  for(iLoop=0;
2a130 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2a140 20 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65   && obSat<obDone
2a150 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70   && iLoop<=nLoop
2a160 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20  ; iLoop++){.    
2a170 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65  if( iLoop>0 ) re
2a180 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61  ady |= pLoop->ma
2a190 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4c 6f 6f  skSelf;.    pLoo
2a1a0 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20  p = iLoop<nLoop 
2a1b0 3f 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  ? pPath->aLoop[i
2a1c0 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73 74 3b 0a 20  Loop] : pLast;. 
2a1d0 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
2a1e0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2a1f0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
2a200 3d 3d 30 20 29 3b 0a 20 20 20 20 69 43 75 72 20  ==0 );.    iCur 
2a210 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
2a220 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61  st->a[pLoop->iTa
2a230 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20  b].iCursor;..   
2a240 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79   /* Mark off any
2a250 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 58   ORDER BY term X
2a260 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d   that is a colum
2a270 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  n in the table o
2a280 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  f.    ** the cur
2a290 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68  rent loop for wh
2a2a0 69 63 68 20 74 68 65 72 65 20 69 73 20 74 65 72  ich there is ter
2a2b0 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20  m in the WHERE. 
2a2c0 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
2a2d0 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20 4e 55  the form X IS NU
2a2e0 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74 20 72  LL or X=? that r
2a2f0 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75  eference only ou
2a300 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73  ter.    ** loops
2a310 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
2a320 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
2a330 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
2a340 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
2a350 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
2a360 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d  .      pOBExpr =
2a370 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
2a380 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79  Collate(pOrderBy
2a390 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
2a3a0 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
2a3b0 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
2a3c0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2a3d0 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69    if( pOBExpr->i
2a3e0 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f  Table!=iCur ) co
2a3f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 54  ntinue;.      pT
2a400 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26  erm = findTerm(&
2a410 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43 75  pWInfo->sWC, iCu
2a420 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c  r, pOBExpr->iCol
2a430 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  umn,.           
2a440 20 20 20 20 20 20 20 20 20 20 20 20 7e 72 65 61              ~rea
2a450 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e  dy, WO_EQ|WO_ISN
2a460 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ULL, 0);.      i
2a470 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f  f( pTerm==0 ) co
2a480 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
2a490 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
2a4a0 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 26 26  tor&WO_EQ)!=0 &&
2a4b0 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
2a4c0 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
2a4d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20  const char *z1, 
2a4e0 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  *z2;.        pCo
2a4f0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
2a500 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
2a510 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
2a520 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
2a530 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
2a540 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
2a550 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2a560 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a     z1 = pColl->z
2a570 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 43  Name;.        pC
2a580 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2a590 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d  rCollSeq(pWInfo-
2a5a0 3e 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e  >pParse, pTerm->
2a5b0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
2a5c0 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
2a5d0 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
2a5e0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d  ll;.        z2 =
2a5f0 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20   pColl->zName;. 
2a600 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2a610 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32  e3StrICmp(z1, z2
2a620 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
2a630 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f  .      }.      o
2a640 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
2a650 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  i);.    }..    i
2a660 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
2a670 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
2a680 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  W)==0 ){.      i
2a690 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
2a6a0 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29 7b  s & WHERE_IPK ){
2a6b0 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20  .        pIndex 
2a6c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65  = 0;.        nKe
2a6d0 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  yCol = 0;.      
2a6e0 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20    nColumn = 1;. 
2a6f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
2a700 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e  pIndex = pLoop->
2a710 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3d  u.btree.pIndex)=
2a720 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55  =0 || pIndex->bU
2a730 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20  nordered ){.    
2a740 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2a750 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a760 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e     nKeyCol = pIn
2a770 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  dex->nKeyCol;.  
2a780 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20        nColumn = 
2a790 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pIndex->nColumn;
2a7a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2a7b0 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f   nColumn==nKeyCo
2a7c0 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77 69 64  l+1 || !HasRowid
2a7d0 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29  (pIndex->pTable)
2a7e0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
2a7f0 72 74 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  rt( pIndex->aiCo
2a800 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d  lumn[nColumn-1]=
2a810 3d 28 2d 31 29 20 7c 7c 20 21 48 61 73 52 6f 77  =(-1) || !HasRow
2a820 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  id(pIndex->pTabl
2a830 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f  e));.        isO
2a840 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 70  rderDistinct = p
2a850 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
2a860 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 20 20 20 20 7d  OE_None;.      }
2a870 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20  ..      /* Loop 
2a880 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75  through all colu
2a890 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
2a8a0 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68 20 74   and deal with t
2a8b0 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a  he ones.      **
2a8c0 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63 6f   that are not co
2a8d0 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20  nstrained by == 
2a8e0 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a  or IN..      */.
2a8f0 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 53        rev = revS
2a900 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 69  et = 0;.      di
2a910 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20  stinctColumns = 
2a920 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  0;.      for(j=0
2a930 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  ; j<nColumn; j++
2a940 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62 4f  ){.        u8 bO
2a950 6e 63 65 3b 20 20 20 2f 2a 20 54 72 75 65 20 74  nce;   /* True t
2a960 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45 52 20  o run the ORDER 
2a970 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a  BY search loop *
2a980 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 6b  /..        /* Sk
2a990 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49  ip over == and I
2a9a0 53 20 4e 55 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a  S NULL terms */.
2a9b0 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c          if( j<pL
2a9c0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
2a9d0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 69  .         && ((i
2a9e0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
2a9f0 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20  [j]->eOperator) 
2aa00 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55  & (WO_EQ|WO_ISNU
2aa10 4c 4c 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  LL))!=0.        
2aa20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2aa30 20 69 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29   i & WO_ISNULL )
2aa40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
2aa50 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
2aa60 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
2aa70 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
2aa80 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
2aa90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2aaa0 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20    continue;  .  
2aab0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2aac0 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75   /* Get the colu
2aad0 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  mn number in the
2aae0 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29   table (iColumn)
2aaf0 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a   and sort order.
2ab00 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49          ** (revI
2ab10 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68  dx) for the j-th
2ab20 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
2ab30 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ndex..        */
2ab40 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e  .        if( pIn
2ab50 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20  dex ){.         
2ab60 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65   iColumn = pInde
2ab70 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
2ab80 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78            revIdx
2ab90 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74   = pIndex->aSort
2aba0 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20  Order[j];.      
2abb0 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d      if( iColumn=
2abc0 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d  =pIndex->pTable-
2abd0 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e  >iPKey ) iColumn
2abe0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
2abf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2ac00 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
2ac10 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d          revIdx =
2ac20 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
2ac30 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63         /* An unc
2ac40 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d  onstrained colum
2ac50 6e 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  n that might be 
2ac60 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20  NULL means that 
2ac70 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
2ac80 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74  WhereLoop is not
2ac90 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20   well-ordered.  
2aca0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2acb0 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74   if( isOrderDist
2acc0 69 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26 26  inct.         &&
2acd0 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20   iColumn>=0.    
2ace0 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70       && j>=pLoop
2acf0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20  ->u.btree.nEq.  
2ad00 20 20 20 20 20 20 20 26 26 20 70 49 6e 64 65 78         && pIndex
2ad10 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  ->pTable->aCol[i
2ad20 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d  Column].notNull=
2ad30 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
2ad40 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
2ad50 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
2ad60 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2ad70 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45  /* Find the ORDE
2ad80 52 20 42 59 20 74 65 72 6d 20 74 68 61 74 20 63  R BY term that c
2ad90 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
2ada0 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20  e j-th column.  
2adb0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
2adc0 69 6e 64 65 78 20 61 6e 64 20 61 6e 64 20 6d 61  index and and ma
2add0 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42 59  rk that ORDER BY
2ade0 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20   term off .     
2adf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f     */.        bO
2ae00 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nce = 1;.       
2ae10 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20   isMatch = 0;.  
2ae20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62        for(i=0; b
2ae30 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72  Once && i<nOrder
2ae40 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
2ae50 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
2ae60 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
2ae70 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2ae80 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74   pOBExpr = sqlit
2ae90 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
2aea0 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  e(pOrderBy->a[i]
2aeb0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
2aec0 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
2aed0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2aee0 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20  GROUPBY );.     
2aef0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
2af00 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2af10 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a  E_DISTINCTBY );.
2af20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77            if( (w
2af30 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45  ctrlFlags & (WHE
2af40 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45  RE_GROUPBY|WHERE
2af50 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30  _DISTINCTBY))==0
2af60 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20   ) bOnce = 0;.  
2af70 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45          if( pOBE
2af80 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
2af90 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  MN ) continue;. 
2afa0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
2afb0 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43  Expr->iTable!=iC
2afc0 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
2afd0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
2afe0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  Expr->iColumn!=i
2aff0 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
2b000 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
2b010 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20   iColumn>=0 ){. 
2b020 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
2b030 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2b040 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50  llSeq(pWInfo->pP
2b050 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  arse, pOrderBy->
2b060 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
2b070 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43           if( !pC
2b080 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
2b090 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
2b0a0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2b0b0 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
2b0c0 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78  l->zName, pIndex
2b0d0 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20  ->azColl[j])!=0 
2b0e0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2b0f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b100 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20    isMatch = 1;. 
2b110 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2b120 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b130 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b    if( isMatch ){
2b140 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2b150 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
2b160 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2b170 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  ( distinctColumn
2b180 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  s==0 );.        
2b190 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75      distinctColu
2b1a0 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mns = 1;.       
2b1b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f     }.          o
2b1c0 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
2b1d0 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i);.          if
2b1e0 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
2b1f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
2b200 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20  OUPBY)==0 ){.   
2b210 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
2b220 20 73 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f   sure the sort o
2b230 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62  rder is compatib
2b240 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  le in an ORDER B
2b250 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20  Y clause..      
2b260 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72        ** Sort or
2b270 64 65 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e  der is irrelevan
2b280 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59  t for a GROUP BY
2b290 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20   clause. */.    
2b2a0 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76 53          if( revS
2b2b0 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  et ){.          
2b2c0 20 20 20 20 69 66 28 20 28 72 65 76 20 5e 20 72      if( (rev ^ r
2b2d0 65 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79  evIdx)!=pOrderBy
2b2e0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
2b2f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
2b300 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2b310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2b320 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72  v = revIdx ^ pOr
2b330 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
2b340 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20  Order;.         
2b350 20 20 20 20 20 69 66 28 20 72 65 76 20 29 20 2a       if( rev ) *
2b360 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b  pRevMask |= MASK
2b370 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  BIT(iLoop);.    
2b380 20 20 20 20 20 20 20 20 20 20 72 65 76 53 65 74            revSet
2b390 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2b3a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2b3b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2b3c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d           /* No m
2b3d0 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  atch found */.  
2b3e0 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30          if( j==0
2b3f0 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b   || j<nKeyCol ){
2b400 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
2b410 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69  tcase( isOrderDi
2b420 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20  stinct!=0 );.   
2b430 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
2b440 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
2b450 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b460 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2b470 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20     }.      } /* 
2b480 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c  end Loop over al
2b490 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  l index columns 
2b4a0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69 73  */.      if( dis
2b4b0 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a  tinctColumns ){.
2b4c0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2b4d0 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
2b4e0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
2b4f0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2b500 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
2b510 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74   } /* end-if not
2b520 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20   one-row */..   
2b530 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79   /* Mark off any
2b540 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59 20   other ORDER BY 
2b550 74 65 72 6d 73 20 74 68 61 74 20 72 65 66 65 72  terms that refer
2b560 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20  ence pLoop */.  
2b570 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73    if( isOrderDis
2b580 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f  tinct ){.      o
2b590 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
2b5a0 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   |= pLoop->maskS
2b5b0 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  elf;.      for(i
2b5c0 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
2b5d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  i++){.        Ex
2b5e0 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 69  pr *p;.        i
2b5f0 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
2b600 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
2b610 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f  ;.        p = pO
2b620 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2b630 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
2b640 28 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28  (exprTableUsage(
2b650 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
2b660 74 2c 20 70 29 26 7e 6f 72 64 65 72 44 69 73 74  t, p)&~orderDist
2b670 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a  inctMask)==0 ){.
2b680 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20            obSat 
2b690 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20  |= MASKBIT(i);. 
2b6a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2b6b0 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e  .    }.  } /* En
2b6c0 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20  d the loop over 
2b6d0 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66  all WhereLoops f
2b6e0 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64  rom outer-most d
2b6f0 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73  own to inner-mos
2b700 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74  t */.  if( obSat
2b710 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72  ==obDone ) retur
2b720 6e 20 31 3b 0a 20 20 69 66 28 20 21 69 73 4f 72  n 1;.  if( !isOr
2b730 64 65 72 44 69 73 74 69 6e 63 74 20 29 20 72 65  derDistinct ) re
2b740 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
2b750 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57   -1;.}..#ifdef W
2b760 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
2b770 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69  D./* For debuggi
2b780 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a  ng use only: */.
2b790 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
2b7a0 72 20 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65  r *wherePathName
2b7b0 28 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74  (WherePath *pPat
2b7c0 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68  h, int nLoop, Wh
2b7d0 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b  ereLoop *pLast){
2b7e0 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
2b7f0 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20  Name[65];.  int 
2b800 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
2b810 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61  nLoop; i++){ zNa
2b820 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61  me[i] = pPath->a
2b830 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a  Loop[i]->cId; }.
2b840 20 20 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e    if( pLast ) zN
2b850 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74  ame[i++] = pLast
2b860 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69  ->cId;.  zName[i
2b870 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
2b880 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  zName;.}.#endif.
2b890 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
2b8a0 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c  e list of WhereL
2b8b0 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70  oop objects at p
2b8c0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74  WInfo->pLoops, t
2b8d0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
2b8e0 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20  ttempts to find 
2b8f0 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
2b900 70 61 74 68 20 74 68 61 74 20 76 69 73 69 74 73  path that visits
2b910 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a   each WhereLoop.
2b920 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70  ** once.  This p
2b930 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64  ath is then load
2b940 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e  ed into the pWIn
2b950 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66  fo->a[].pWLoop f
2b960 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73  ields..**.** Ass
2b970 75 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f 74  ume that the tot
2b980 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  al number of out
2b990 70 75 74 20 72 6f 77 73 20 74 68 61 74 20 77 69  put rows that wi
2b9a0 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f  ll need to be so
2b9b0 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  rted.** will be 
2b9c0 6e 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20  nRowEst (in the 
2b9d0 31 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e  10*log2 represen
2b9e0 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67  tation).  Or, ig
2b9f0 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20  nore sorting.** 
2ba00 63 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74  costs if nRowEst
2ba10 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ==0..**.** Retur
2ba20 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
2ba30 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45  uccess or SQLITE
2ba40 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f  _NOMEM of a memo
2ba50 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ry allocation.**
2ba60 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
2ba70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
2ba80 72 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65  rePathSolver(Whe
2ba90 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
2baa0 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 29 7b  LogEst nRowEst){
2bab0 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b  .  int mxChoice;
2bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bad0 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
2bae0 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70  f simultaneous p
2baf0 61 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a  aths tracked */.
2bb00 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20    int nLoop;    
2bb10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2bb20 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
2bb30 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  n the join */.  
2bb40 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
2bb50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
2bb60 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
2bb70 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
2bb80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2bb90 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
2bba0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
2bbb0 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  iLoop;          
2bbc0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2bbd0 75 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20 74  unter over the t
2bbe0 65 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e  erms of the join
2bbf0 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a   */.  int ii, jj
2bc00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2bc10 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
2bc20 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20   */.  int mxI = 
2bc30 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2bc40 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74  /* Index of next
2bc50 20 65 6e 74 72 79 20 74 6f 20 72 65 70 6c 61 63   entry to replac
2bc60 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 43  e */.  LogEst rC
2bc70 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ost;            
2bc80 20 2f 2a 20 43 6f 73 74 20 6f 66 20 61 20 70 61   /* Cost of a pa
2bc90 74 68 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e  th */.  LogEst n
2bca0 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
2bcb0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
2bcc0 75 74 70 75 74 73 20 2a 2f 0a 20 20 4c 6f 67 45  utputs */.  LogE
2bcd0 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20  st mxCost = 0;  
2bce0 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
2bcf0 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f   cost of a set o
2bd00 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67  f paths */.  Log
2bd10 45 73 74 20 6d 78 4f 75 74 20 3d 20 30 3b 20 20  Est mxOut = 0;  
2bd20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
2bd30 6d 20 6e 4f 75 74 20 76 61 6c 75 65 20 6f 6e 20  m nOut value on 
2bd40 74 68 65 20 73 65 74 20 6f 66 20 70 61 74 68 73  the set of paths
2bd50 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 6f   */.  LogEst rSo
2bd60 72 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20  rtCost;         
2bd70 2f 2a 20 43 6f 73 74 20 74 6f 20 64 6f 20 61 20  /* Cost to do a 
2bd80 73 6f 72 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  sort */.  int nT
2bd90 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20  o, nFrom;       
2bda0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2bdb0 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69   valid entries i
2bdc0 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f  n aTo[] and aFro
2bdd0 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  m[] */.  WherePa
2bde0 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20  th *aFrom;      
2bdf0 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20     /* All nFrom 
2be00 70 61 74 68 73 20 61 74 20 74 68 65 20 70 72 65  paths at the pre
2be10 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20  vious level */. 
2be20 20 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b   WherePath *aTo;
2be30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2be40 65 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73  e nTo best paths
2be50 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
2be60 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65  level */.  Where
2be70 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20  Path *pFrom;    
2be80 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65       /* An eleme
2be90 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68  nt of aFrom[] th
2bea0 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  at we are workin
2beb0 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50  g on */.  WhereP
2bec0 61 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20  ath *pTo;       
2bed0 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e      /* An elemen
2bee0 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20  t of aTo[] that 
2bef0 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
2bf00 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  n */.  WhereLoop
2bf10 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20   *pWLoop;       
2bf20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57   /* One of the W
2bf30 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
2bf40 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
2bf50 2a 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20  **pX;           
2bf60 2f 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79 20  /* Used to divy 
2bf70 75 70 20 74 68 65 20 70 53 70 61 63 65 20 6d 65  up the pSpace me
2bf80 6d 6f 72 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mory */.  char *
2bf90 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
2bfa0 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
2bfb0 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
2bfc0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  this routine */.
2bfd0 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e  .  pParse = pWIn
2bfe0 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  fo->pParse;.  db
2bff0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
2c000 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d   nLoop = pWInfo-
2c010 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55  >nLevel;.  /* TU
2c020 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65  NING: For simple
2c030 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74   queries, only t
2c040 68 65 20 62 65 73 74 20 70 61 74 68 20 69 73 20  he best path is 
2c050 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f  tracked..  ** Fo
2c060 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74  r 2-way joins, t
2c070 68 65 20 35 20 62 65 73 74 20 70 61 74 68 73 20  he 5 best paths 
2c080 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20  are followed..  
2c090 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20  ** For joins of 
2c0a0 33 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73  3 or more tables
2c0b0 2c 20 74 72 61 63 6b 20 74 68 65 20 31 30 20 62  , track the 10 b
2c0c0 65 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d  est paths */.  m
2c0d0 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70  xChoice = (nLoop
2c0e0 3d 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f  ==1) ? 1 : (nLoo
2c0f0 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a  p==2 ? 5 : 10);.
2c100 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c    assert( nLoop<
2c110 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  =pWInfo->pTabLis
2c120 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45  t->nSrc );.  WHE
2c130 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 20 28  RETRACE(0x002, (
2c140 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76  "---- begin solv
2c150 65 72 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 41  er\n"));..  /* A
2c160 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
2c170 69 61 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72  ialize space for
2c180 20 61 54 6f 20 61 6e 64 20 61 46 72 6f 6d 20 2a   aTo and aFrom *
2c190 2f 0a 20 20 69 69 20 3d 20 28 73 69 7a 65 6f 66  /.  ii = (sizeof
2c1a0 28 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65  (WherePath)+size
2c1b0 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e  of(WhereLoop*)*n
2c1c0 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32  Loop)*mxChoice*2
2c1d0 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c  ;.  pSpace = sql
2c1e0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
2c1f0 64 62 2c 20 69 69 29 3b 0a 20 20 69 66 28 20 70  db, ii);.  if( p
2c200 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  Space==0 ) retur
2c210 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2c220 20 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61    aTo = (WherePa
2c230 74 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46  th*)pSpace;.  aF
2c240 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69  rom = aTo+mxChoi
2c250 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72  ce;.  memset(aFr
2c260 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46  om, 0, sizeof(aF
2c270 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d  rom[0]));.  pX =
2c280 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61   (WhereLoop**)(a
2c290 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a  From+mxChoice);.
2c2a0 20 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63    for(ii=mxChoic
2c2b0 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20  e*2, pFrom=aTo; 
2c2c0 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f  ii>0; ii--, pFro
2c2d0 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70  m++, pX += nLoop
2c2e0 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c  ){.    pFrom->aL
2c2f0 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20  oop = pX;.  }.. 
2c300 20 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65 61   /* Seed the sea
2c310 72 63 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c  rch with a singl
2c320 65 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74  e WherePath cont
2c330 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72  aining zero Wher
2c340 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  eLoops..  **.  *
2c350 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74  * TUNING: Do not
2c360 20 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   let the number 
2c370 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f  of iterations go
2c380 20 61 62 6f 76 65 20 32 35 2e 20 20 49 66 20 74   above 25.  If t
2c390 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20  he cost.  ** of 
2c3a0 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74  computing an aut
2c3b0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 20  omatic index is 
2c3c0 6e 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77 69  not paid back wi
2c3d0 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 32  thin the first 2
2c3e0 35 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65  5.  ** rows, the
2c3f0 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65  n do not use the
2c400 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
2c410 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e  . */.  aFrom[0].
2c420 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73  nRow = MIN(pPars
2c430 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34  e->nQueryLoop, 4
2c440 36 29 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d  6);  assert( 46=
2c450 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
2c460 35 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20  5) );.  nFrom = 
2c470 31 3b 0a 0a 20 20 2f 2a 20 50 72 65 63 6f 6d 70  1;..  /* Precomp
2c480 75 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20  ute the cost of 
2c490 73 6f 72 74 69 6e 67 20 74 68 65 20 66 69 6e 61  sorting the fina
2c4a0 6c 20 72 65 73 75 6c 74 20 73 65 74 2c 20 69 66  l result set, if
2c4b0 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a   the caller.  **
2c4c0 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
2c4d0 42 65 67 69 6e 28 29 20 77 61 73 20 63 6f 6e 63  Begin() was conc
2c4e0 65 72 6e 65 64 20 61 62 6f 75 74 20 73 6f 72 74  erned about sort
2c4f0 69 6e 67 20 2a 2f 0a 20 20 72 53 6f 72 74 43 6f  ing */.  rSortCo
2c500 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57  st = 0;.  if( pW
2c510 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  Info->pOrderBy==
2c520 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20  0 || nRowEst==0 
2c530 29 7b 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e  ){.    aFrom[0].
2c540 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d  isOrderedValid =
2c550 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
2c560 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74 69   /* TUNING: Esti
2c570 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20 73 6f  mated cost of so
2c580 72 74 69 6e 67 20 69 73 20 34 38 2a 4e 2a 6c 6f  rting is 48*N*lo
2c590 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73  g2(N) where N is
2c5a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62   the.    ** numb
2c5b0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
2c5c0 73 2e 20 54 68 65 20 34 38 20 69 73 20 74 68 65  s. The 48 is the
2c5d0 20 65 78 70 65 63 74 65 64 20 73 69 7a 65 20 6f   expected size o
2c5e0 66 20 61 20 72 6f 77 20 74 6f 20 73 6f 72 74 2e  f a row to sort.
2c5f0 20 0a 20 20 20 20 2a 2a 20 46 49 58 4d 45 3a 20   .    ** FIXME: 
2c600 20 63 6f 6d 70 75 74 65 20 61 20 62 65 74 74 65   compute a bette
2c610 72 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  r estimate of th
2c620 65 20 34 38 20 6d 75 6c 74 69 70 6c 69 65 72 20  e 48 multiplier 
2c630 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 20 20 20  based on the.   
2c640 20 2a 2a 20 72 65 73 75 6c 74 20 73 65 74 20 65   ** result set e
2c650 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a 20  xpressions. */. 
2c660 20 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e     rSortCost = n
2c670 52 6f 77 45 73 74 20 2b 20 65 73 74 4c 6f 67 28  RowEst + estLog(
2c680 6e 52 6f 77 45 73 74 29 3b 0a 20 20 20 20 57 48  nRowEst);.    WH
2c690 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 28  ERETRACE(0x002,(
2c6a0 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d  "---- sort cost=
2c6b0 25 2d 33 64 5c 6e 22 2c 20 72 53 6f 72 74 43 6f  %-3d\n", rSortCo
2c6c0 73 74 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  st));.  }..  /* 
2c6d0 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 69  Compute successi
2c6e0 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72  vely longer Wher
2c6f0 65 50 61 74 68 73 20 75 73 69 6e 67 20 74 68 65  ePaths using the
2c700 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61   previous genera
2c710 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65  tion.  ** of Whe
2c720 72 65 50 61 74 68 73 20 61 73 20 74 68 65 20 62  rePaths as the b
2c730 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78  asis for the nex
2c740 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f  t.  Keep track o
2c750 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20  f the mxChoice. 
2c760 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20 61   ** best paths a
2c770 74 20 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f  t each generatio
2c780 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  n */.  for(iLoop
2c790 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b  =0; iLoop<nLoop;
2c7a0 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e   iLoop++){.    n
2c7b0 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  To = 0;.    for(
2c7c0 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f  ii=0, pFrom=aFro
2c7d0 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b  m; ii<nFrom; ii+
2c7e0 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
2c7f0 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57     for(pWLoop=pW
2c800 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57  Info->pLoops; pW
2c810 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c  Loop; pWLoop=pWL
2c820 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b  oop->pNextLoop){
2c830 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
2c840 20 6d 61 73 6b 4e 65 77 3b 0a 20 20 20 20 20 20   maskNew;.      
2c850 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73    Bitmask revMas
2c860 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75  k = 0;.        u
2c870 38 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  8 isOrderedValid
2c880 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65   = pFrom->isOrde
2c890 72 65 64 56 61 6c 69 64 3b 0a 20 20 20 20 20 20  redValid;.      
2c8a0 20 20 75 38 20 69 73 4f 72 64 65 72 65 64 20 3d    u8 isOrdered =
2c8b0 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
2c8c0 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  d;.        if( (
2c8d0 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26  pWLoop->prereq &
2c8e0 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f   ~pFrom->maskLoo
2c8f0 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  p)!=0 ) continue
2c900 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
2c910 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20  WLoop->maskSelf 
2c920 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  & pFrom->maskLoo
2c930 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  p)!=0 ) continue
2c940 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  ;.        /* At 
2c950 74 68 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f  this point, pWLo
2c960 6f 70 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  op is a candidat
2c970 65 20 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74  e to be the next
2c980 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20   loop. .        
2c990 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63  ** Compute its c
2c9a0 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ost */.        r
2c9b0 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Cost = sqlite3Lo
2c9c0 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e  gEstAdd(pWLoop->
2c9d0 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72  rSetup,pWLoop->r
2c9e0 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Run + pFrom->nRo
2c9f0 77 29 3b 0a 20 20 20 20 20 20 20 20 72 43 6f 73  w);.        rCos
2ca00 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
2ca10 74 41 64 64 28 72 43 6f 73 74 2c 20 70 46 72 6f  tAdd(rCost, pFro
2ca20 6d 2d 3e 72 43 6f 73 74 29 3b 0a 20 20 20 20 20  m->rCost);.     
2ca30 20 20 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d     nOut = pFrom-
2ca40 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e  >nRow + pWLoop->
2ca50 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 6d 61  nOut;.        ma
2ca60 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d  skNew = pFrom->m
2ca70 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70  askLoop | pWLoop
2ca80 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
2ca90 20 20 20 20 69 66 28 20 21 69 73 4f 72 64 65 72      if( !isOrder
2caa0 65 64 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20  edValid ){.     
2cab0 20 20 20 20 20 73 77 69 74 63 68 28 20 77 68 65       switch( whe
2cac0 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
2cad0 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20  rderBy(pWInfo,. 
2cae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2caf0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f        pWInfo->pO
2cb00 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70  rderBy, pFrom, p
2cb10 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2cb20 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
2cb30 20 20 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c            iLoop,
2cb40 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73   pWLoop, &revMas
2cb50 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k) ){.          
2cb60 20 20 63 61 73 65 20 31 3a 20 20 2f 2a 20 59 65    case 1:  /* Ye
2cb70 73 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70  s.  pFrom+pWLoop
2cb80 20 64 6f 65 73 20 73 61 74 69 73 66 79 20 74 68   does satisfy th
2cb90 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2cba0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
2cbb0 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20 31     isOrdered = 1
2cbc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2cbd0 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d  isOrderedValid =
2cbe0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
2cbf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2cc00 20 20 20 20 20 63 61 73 65 20 30 3a 20 20 2f 2a       case 0:  /*
2cc10 20 4e 6f 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f   No.  pFrom+pWLo
2cc20 6f 70 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  op will require 
2cc30 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 20  a separate sort 
2cc40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
2cc50 20 69 73 4f 72 64 65 72 65 64 20 3d 20 30 3b 0a   isOrdered = 0;.
2cc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2cc70 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31  OrderedValid = 1
2cc80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2cc90 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c  rCost = sqlite3L
2cca0 6f 67 45 73 74 41 64 64 28 72 43 6f 73 74 2c 20  ogEstAdd(rCost, 
2ccb0 72 53 6f 72 74 43 6f 73 74 29 3b 0a 20 20 20 20  rSortCost);.    
2ccc0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2ccd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66  .            def
2cce0 61 75 6c 74 3a 20 2f 2a 20 43 61 6e 6e 6f 74 20  ault: /* Cannot 
2ccf0 74 65 6c 6c 20 79 65 74 2e 20 20 54 72 79 20 61  tell yet.  Try a
2cd00 67 61 69 6e 20 6f 6e 20 74 68 65 20 6e 65 78 74  gain on the next
2cd10 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   iteration */.  
2cd20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2cd30 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
2cd40 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2cd50 20 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20          revMask 
2cd60 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70  = pFrom->revLoop
2cd70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2cd80 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
2cd90 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68  see if pWLoop sh
2cda0 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f  ould be added to
2cdb0 20 74 68 65 20 6d 78 43 68 6f 69 63 65 20 62 65   the mxChoice be
2cdc0 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  st so far */.   
2cdd0 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70       for(jj=0, p
2cde0 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20  To=aTo; jj<nTo; 
2cdf0 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  jj++, pTo++){.  
2ce00 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
2ce10 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e  >maskLoop==maskN
2ce20 65 77 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  ew.           &&
2ce30 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56   pTo->isOrderedV
2ce40 61 6c 69 64 3d 3d 69 73 4f 72 64 65 72 65 64 56  alid==isOrderedV
2ce50 61 6c 69 64 0a 20 20 20 20 20 20 20 20 20 20 20  alid.           
2ce60 26 26 20 28 28 70 54 6f 2d 3e 72 43 6f 73 74 3c  && ((pTo->rCost<
2ce70 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e  =rCost && pTo->n
2ce80 52 6f 77 3c 3d 6e 4f 75 74 29 20 7c 7c 0a 20 20  Row<=nOut) ||.  
2ce90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70                (p
2cea0 54 6f 2d 3e 72 43 6f 73 74 3e 3d 72 43 6f 73 74  To->rCost>=rCost
2ceb0 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3e 3d 6e   && pTo->nRow>=n
2cec0 4f 75 74 29 29 0a 20 20 20 20 20 20 20 20 20 20  Out)).          
2ced0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
2cee0 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f  estcase( jj==nTo
2cef0 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1 );.          
2cf00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2cf10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2cf20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e         if( jj>=n
2cf30 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  To ){.          
2cf40 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63  if( nTo>=mxChoic
2cf50 65 20 26 26 20 72 43 6f 73 74 3e 3d 6d 78 43 6f  e && rCost>=mxCo
2cf60 73 74 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45  st ){.#ifdef WHE
2cf70 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
2cf80 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
2cf90 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2cfa0 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
2cfb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2cfc0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2cfd0 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20 63  ntf("Skip   %s c
2cfe0 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
2cff0 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
2d000 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
2d010 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
2d020 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
2d030 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20   rCost, nOut,.  
2d040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d050 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f  isOrderedValid ?
2d060 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59   (isOrdered ? 'Y
2d070 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b  ' : 'N') : '?');
2d080 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23  .            }.#
2d090 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
2d0a0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2d0b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d0c0 20 20 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 50    /* Add a new P
2d0d0 61 74 68 20 74 6f 20 74 68 65 20 61 54 6f 5b 5d  ath to the aTo[]
2d0e0 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 20 20   set */.        
2d0f0 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69    if( nTo<mxChoi
2d100 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ce ){.          
2d110 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68    /* Increase th
2d120 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 54  e size of the aT
2d130 6f 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a  o set by one */.
2d140 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d              jj =
2d150 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20   nTo++;.        
2d160 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2d170 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74 68       /* New path
2d180 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 70 72   replaces the pr
2d190 69 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65 65  ior worst to kee
2d1a0 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78  p count below mx
2d1b0 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20 20  Choice */.      
2d1c0 20 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a        jj = mxI;.
2d1d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d1e0 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54 6f        pTo = &aTo
2d1f0 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48 45  [jj];.#ifdef WHE
2d200 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
2d210 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
2d220 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2d230 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
2d240 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2d250 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2d260 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74 3d  "New    %s cost=
2d270 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
2d280 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
2d290 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
2d2a0 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
2d2b0 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
2d2c0 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  , nOut,.        
2d2d0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
2d2e0 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65  dValid ? (isOrde
2d2f0 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29  red ? 'Y' : 'N')
2d300 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
2d310 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2d320 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d330 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
2d340 6f 73 74 3c 3d 72 43 6f 73 74 20 26 26 20 70 54  ost<=rCost && pT
2d350 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 20 29 7b  o->nRow<=nOut ){
2d360 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
2d370 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
2d380 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  4 */.           
2d390 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2d3a0 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
2d3b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2d3c0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
2d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3e0 20 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73    "Skip   %s cos
2d3f0 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72  t=%-3d,%3d order
2d400 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%c",.          
2d410 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
2d420 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
2d430 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
2d440 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
2d450 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
2d460 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73  deredValid ? (is
2d470 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
2d480 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
2d490 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2d4a0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
2d4b0 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25 2d 33    vs %s cost=%-3
2d4c0 64 2c 25 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  d,%d order=%c\n"
2d4d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d4e0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
2d4f0 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
2d500 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
2d510 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
2d520 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f               pTo
2d530 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
2d540 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   ? (pTo->isOrder
2d550 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20  ed ? 'Y' : 'N') 
2d560 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
2d570 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2d580 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2d590 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  e( pTo->rCost==r
2d5a0 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Cost );.        
2d5b0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2d5c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d5d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
2d5e0 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b  o->rCost==rCost+
2d5f0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  1 );.          /
2d600 2a 20 41 20 6e 65 77 20 61 6e 64 20 62 65 74 74  * A new and bett
2d610 65 72 20 73 63 6f 72 65 20 66 6f 72 20 61 20 70  er score for a p
2d620 72 65 76 69 6f 75 73 6c 79 20 63 72 65 61 74 65  reviously create
2d630 64 20 65 71 75 69 76 61 6c 65 6e 74 20 70 61 74  d equivalent pat
2d640 68 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52  h */.#ifdef WHER
2d650 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
2d660 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20  * 0x4 */.       
2d670 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
2d680 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
2d690 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2d6a0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
2d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d6c0 22 55 70 64 61 74 65 20 25 73 20 63 6f 73 74 3d  "Update %s cost=
2d6d0 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
2d6e0 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  c",.            
2d6f0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
2d700 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
2d710 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
2d720 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  nOut,.          
2d730 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56        isOrderedV
2d740 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65  alid ? (isOrdere
2d750 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a  d ? 'Y' : 'N') :
2d760 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
2d770 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2d780 72 69 6e 74 66 28 22 20 20 77 61 73 20 25 73 20  rintf("  was %s 
2d790 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
2d7a0 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
2d7b0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
2d7c0 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
2d7d0 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
2d7e0 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
2d7f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d800 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
2d810 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73  Valid ? (pTo->is
2d820 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
2d830 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
2d840 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
2d850 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d860 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61    /* pWLoop is a
2d870 20 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69 74   winner.  Add it
2d880 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62   to the set of b
2d890 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  est so far */.  
2d8a0 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c        pTo->maskL
2d8b0 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73  oop = pFrom->mas
2d8c0 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e  kLoop | pWLoop->
2d8d0 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
2d8e0 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d    pTo->revLoop =
2d8f0 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20   revMask;.      
2d900 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f    pTo->nRow = nO
2d910 75 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  ut;.        pTo-
2d920 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a  >rCost = rCost;.
2d930 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
2d940 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 69 73  rderedValid = is
2d950 4f 72 64 65 72 65 64 56 61 6c 69 64 3b 0a 20 20  OrderedValid;.  
2d960 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
2d970 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72 65 64  ered = isOrdered
2d980 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
2d990 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72  (pTo->aLoop, pFr
2d9a0 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f  om->aLoop, sizeo
2d9b0 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c  f(WhereLoop*)*iL
2d9c0 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 70 54  oop);.        pT
2d9d0 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20  o->aLoop[iLoop] 
2d9e0 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  = pWLoop;.      
2d9f0 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f    if( nTo>=mxCho
2da00 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ice ){.         
2da10 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20 20 20 20   mxI = 0;.      
2da20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f      mxCost = aTo
2da30 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20  [0].rCost;.     
2da40 20 20 20 20 20 6d 78 4f 75 74 20 3d 20 61 54 6f       mxOut = aTo
2da50 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20  [0].nRow;.      
2da60 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54      for(jj=1, pT
2da70 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78  o=&aTo[1]; jj<mx
2da80 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54  Choice; jj++, pT
2da90 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o++){.          
2daa0 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74    if( pTo->rCost
2dab0 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 70 54 6f 2d  >mxCost || (pTo-
2dac0 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26  >rCost==mxCost &
2dad0 26 20 70 54 6f 2d 3e 6e 52 6f 77 3e 6d 78 4f 75  & pTo->nRow>mxOu
2dae0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
2daf0 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f      mxCost = pTo
2db00 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  ->rCost;.       
2db10 20 20 20 20 20 20 20 6d 78 4f 75 74 20 3d 20 70         mxOut = p
2db20 54 6f 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20 20 20  To->nRow;.      
2db30 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a          mxI = jj
2db40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2db50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2db60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2db70 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52    }..#ifdef WHER
2db80 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 20  ETRACE_ENABLED  
2db90 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66  /* >=2 */.    if
2dba0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
2dbb0 61 63 65 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20  ace>=2 ){.      
2dbc0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2dbd0 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72  tf("---- after r
2dbe0 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c  ound %d ----\n",
2dbf0 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66   iLoop);.      f
2dc00 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f  or(ii=0, pTo=aTo
2dc10 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20  ; ii<nTo; ii++, 
2dc20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pTo++){.        
2dc30 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2dc40 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d 33  tf(" %s cost=%-3
2dc50 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65  d nrow=%-3d orde
2dc60 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  r=%c",.         
2dc70 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
2dc80 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29  pTo, iLoop+1, 0)
2dc90 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54  , pTo->rCost, pT
2dca0 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20  o->nRow,.       
2dcb0 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
2dcc0 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e  edValid ? (pTo->
2dcd0 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20  isOrdered ? 'Y' 
2dce0 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20  : 'N') : '?');. 
2dcf0 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
2dd00 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 26  isOrderedValid &
2dd10 26 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  & pTo->isOrdered
2dd20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2dd30 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2dd40 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22  (" rev=0x%llx\n"
2dd50 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b  , pTo->revLoop);
2dd60 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2dd70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2dd80 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
2dd90 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
2dda0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
2ddb0 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70 20  if..    /* Swap 
2ddc0 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61 46 72  the roles of aFr
2ddd0 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72 20 74  om and aTo for t
2dde0 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61 74 69  he next generati
2ddf0 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20  on */.    pFrom 
2de00 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d  = aTo;.    aTo =
2de10 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f   aFrom;.    aFro
2de20 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e  m = pFrom;.    n
2de30 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a  From = nTo;.  }.
2de40 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20  .  if( nFrom==0 
2de50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
2de60 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2de70 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f  no query solutio
2de80 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n");.    sqlite3
2de90 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63  DbFree(db, pSpac
2dea0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
2deb0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2dec0 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68  .  .  /* Find th
2ded0 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
2dee0 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20  th.  pFrom will 
2def0 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  be left pointing
2df00 20 74 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f   to that path */
2df10 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d  .  pFrom = aFrom
2df20 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69  ;.  for(ii=1; ii
2df30 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20  <nFrom; ii++){. 
2df40 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43     if( pFrom->rC
2df50 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43  ost>aFrom[ii].rC
2df60 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61  ost ) pFrom = &a
2df70 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20  From[ii];.  }.  
2df80 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
2df90 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b  nLevel==nLoop );
2dfa0 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c  .  /* Load the l
2dfb0 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20  owest cost path 
2dfc0 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20  into pWInfo */. 
2dfd0 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c   for(iLoop=0; iL
2dfe0 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70  oop<nLoop; iLoop
2dff0 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65  ++){.    WhereLe
2e000 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57  vel *pLevel = pW
2e010 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b  Info->a + iLoop;
2e020 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  .    pLevel->pWL
2e030 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70  oop = pWLoop = p
2e040 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f  From->aLoop[iLoo
2e050 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  p];.    pLevel->
2e060 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e  iFrom = pWLoop->
2e070 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iTab;.    pLevel
2e080 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57 49 6e  ->iTabCur = pWIn
2e090 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
2e0a0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69  pLevel->iFrom].i
2e0b0 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  Cursor;.  }.  if
2e0c0 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
2e0d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
2e0e0 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 0a  NT_DISTINCT)!=0.
2e0f0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
2e100 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2e110 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d 3d 30  E_DISTINCTBY)==0
2e120 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65  .   && pWInfo->e
2e130 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f  Distinct==WHERE_
2e140 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20  DISTINCT_NOOP.  
2e150 20 26 26 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b   && nRowEst.  ){
2e160 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  .    Bitmask not
2e170 55 73 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63  Used;.    int rc
2e180 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
2e190 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
2e1a0 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65  nfo, pWInfo->pRe
2e1b0 73 75 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a  sultSet, pFrom,.
2e1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1d0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
2e1e0 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f  Y, nLoop-1, pFro
2e1f0 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31  m->aLoop[nLoop-1
2e200 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  ], &notUsed);.  
2e210 20 20 69 66 28 20 72 63 3d 3d 31 20 29 20 70 57    if( rc==1 ) pW
2e220 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
2e230 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
2e240 5f 4f 52 44 45 52 45 44 3b 0a 20 20 7d 0a 20 20  _ORDERED;.  }.  
2e250 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64  if( pFrom->isOrd
2e260 65 72 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20  ered ){.    if( 
2e270 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2e280 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
2e290 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20 70  NCTBY ){.      p
2e2a0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
2e2b0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
2e2c0 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 7d  T_ORDERED;.    }
2e2d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49 6e  else{.      pWIn
2e2e0 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 31 3b 0a  fo->bOBSat = 1;.
2e2f0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65        pWInfo->re
2e300 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72  vMask = pFrom->r
2e310 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20 20  evLoop;.    }.  
2e320 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  }.  pWInfo->nRow
2e330 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Out = pFrom->nRo
2e340 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65  w;..  /* Free te
2e350 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61  mporary memory a
2e360 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  nd return succes
2e370 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62  s */.  sqlite3Db
2e380 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29  Free(db, pSpace)
2e390 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2e3a0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
2e3b0 6f 73 74 20 71 75 65 72 69 65 73 20 75 73 65 20  ost queries use 
2e3c0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
2e3d0 62 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f  ble (they are no
2e3e0 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76  t joins) and hav
2e3f0 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63  e.** simple == c
2e400 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e  onstraints again
2e410 73 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64  st indexed field
2e420 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
2e430 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20   attempts.** to 
2e440 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c  plan those simpl
2e450 65 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75  e cases using mu
2e460 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79  ch less ceremony
2e470 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e   than the.** gen
2e480 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65  eral-purpose que
2e490 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20  ry planner, and 
2e4a0 74 68 65 72 65 62 79 20 79 69 65 6c 64 20 66 61  thereby yield fa
2e4b0 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65  ster sqlite3_pre
2e4c0 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20  pare().** times 
2e4d0 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
2e4e0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ase..**.** Retur
2e4f0 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75  n non-zero on su
2e500 63 63 65 73 73 2c 20 69 66 20 74 68 69 73 20 71  ccess, if this q
2e510 75 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64  uery can be hand
2e520 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e  led by this.** n
2e530 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70  o-frills query p
2e540 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20  lanner.  Return 
2e550 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71 75 65  zero if this que
2e560 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a  ry needs the .**
2e570 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   general-purpose
2e580 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a   query planner..
2e590 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
2e5a0 65 72 65 53 68 6f 72 74 43 75 74 28 57 68 65 72  ereShortCut(Wher
2e5b0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
2e5c0 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65  uilder){.  Where
2e5d0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20  Info *pWInfo;.  
2e5e0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2e5f0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68  tem *pItem;.  Wh
2e600 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a  ereClause *pWC;.
2e610 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
2e620 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  rm;.  WhereLoop 
2e630 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43  *pLoop;.  int iC
2e640 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54  ur;.  int j;.  T
2e650 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
2e660 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20 20  dex *pIdx;.  .  
2e670 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
2e680 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28  r->pWInfo;.  if(
2e690 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
2e6a0 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43  ags & WHERE_FORC
2e6b0 45 5f 54 41 42 4c 45 20 29 20 72 65 74 75 72 6e  E_TABLE ) return
2e6c0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   0;.  assert( pW
2e6d0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
2e6e0 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74  nSrc>=1 );.  pIt
2e6f0 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  em = pWInfo->pTa
2e700 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62  bList->a;.  pTab
2e710 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
2e720 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
2e730 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
2e740 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  ;.  if( pItem->z
2e750 49 6e 64 65 78 20 29 20 72 65 74 75 72 6e 20 30  Index ) return 0
2e760 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d  ;.  iCur = pItem
2e770 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43  ->iCursor;.  pWC
2e780 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b   = &pWInfo->sWC;
2e790 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c  .  pLoop = pBuil
2e7a0 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f  der->pNew;.  pLo
2e7b0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b  op->wsFlags = 0;
2e7c0 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54  .  pTerm = findT
2e7d0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
2e7e0 31 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 30 29 3b  1, 0, WO_EQ, 0);
2e7f0 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a  .  if( pTerm ){.
2e800 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
2e810 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs = WHERE_COLUM
2e820 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57  N_EQ|WHERE_IPK|W
2e830 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20  HERE_ONEROW;.   
2e840 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30   pLoop->aLTerm[0
2e850 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70  ] = pTerm;.    p
2e860 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  Loop->nLTerm = 1
2e870 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62  ;.    pLoop->u.b
2e880 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20  tree.nEq = 1;.  
2e890 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
2e8a0 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f  t of a rowid loo
2e8b0 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20  kup is 10 */.   
2e8c0 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33   pLoop->rRun = 3
2e8d0 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69 74  3;  /* 33==sqlit
2e8e0 65 33 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f 0a  e3LogEst(10) */.
2e8f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
2e900 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
2e910 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
2e920 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
2e930 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
2e940 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70  ->aLTermSpace==p
2e950 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a  Loop->aLTerm );.
2e960 20 20 20 20 20 20 61 73 73 65 72 74 28 20 41 72        assert( Ar
2e970 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61  raySize(pLoop->a
2e980 4c 54 65 72 6d 53 70 61 63 65 29 3d 3d 34 20 29  LTermSpace)==4 )
2e990 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
2e9a0 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f  ->onError==OE_No
2e9b0 6e 65 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49  ne .       || pI
2e9c0 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
2e9d0 65 21 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20  e!=0 .       || 
2e9e0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72  pIdx->nKeyCol>Ar
2e9f0 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61  raySize(pLoop->a
2ea00 4c 54 65 72 6d 53 70 61 63 65 29 20 0a 20 20 20  LTermSpace) .   
2ea10 20 20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20     ) continue;. 
2ea20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2ea30 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  pIdx->nKeyCol; j
2ea40 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65  ++){.        pTe
2ea50 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
2ea60 43 2c 20 69 43 75 72 2c 20 70 49 64 78 2d 3e 61  C, iCur, pIdx->a
2ea70 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c 20 57  iColumn[j], 0, W
2ea80 4f 5f 45 51 2c 20 70 49 64 78 29 3b 0a 20 20 20  O_EQ, pIdx);.   
2ea90 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
2eaa0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
2eab0 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
2eac0 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [j] = pTerm;.   
2ead0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
2eae0 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  !=pIdx->nKeyCol 
2eaf0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2eb00 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
2eb10 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
2eb20 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c  EQ|WHERE_ONEROW|
2eb30 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
2eb40 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 69       if( pIdx->i
2eb50 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70 49  sCovering || (pI
2eb60 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e  tem->colUsed & ~
2eb70 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70  columnsInIndex(p
2eb80 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Idx))==0 ){.    
2eb90 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
2eba0 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f  gs |= WHERE_IDX_
2ebb0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ONLY;.      }.  
2ebc0 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72      pLoop->nLTer
2ebd0 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f  m = j;.      pLo
2ebe0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
2ebf0 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  = j;.      pLoop
2ec00 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
2ec10 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 2f   = pIdx;.      /
2ec20 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
2ec30 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  f a unique index
2ec40 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f   lookup is 15 */
2ec50 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52  .      pLoop->rR
2ec60 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d  un = 39;  /* 39=
2ec70 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
2ec80 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  5) */.      brea
2ec90 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
2eca0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
2ecb0 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  s ){.    pLoop->
2ecc0 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 31  nOut = (LogEst)1
2ecd0 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b  ;.    pWInfo->a[
2ece0 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f  0].pWLoop = pLoo
2ecf0 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61  p;.    pLoop->ma
2ed00 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b  skSelf = getMask
2ed10 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
2ed20 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 70  et, iCur);.    p
2ed30 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62  WInfo->a[0].iTab
2ed40 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  Cur = iCur;.    
2ed50 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20  pWInfo->nRowOut 
2ed60 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49  = 1;.    if( pWI
2ed70 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 20  nfo->pOrderBy ) 
2ed80 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d  pWInfo->bOBSat =
2ed90 20 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49    1;.    if( pWI
2eda0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2edb0 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
2edc0 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70  TINCT ){.      p
2edd0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
2ede0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
2edf0 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a  T_UNIQUE;.    }.
2ee00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2ee10 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63  BUG.    pLoop->c
2ee20 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66  Id = '0';.#endif
2ee30 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
2ee40 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2ee50 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
2ee60 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
2ee70 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20  f the loop used 
2ee80 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  for WHERE clause
2ee90 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20   processing..** 
2eea0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
2eeb0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2eec0 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63   an opaque struc
2eed0 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69  ture that contai
2eee0 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ns.** informatio
2eef0 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d  n needed to term
2ef00 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20  inate the loop. 
2ef10 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c   Later, the call
2ef20 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73  ing routine.** s
2ef30 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c  hould invoke sql
2ef40 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 77  ite3WhereEnd() w
2ef50 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 76  ith the return v
2ef60 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
2ef70 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65  ction.** in orde
2ef80 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  r to complete th
2ef90 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
2efa0 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
2efb0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2efc0 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  urs, this routin
2efd0 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a  e returns NULL..
2efe0 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20  **.** The basic 
2eff0 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20  idea is to do a 
2f000 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65  nested loop, one
2f010 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74   loop for each t
2f020 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46  able in.** the F
2f030 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
2f040 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54  select.  (INSERT
2f050 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61 74   and UPDATE stat
2f060 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a  ements are the.*
2f070 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45  * same as a SELE
2f080 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73  CT with only a s
2f090 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74  ingle table in t
2f0a0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29  he FROM clause.)
2f0b0 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65    For.** example
2f0c0 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73 20  , if the SQL is 
2f0d0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
2f0e0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2f0f0 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45  t1, t2, t3 WHERE
2f100 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e   ...;.**.** Then
2f110 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
2f120 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61  ted is conceptua
2f130 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c  lly like the fol
2f140 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
2f150 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
2f160 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c  in t1 do       \
2f170 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74      Code generat
2f180 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72  ed.**        for
2f190 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
2f1a0 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73  do      |-- by s
2f1b0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2f1c0 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ().**          f
2f1d0 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74  oreach row3 in t
2f1e0 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20  3 do   /.**     
2f1f0 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
2f200 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20         end      
2f210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2f220 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74      Code generat
2f230 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64  ed.**        end
2f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f250 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73          |-- by s
2f260 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
2f270 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20  .**      end    
2f280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f290 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74       /.**.** Not
2f2a0 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73  e that the loops
2f2b0 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65   might not be ne
2f2c0 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65  sted in the orde
2f2d0 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a  r in which they.
2f2e0 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ** appear in the
2f2f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20   FROM clause if 
2f300 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65  a different orde
2f310 72 20 69 73 20 62 65 74 74 65 72 20 61 62 6c 65  r is better able
2f320 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20   to make.** use 
2f330 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74  of indices.  Not
2f340 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e  e also that when
2f350 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
2f360 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74   appears in.** t
2f370 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
2f380 20 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74   it might result
2f390 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e   in additional n
2f3a0 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a  ested loops for.
2f3b0 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  ** scanning thro
2f3c0 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ugh all values o
2f3d0 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  n the right-hand
2f3e0 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e   side of the IN.
2f3f0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
2f400 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20 61   Btree cursors a
2f410 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
2f420 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75  ach table.  t1 u
2f430 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75  ses cursor.** nu
2f440 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  mber pTabList->a
2f450 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32  [0].iCursor.  t2
2f460 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f 72   uses the cursor
2f470 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e   pTabList->a[1].
2f480 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20  iCursor..** And 
2f490 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20  so forth.  This 
2f4a0 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
2f4b0 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74  s code to open t
2f4c0 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f 72  hose VDBE cursor
2f4d0 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  s.** and sqlite3
2f4e0 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72  WhereEnd() gener
2f4f0 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f  ates the code to
2f500 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a   close them..**.
2f510 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  ** The code that
2f520 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2f530 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c  in() generates l
2f540 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72  eaves the cursor
2f550 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54  s named.** in pT
2f560 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20  abList pointing 
2f570 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70 72  at their appropr
2f580 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54  iate entries.  T
2f590 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a  he [...] code.**
2f5a0 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75   can use OP_Colu
2f5b0 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20  mn and OP_Rowid 
2f5c0 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65  opcodes on these
2f5d0 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72   cursors to extr
2f5e0 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d  act.** data from
2f5f0 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61 62   the various tab
2f600 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  les of the loop.
2f610 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48  .**.** If the WH
2f620 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d  ERE clause is em
2f630 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68  pty, the foreach
2f640 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68   loops must each
2f650 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65   scan their.** e
2f660 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54  ntire tables.  T
2f670 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79 20  hus a three-way 
2f680 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33  join is an O(N^3
2f690 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75  ) operation.  Bu
2f6a0 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  t if.** the tabl
2f6b0 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73 20  es have indices 
2f6c0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74 65  and there are te
2f6d0 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  rms in the WHERE
2f6e0 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20   clause that.** 
2f6f0 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69  refer to those i
2f700 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65  ndices, a comple
2f710 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61  te table scan ca
2f720 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64  n be avoided and
2f730 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c   the.** code wil
2f740 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65  l run much faste
2f750 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20  r.  Most of the 
2f760 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75  work of this rou
2f770 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67  tine is checking
2f780 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68  .** to see if th
2f790 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73 20  ere are indices 
2f7a0 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
2f7b0 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68 65   to speed up the
2f7c0 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72   loop..**.** Ter
2f7d0 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
2f7e0 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20  clause are also 
2f7f0 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68  used to limit wh
2f800 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c  ich rows actuall
2f810 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20  y.** make it to 
2f820 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65  the "..." in the
2f830 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c   middle of the l
2f840 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63 68  oop.  After each
2f850 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74   "foreach",.** t
2f860 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
2f870 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75 73  E clause that us
2f880 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20  e only terms in 
2f890 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75  that loop and ou
2f8a0 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65  ter.** loops are
2f8b0 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69   evaluated and i
2f8c0 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69  f false a jump i
2f8d0 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c  s made around al
2f8e0 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  l subsequent.** 
2f8f0 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20  inner loops (or 
2f900 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22  around the "..."
2f910 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63 63   if the test occ
2f920 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 69  urs within the i
2f930 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f  nner-.** most lo
2f940 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20  op).**.** OUTER 
2f950 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f  JOINS.**.** An o
2f960 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62  uter join of tab
2f970 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69 73  les t1 and t2 is
2f980 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64   conceptally cod
2f990 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
2f9a0 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20  *.**    foreach 
2f9b0 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a  row1 in t1 do.**
2f9c0 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a        flag = 0.*
2f9d0 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
2f9e0 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20  ow2 in t2 do.** 
2f9f0 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a         start:.**
2fa00 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
2fa10 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d            flag =
2fa20 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a   1.**      end.*
2fa30 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d  *      if flag==
2fa40 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  0 then.**       
2fa50 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63   move the row2 c
2fa60 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20  ursor to a null 
2fa70 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f  row.**        go
2fa80 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20  to start.**     
2fa90 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a   fi.**    end.**
2faa0 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41  .** ORDER BY CLA
2fab0 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a  USE PROCESSING.*
2fac0 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73  *.** pOrderBy is
2fad0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
2fae0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2faf0 65 20 28 6f 72 20 74 68 65 20 47 52 4f 55 50 20  e (or the GROUP 
2fb00 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20  BY clause.** if 
2fb10 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42  the WHERE_GROUPB
2fb20 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e  Y flag is set in
2fb30 20 77 63 74 72 6c 46 6c 61 67 73 29 20 6f 66 20   wctrlFlags) of 
2fb40 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
2fb50 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  nt.** if there i
2fb60 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65  s one.  If there
2fb70 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
2fb80 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68 69  clause or if thi
2fb90 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
2fba0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55  called from an U
2fbb0 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
2fbc0 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
2fbd0 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c  pOrderBy is NULL
2fbe0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 49 64 78  ..**.** The iIdx
2fbf0 43 75 72 20 70 61 72 61 6d 65 74 65 72 20 69 73  Cur parameter is
2fc00 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
2fc10 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 20  er of an index. 
2fc20 20 49 66 20 0a 2a 2a 20 57 48 45 52 45 5f 4f 4e   If .** WHERE_ON
2fc30 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73  ETABLE_ONLY is s
2fc40 65 74 2c 20 69 49 64 78 43 75 72 20 69 73 20 74  et, iIdxCur is t
2fc50 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
2fc60 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20   of an index.** 
2fc70 74 6f 20 75 73 65 20 66 6f 72 20 4f 52 20 63 6c  to use for OR cl
2fc80 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
2fc90 20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75    The WHERE clau
2fca0 73 65 20 73 68 6f 75 6c 64 20 75 73 65 20 74 68  se should use th
2fcb0 69 73 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 63  is.** specific c
2fcc0 75 72 73 6f 72 2e 20 20 49 66 20 57 48 45 52 45  ursor.  If WHERE
2fcd0 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
2fce0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 69 49   is set, then iI
2fcf0 64 78 43 75 72 20 69 73 0a 2a 2a 20 74 68 65 20  dxCur is.** the 
2fd00 66 69 72 73 74 20 63 75 72 73 6f 72 20 69 6e 20  first cursor in 
2fd10 61 6e 20 61 72 72 61 79 20 6f 66 20 63 75 72 73  an array of curs
2fd20 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69  ors for all indi
2fd30 63 65 73 2e 20 20 69 49 64 78 43 75 72 20 73 68  ces.  iIdxCur sh
2fd40 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73 65 64 20  ould.** be used 
2fd50 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61  to compute the a
2fd60 70 70 72 6f 70 72 69 61 74 65 20 63 75 72 73 6f  ppropriate curso
2fd70 72 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  r depending on w
2fd80 68 69 63 68 20 69 6e 64 65 78 20 69 73 0a 2a 2a  hich index is.**
2fd90 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49   used..*/.WhereI
2fda0 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72  nfo *sqlite3Wher
2fdb0 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20  eBegin(.  Parse 
2fdc0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2fdd0 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
2fde0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
2fdf0 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
2fe00 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a   /* FROM clause:
2fe10 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74   A list of all t
2fe20 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e  ables to be scan
2fe30 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ned */.  Expr *p
2fe40 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
2fe50 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
2fe60 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
2fe70 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
2fe80 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   An ORDER BY cla
2fe90 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
2fea0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52 65 73    ExprList *pRes
2feb0 75 6c 74 53 65 74 2c 20 2f 2a 20 52 65 73 75 6c  ultSet, /* Resul
2fec0 74 20 73 65 74 20 6f 66 20 74 68 65 20 71 75 65  t set of the que
2fed0 72 79 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  ry */.  u16 wctr
2fee0 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a  lFlags,       /*
2fef0 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   One of the WHER
2ff00 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65  E_* flags define
2ff10 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68  d in sqliteInt.h
2ff20 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75   */.  int iIdxCu
2ff30 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  r           /* I
2ff40 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  f WHERE_ONETABLE
2ff50 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 6e  _ONLY is set, in
2ff60 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  dex cursor numbe
2ff70 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  r */.){.  int nB
2ff80 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  yteWInfo;       
2ff90 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74       /* Num. byt
2ffa0 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
2ffb0 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
2ffc0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c  t */.  int nTabL
2ffd0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
2ffe0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
2fff0 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c  lements in pTabL
30000 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ist */.  WhereIn
30010 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
30020 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f      /* Will beco
30030 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  me the return va
30040 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
30050 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
30060 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
30070 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74  e;   /* The virt
30080 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
30090 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ine */.  Bitmask
300a0 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20   notReady;      
300b0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74      /* Cursors t
300c0 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20  hat are not yet 
300d0 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20  positioned */.  
300e0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
300f0 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68   sWLB;     /* Th
30100 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c  e WhereLoop buil
30110 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  der */.  WhereMa
30120 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
30130 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
30140 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a  ssion mask set *
30150 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
30160 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f  pLevel;        /
30170 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c  * A single level
30180 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20   in pWInfo->a[] 
30190 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
301a0 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
301b0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
301c0 73 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70  single WhereLoop
301d0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
301e0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
301f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
30200 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c  counter */.  sql
30210 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
30220 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
30230 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
30240 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
30250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30260 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
30270 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  ...  /* Variable
30280 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
30290 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
302a0 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28 26  ->db;.  memset(&
302b0 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sWLB, 0, sizeof(
302c0 73 57 4c 42 29 29 3b 0a 20 20 73 57 4c 42 2e 70  sWLB));.  sWLB.p
302d0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
302e0 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c  By;..  /* Disabl
302f0 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f  e the DISTINCT o
30300 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53  ptimization if S
30310 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70  QLITE_DistinctOp
30320 74 20 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a  t is set via.  *
30330 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
30340 74 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  trl(SQLITE_TESTC
30350 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
30360 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20  S,...) */.  if( 
30370 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
30380 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
30390 44 69 73 74 69 6e 63 74 4f 70 74 29 20 29 7b 0a  DistinctOpt) ){.
303a0 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 26      wctrlFlags &
303b0 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44 49  = ~WHERE_WANT_DI
303c0 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f  STINCT;.  }..  /
303d0 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
303e0 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
303f0 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
30400 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  ited by the numb
30410 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20  er of.  ** bits 
30420 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20  in a Bitmask .  
30430 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  */.  testcase( p
30440 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42  TabList->nSrc==B
30450 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  MS );.  if( pTab
30460 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29  List->nSrc>BMS )
30470 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
30480 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
30490 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73  t most %d tables
304a0 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53   in a join", BMS
304b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
304c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
304d0 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c  function normall
304e0 79 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65  y generates a ne
304f0 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c  sted loop for al
30500 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a  l tables in .  *
30510 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74  * pTabList.  But
30520 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f 4e   if the WHERE_ON
30530 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67  ETABLE_ONLY flag
30540 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65   is set, then we
30550 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c   should.  ** onl
30560 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  y generate code 
30570 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 61  for the first ta
30580 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20  ble in pTabList 
30590 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a  and assume that.
305a0 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73    ** any cursors
305b0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
305c0 20 73 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c   subsequent tabl
305d0 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c  es are uninitial
305e0 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61  ized..  */.  nTa
305f0 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c  bList = (wctrlFl
30600 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54  ags & WHERE_ONET
30610 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a  ABLE_ONLY) ? 1 :
30620 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b   pTabList->nSrc;
30630 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
30640 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
30650 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  he WhereInfo str
30660 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c  ucture that will
30670 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a   become the.  **
30680 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41   return value. A
30690 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69   single allocati
306a0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73 74  on is used to st
306b0 6f 72 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ore the WhereInf
306c0 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74  o.  ** struct, t
306d0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57  he contents of W
306e0 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68  hereInfo.a[], th
306f0 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
30700 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64  ructure.  ** and
30710 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65   the WhereMaskSe
30720 74 20 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e  t structure. Sin
30730 63 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 63  ce WhereClause c
30740 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74  ontains an 8-byt
30750 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79  e.  ** field (ty
30760 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d  pe Bitmask) it m
30770 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f  ust be aligned o
30780 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e  n an 8-byte boun
30790 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d  dary on.  ** som
307a0 65 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e  e architectures.
307b0 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44   Hence the ROUND
307c0 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a  8() below..  */.
307d0 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20 52    nByteWInfo = R
307e0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68 65  OUND8(sizeof(Whe
307f0 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73  reInfo)+(nTabLis
30800 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72  t-1)*sizeof(Wher
30810 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e  eLevel));.  pWIn
30820 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
30830 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
30840 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f 66  teWInfo + sizeof
30850 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20  (WhereLoop));.  
30860 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
30870 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
30880 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
30890 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66  Info);.    pWInf
308a0 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  o = 0;.    goto 
308b0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
308c0 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 61  .  }.  pWInfo->a
308d0 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d  iCurOnePass[0] =
308e0 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
308f0 65 50 61 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20  ePass[1] = -1;. 
30900 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20   pWInfo->nLevel 
30910 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = nTabList;.  pW
30920 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70  Info->pParse = p
30930 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Parse;.  pWInfo-
30940 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62  >pTabList = pTab
30950 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
30960 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
30970 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rBy;.  pWInfo->p
30980 52 65 73 75 6c 74 53 65 74 20 3d 20 70 52 65 73  ResultSet = pRes
30990 75 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f  ultSet;.  pWInfo
309a0 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ->iBreak = sqlit
309b0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
309c0 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63  v);.  pWInfo->wc
309d0 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c  trlFlags = wctrl
309e0 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d  Flags;.  pWInfo-
309f0 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
30a00 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72   = pParse->nQuer
30a10 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65  yLoop;.  pMaskSe
30a20 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  t = &pWInfo->sMa
30a30 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57  skSet;.  sWLB.pW
30a40 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20  Info = pWInfo;. 
30a50 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57 49   sWLB.pWC = &pWI
30a60 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42  nfo->sWC;.  sWLB
30a70 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c 6f  .pNew = (WhereLo
30a80 6f 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57 49  op*)(((char*)pWI
30a90 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29  nfo)+nByteWInfo)
30aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
30ab0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
30ac0 28 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20  (sWLB.pNew) );. 
30ad0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73   whereLoopInit(s
30ae0 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65  WLB.pNew);.#ifde
30af0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
30b00 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20   sWLB.pNew->cId 
30b10 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20  = '*';.#endif.. 
30b20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48   /* Split the WH
30b30 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20  ERE clause into 
30b40 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70 72  separate subexpr
30b50 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61  essions where ea
30b60 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65  ch.  ** subexpre
30b70 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74  ssion is separat
30b80 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65  ed by an AND ope
30b90 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e  rator..  */.  in
30ba0 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53  itMaskSet(pMaskS
30bb0 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75  et);.  whereClau
30bc0 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e  seInit(&pWInfo->
30bd0 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  sWC, pWInfo);.  
30be0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
30bf0 6f 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c  onstants(pParse,
30c00 20 70 57 68 65 72 65 29 3b 0a 20 20 77 68 65 72   pWhere);.  wher
30c10 65 53 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e  eSplit(&pWInfo->
30c20 73 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f  sWC, pWhere, TK_
30c30 41 4e 44 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  AND);.  sqlite3C
30c40 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
30c50 70 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20  pParse, -1); /* 
30c60 49 6e 73 65 72 74 20 74 68 65 20 63 6f 6f 6b 69  Insert the cooki
30c70 65 20 76 65 72 69 66 69 65 72 20 47 6f 74 6f 20  e verifier Goto 
30c80 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65  */.    .  /* Spe
30c90 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45  cial case: a WHE
30ca0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
30cb0 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61  s constant.  Eva
30cc0 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65  luate the.  ** e
30cd0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69  xpression and ei
30ce0 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61  ther jump over a
30cf0 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f  ll of the code o
30d00 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a  r fall thru..  *
30d10 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65 20 26  /.  if( pWhere &
30d20 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c  & (nTabList==0 |
30d30 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  | sqlite3ExprIsC
30d40 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
30d50 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20 20 73  Where)) ){.    s
30d60 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
30d70 65 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65  e(pParse, pWhere
30d80 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
30d90 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
30da0 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65 72 65  ULL);.    pWhere
30db0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
30dc0 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f  Special case: No
30dd0 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
30de0 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74  /.  if( nTabList
30df0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
30e00 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f  OrderBy ) pWInfo
30e10 2d 3e 62 4f 42 53 61 74 20 3d 20 31 3b 0a 20 20  ->bOBSat = 1;.  
30e20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
30e30 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
30e40 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20  STINCT ){.      
30e50 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
30e60 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
30e70 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  CT_UNIQUE;.    }
30e80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67  .  }..  /* Assig
30e90 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65  n a bit from the
30ea0 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72   bitmask to ever
30eb0 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52  y term in the FR
30ec0 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  OM clause..  **.
30ed0 20 20 2a 2a 20 57 68 65 6e 20 61 73 73 69 67 6e    ** When assign
30ee0 69 6e 67 20 62 69 74 6d 61 73 6b 20 76 61 6c 75  ing bitmask valu
30ef0 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73  es to FROM claus
30f00 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 6d 75  e cursors, it mu
30f10 73 74 20 62 65 0a 20 20 2a 2a 20 74 68 65 20 63  st be.  ** the c
30f20 61 73 65 20 74 68 61 74 20 69 66 20 58 20 69 73  ase that if X is
30f30 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
30f40 20 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63   the N-th FROM c
30f50 6c 61 75 73 65 20 74 65 72 6d 20 74 68 65 6e 0a  lause term then.
30f60 20 20 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b    ** the bitmask
30f70 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c   for all FROM cl
30f80 61 75 73 65 20 74 65 72 6d 73 20 74 6f 20 74 68  ause terms to th
30f90 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 4e 2d  e left of the N-
30fa0 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20  th term.  ** is 
30fb0 28 58 2d 31 29 2e 20 20 20 41 6e 20 65 78 70 72  (X-1).   An expr
30fc0 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  ession from the 
30fd0 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c  ON clause of a L
30fe0 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65  EFT JOIN can use
30ff0 0a 20 20 2a 2a 20 69 74 73 20 45 78 70 72 2e 69  .  ** its Expr.i
31000 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76  RightJoinTable v
31010 61 6c 75 65 20 74 6f 20 66 69 6e 64 20 74 68 65  alue to find the
31020 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68 65 20   bitmask of the 
31030 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a  right table.  **
31040 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53   of the join.  S
31050 75 62 74 72 61 63 74 69 6e 67 20 6f 6e 65 20 66  ubtracting one f
31060 72 6f 6d 20 74 68 65 20 72 69 67 68 74 20 74 61  rom the right ta
31070 62 6c 65 20 62 69 74 6d 61 73 6b 20 67 69 76 65  ble bitmask give
31080 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b  s a.  ** bitmask
31090 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
310a0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
310b0 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e  he join.  Knowin
310c0 67 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20  g the bitmask.  
310d0 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  ** for all table
310e0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
310f0 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20   a left join is 
31100 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b  important.  Tick
31110 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20  et #3015..  **. 
31120 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69   ** Note that bi
31130 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61 74  tmasks are creat
31140 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c  ed for all pTabL
31150 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73  ist->nSrc tables
31160 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73   in.  ** pTabLis
31170 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20  t, not just the 
31180 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74  first nTabList t
31190 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74  ables.  nTabList
311a0 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a   is normally.  *
311b0 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c  * equal to pTabL
311c0 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69  ist->nSrc but mi
311d0 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64  ght be shortened
311e0 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a   to 1 if the.  *
311f0 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  * WHERE_ONETABLE
31200 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65  _ONLY flag is se
31210 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  t..  */.  for(ii
31220 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d  =0; ii<pTabList-
31230 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  >nSrc; ii++){.  
31240 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61    createMask(pMa
31250 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
31260 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b  >a[ii].iCursor);
31270 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  }.#ifndef NDE
31280 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d  BUG.  {.    Bitm
31290 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d 20  ask toTheLeft = 
312a0 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  0;.    for(ii=0;
312b0 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53   ii<pTabList->nS
312c0 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  rc; ii++){.     
312d0 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74   Bitmask m = get
312e0 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
312f0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69  TabList->a[ii].i
31300 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61  Cursor);.      a
31310 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f  ssert( (m-1)==to
31320 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  TheLeft );.     
31330 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b   toTheLeft |= m;
31340 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
31350 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  f..  /* Analyze 
31360 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78  all of the subex
31370 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65  pressions.  Note
31380 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a   that exprAnalyz
31390 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61  e() might.  ** a
313a0 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74  dd new virtual t
313b0 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e  erms onto the en
313c0 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  d of the WHERE c
313d0 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f  lause.  We do no
313e0 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61  t.  ** want to a
313f0 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72  nalyze these vir
31400 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73  tual terms, so s
31410 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61  tart analyzing a
31420 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61  t the end.  ** a
31430 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20  nd work forward 
31440 73 6f 20 74 68 61 74 20 74 68 65 20 61 64 64 65  so that the adde
31450 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20  d virtual terms 
31460 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73  are never proces
31470 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72  sed..  */.  expr
31480 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c  AnalyzeAll(pTabL
31490 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  ist, &pWInfo->sW
314a0 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  C);.  if( db->ma
314b0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
314c0 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
314d0 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f  nError;.  }..  /
314e0 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42  * If the ORDER B
314f0 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20  Y (or GROUP BY) 
31500 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
31510 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 67 65  references to ge
31520 6e 65 72 61 6c 0a 20 20 2a 2a 20 65 78 70 72 65  neral.  ** expre
31530 73 73 69 6f 6e 73 2c 20 74 68 65 6e 20 77 65 20  ssions, then we 
31540 77 6f 6e 27 74 20 62 65 20 61 62 6c 65 20 74 6f  won't be able to
31550 20 73 61 74 69 73 66 79 20 69 74 20 75 73 69 6e   satisfy it usin
31560 67 20 69 6e 64 69 63 65 73 2c 20 73 6f 0a 20 20  g indices, so.  
31570 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ** go ahead and 
31580 64 69 73 61 62 6c 65 20 69 74 20 6e 6f 77 2e 0a  disable it now..
31590 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
315a0 72 42 79 20 26 26 20 28 77 63 74 72 6c 46 6c 61  rBy && (wctrlFla
315b0 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
315c0 44 49 53 54 49 4e 43 54 29 21 3d 30 20 29 7b 0a  DISTINCT)!=0 ){.
315d0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
315e0 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
315f0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  ; ii++){.      E
31600 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c  xpr *pExpr = sql
31610 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
31620 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ate(pOrderBy->a[
31630 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  ii].pExpr);.    
31640 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
31650 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
31660 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f        pWInfo->pO
31670 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
31680 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62  y = 0;.        b
31690 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
316a0 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f  e if( pExpr->iCo
316b0 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
316c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
316d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
316e0 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
316f0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
31700 43 54 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  CT ){.    if( is
31710 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e  DistinctRedundan
31720 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  t(pParse, pTabLi
31730 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  st, &pWInfo->sWC
31740 2c 20 70 52 65 73 75 6c 74 53 65 74 29 20 29 7b  , pResultSet) ){
31750 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 44 49  .      /* The DI
31760 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69  STINCT marking i
31770 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67  s pointless.  Ig
31780 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20  nore it. */.    
31790 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
317a0 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
317b0 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20  INCT_UNIQUE;.   
317c0 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 64 65   }else if( pOrde
317d0 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
317e0 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44 45 52 20  /* Try to ORDER 
317f0 42 59 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  BY the result se
31800 74 20 74 6f 20 6d 61 6b 65 20 64 69 73 74 69 6e  t to make distin
31810 63 74 20 70 72 6f 63 65 73 73 69 6e 67 20 65 61  ct processing ea
31820 73 69 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 57  sier */.      pW
31830 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
31840 20 7c 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e   |= WHERE_DISTIN
31850 43 54 42 59 3b 0a 20 20 20 20 20 20 70 57 49 6e  CTBY;.      pWIn
31860 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  fo->pOrderBy = p
31870 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 20 20 7d  ResultSet;.    }
31880 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74  .  }..  /* Const
31890 72 75 63 74 20 74 68 65 20 57 68 65 72 65 4c 6f  ruct the WhereLo
318a0 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  op objects */.  
318b0 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
318c0 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  f,("*** Optimize
318d0 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29  r Start ***\n"))
318e0 3b 0a 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61  ;.  /* Display a
318f0 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
31900 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
31910 23 69 66 20 64 65 66 69 6e 65 64 28 57 48 45 52  #if defined(WHER
31920 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 20  ETRACE_ENABLED) 
31930 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
31940 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
31950 50 4c 41 49 4e 29 0a 20 20 69 66 28 20 73 71 6c  PLAIN).  if( sql
31960 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
31970 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 69 6e   0x100 ){.    in
31980 74 20 69 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t i;.    Vdbe *v
31990 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
319a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
319b0 6c 61 69 6e 42 65 67 69 6e 28 76 29 3b 0a 20 20  lainBegin(v);.  
319c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 57 4c    for(i=0; i<sWL
319d0 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  B.pWC->nTerm; i+
319e0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
319f0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 76  3ExplainPrintf(v
31a00 2c 20 22 23 25 2d 32 64 20 22 2c 20 69 29 3b 0a  , "#%-2d ", i);.
31a10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
31a20 6c 61 69 6e 50 75 73 68 28 76 29 3b 0a 20 20 20  lainPush(v);.   
31a30 20 20 20 77 68 65 72 65 45 78 70 6c 61 69 6e 54     whereExplainT
31a40 65 72 6d 28 76 2c 20 26 73 57 4c 42 2e 70 57 43  erm(v, &sWLB.pWC
31a50 2d 3e 61 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73  ->a[i]);.      s
31a60 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70  qlite3ExplainPop
31a70 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
31a80 65 33 45 78 70 6c 61 69 6e 4e 4c 28 76 29 3b 0a  e3ExplainNL(v);.
31a90 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
31aa0 33 45 78 70 6c 61 69 6e 46 69 6e 69 73 68 28 76  3ExplainFinish(v
31ab0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
31ac0 62 75 67 50 72 69 6e 74 66 28 22 25 73 22 2c 20  bugPrintf("%s", 
31ad0 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61  sqlite3VdbeExpla
31ae0 6e 61 74 69 6f 6e 28 76 29 29 3b 0a 20 20 7d 0a  nation(v));.  }.
31af0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6e 54 61  #endif.  if( nTa
31b00 62 4c 69 73 74 21 3d 31 20 7c 7c 20 77 68 65 72  bList!=1 || wher
31b10 65 53 68 6f 72 74 43 75 74 28 26 73 57 4c 42 29  eShortCut(&sWLB)
31b20 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
31b30 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28  whereLoopAddAll(
31b40 26 73 57 4c 42 29 3b 0a 20 20 20 20 69 66 28 20  &sWLB);.    if( 
31b50 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  rc ) goto whereB
31b60 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 0a 20 20  eginError;.  .  
31b70 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c    /* Display all
31b80 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
31b90 70 20 6f 62 6a 65 63 74 73 20 69 66 20 77 68 65  p objects if whe
31ba0 72 65 74 72 61 63 65 20 69 73 20 65 6e 61 62 6c  retrace is enabl
31bb0 65 64 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45  ed */.#ifdef WHE
31bc0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
31bd0 2f 2a 20 21 3d 30 20 2a 2f 0a 20 20 20 20 69 66  /* !=0 */.    if
31be0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
31bf0 61 63 65 20 29 7b 0a 20 20 20 20 20 20 57 68 65  ace ){.      Whe
31c00 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20  reLoop *p;.     
31c10 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 74   int i;.      st
31c20 61 74 69 63 20 63 68 61 72 20 7a 4c 61 62 65 6c  atic char zLabel
31c30 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38 39  [] = "0123456789
31c40 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
31c50 71 72 73 74 75 76 77 79 78 7a 22 0a 20 20 20 20  qrstuvwyxz".    
31c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c80 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
31c90 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a 22 3b  MNOPQRSTUVWYXZ";
31ca0 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 57 49  .      for(p=pWI
31cb0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30  nfo->pLoops, i=0
31cc0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c  ; p; p=p->pNextL
31cd0 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20  oop, i++){.     
31ce0 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62     p->cId = zLab
31cf0 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a 4c 61 62  el[i%sizeof(zLab
31d00 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20 20 77 68  el)];.        wh
31d10 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20  ereLoopPrint(p, 
31d20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 20  sWLB.pWC);.     
31d30 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
31d40 20 20 0a 20 20 20 20 77 68 65 72 65 50 61 74 68    .    wherePath
31d50 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 30  Solver(pWInfo, 0
31d60 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
31d70 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
31d80 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
31d90 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  or;.    if( pWIn
31da0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  fo->pOrderBy ){.
31db0 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
31dc0 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 70  Solver(pWInfo, p
31dd0 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31  WInfo->nRowOut+1
31de0 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 64 62  );.       if( db
31df0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
31e00 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
31e10 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Error;.    }.  }
31e20 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70  .  if( pWInfo->p
31e30 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 28 64  OrderBy==0 && (d
31e40 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
31e50 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 29 21  E_ReverseOrder)!
31e60 3d 30 20 29 7b 0a 20 20 20 20 20 70 57 49 6e 66  =0 ){.     pWInf
31e70 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 28 42 69  o->revMask = (Bi
31e80 74 6d 61 73 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a  tmask)(-1);.  }.
31e90 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
31ea0 72 72 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e  rr || NEVER(db->
31eb0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b  mallocFailed) ){
31ec0 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
31ed0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23  eginError;.  }.#
31ee0 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
31ef0 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 21 3d 30 20  _ENABLED /* !=0 
31f00 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
31f10 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20  WhereTrace ){.  
31f20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 73 71    int ii;.    sq
31f30 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
31f40 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20  ("---- Solution 
31f50 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e 66 6f  nRow=%d", pWInfo
31f60 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20  ->nRowOut);.    
31f70 69 66 28 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53  if( pWInfo->bOBS
31f80 61 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  at ){.      sqli
31f90 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
31fa0 20 4f 52 44 45 52 42 59 3d 30 78 25 6c 6c 78 22   ORDERBY=0x%llx"
31fb0 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73  , pWInfo->revMas
31fc0 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77  k);.    }.    sw
31fd0 69 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44  itch( pWInfo->eD
31fe0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
31ff0 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
32000 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20  INCT_UNIQUE: {. 
32010 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
32020 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
32030 54 49 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a  TINCT=unique");.
32040 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
32050 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
32060 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
32070 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20  _ORDERED: {.    
32080 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
32090 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
320a0 43 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20  CT=ordered");.  
320b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
320c0 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
320d0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
320e0 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20  NORDERED: {.    
320f0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
32100 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
32110 43 54 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a  CT=unordered");.
32120 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
32130 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
32140 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
32150 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66  ntf("\n");.    f
32160 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e  or(ii=0; ii<pWIn
32170 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b  fo->nLevel; ii++
32180 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  ){.      whereLo
32190 6f 70 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e  opPrint(pWInfo->
321a0 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57  a[ii].pWLoop, sW
321b0 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20  LB.pWC);.    }. 
321c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 41   }.#endif.  /* A
321d0 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74  ttempt to omit t
321e0 61 62 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 6a  ables from the j
321f0 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  oin that do not 
32200 65 66 66 65 63 74 20 74 68 65 20 72 65 73 75 6c  effect the resul
32210 74 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66  t */.  if( pWInf
32220 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20  o->nLevel>=2.   
32230 26 26 20 70 52 65 73 75 6c 74 53 65 74 21 3d 30  && pResultSet!=0
32240 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  .   && Optimizat
32250 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
32260 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f  QLITE_OmitNoopJo
32270 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 42 69 74  in).  ){.    Bit
32280 6d 61 73 6b 20 74 61 62 55 73 65 64 20 3d 20 65  mask tabUsed = e
32290 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
322a0 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 65 73  e(pMaskSet, pRes
322b0 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69 66 28  ultSet);.    if(
322c0 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 29   sWLB.pOrderBy )
322d0 20 74 61 62 55 73 65 64 20 7c 3d 20 65 78 70 72   tabUsed |= expr
322e0 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
322f0 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f  MaskSet, sWLB.pO
32300 72 64 65 72 42 79 29 3b 0a 20 20 20 20 77 68 69  rderBy);.    whi
32310 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  le( pWInfo->nLev
32320 65 6c 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 57  el>=2 ){.      W
32330 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
32340 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 4c   *pEnd;.      pL
32350 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b  oop = pWInfo->a[
32360 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31  pWInfo->nLevel-1
32370 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  ].pWLoop;.      
32380 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 70 54 61  if( (pWInfo->pTa
32390 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e  bList->a[pLoop->
323a0 69 54 61 62 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  iTab].jointype &
323b0 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62   JT_LEFT)==0 ) b
323c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
323d0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
323e0 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
323f0 54 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  T)==0.       && 
32400 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
32410 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d  & WHERE_ONEROW)=
32420 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
32430 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
32440 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 74 61   }.      if( (ta
32450 62 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d  bUsed & pLoop->m
32460 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 20 62 72  askSelf)!=0 ) br
32470 65 61 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64 20  eak;.      pEnd 
32480 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20  = sWLB.pWC->a + 
32490 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b  sWLB.pWC->nTerm;
324a0 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d  .      for(pTerm
324b0 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54  =sWLB.pWC->a; pT
324c0 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b  erm<pEnd; pTerm+
324d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
324e0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
324f0 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  l & pLoop->maskS
32500 65 6c 66 29 21 3d 30 0a 20 20 20 20 20 20 20 20  elf)!=0.        
32510 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
32520 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
32530 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
32540 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
32550 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
32560 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
32570 20 20 20 20 69 66 28 20 70 54 65 72 6d 3c 70 45      if( pTerm<pE
32580 6e 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  nd ) break;.    
32590 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
325a0 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c  fff, ("-> drop l
325b0 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73 65 64 5c  oop %c not used\
325c0 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29  n", pLoop->cId))
325d0 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ;.      pWInfo->
325e0 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20  nLevel--;.      
325f0 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20  nTabList--;.    
32600 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41  }.  }.  WHERETRA
32610 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20  CE(0xffff,("*** 
32620 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68  Optimizer Finish
32630 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70  ed ***\n"));.  p
32640 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e  WInfo->pParse->n
32650 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49  QueryLoop += pWI
32660 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20  nfo->nRowOut;.. 
32670 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65   /* If the calle
32680 72 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f  r is an UPDATE o
32690 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
326a0 6e 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65  nt that is reque
326b0 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73  sting.  ** to us
326c0 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67  e a one-pass alg
326d0 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e  orithm, determin
326e0 65 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70  e if this is app
326f0 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54  ropriate..  ** T
32700 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f  he one-pass algo
32710 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73  rithm only works
32720 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
32730 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 73 0a  ause constrains.
32740 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
32750 6e 74 20 74 6f 20 75 70 64 61 74 65 20 61 20 73  nt to update a s
32760 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a  ingle row..  */.
32770 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c    assert( (wctrl
32780 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
32790 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
327a0 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0 || pWInfo->nLe
327b0 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  vel==1 );.  if( 
327c0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
327d0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
327e0 52 45 44 29 21 3d 30 20 0a 20 20 20 26 26 20 28  RED)!=0 .   && (
327f0 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
32800 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
32810 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 20  HERE_ONEROW)!=0 
32820 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f  ){.    pWInfo->o
32830 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20 20  kOnePass = 1;.  
32840 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
32850 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54  TabList->a[0].pT
32860 61 62 29 20 29 7b 0a 20 20 20 20 20 20 70 57 49  ab) ){.      pWI
32870 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70  nfo->a[0].pWLoop
32880 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48  ->wsFlags &= ~WH
32890 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
328a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70    }.  }..  /* Op
328b0 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  en all tables in
328c0 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e   the pTabList an
328d0 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65  d any indices se
328e0 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20  lected for.  ** 
328f0 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20  searching those 
32900 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 6e  tables..  */.  n
32910 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d  otReady = ~(Bitm
32920 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d  ask)0;.  for(ii=
32930 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
32940 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  ->a; ii<nTabList
32950 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  ; ii++, pLevel++
32960 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
32970 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ab;     /* Table
32980 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20   to open */.    
32990 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
329a0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74   /* Index of dat
329b0 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
329c0 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a   table/index */.
329d0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
329e0 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
329f0 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d  m;..    pTabItem
32a00 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
32a10 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
32a20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 49      pTab = pTabI
32a30 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
32a40 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
32a50 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
32a60 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
32a70 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
32a80 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66  ->pWLoop;.    if
32a90 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
32aa0 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
32ab0 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53  )!=0 || pTab->pS
32ac0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f  elect ){.      /
32ad0 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
32ae0 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65      }else.#ifnde
32af0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
32b00 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
32b10 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
32b20 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
32b30 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
32b40 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
32b50 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20  *pVTab = (const 
32b60 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65  char *)sqlite3Ge
32b70 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
32b80 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75  );.      int iCu
32b90 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
32ba0 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c  ursor;.      sql
32bb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
32bc0 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72  , OP_VOpen, iCur
32bd0 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50  , 0, 0, pVTab, P
32be0 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c  4_VTAB);.    }el
32bf0 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  se if( IsVirtual
32c00 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
32c10 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* noop */.    }
32c20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
32c30 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
32c40 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
32c50 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20  ONLY)==0.       
32c60 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73    && (wctrlFlags
32c70 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50   & WHERE_OMIT_OP
32c80 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a  EN_CLOSE)==0 ){.
32c90 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f        int op = O
32ca0 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20  P_OpenRead;.    
32cb0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6f 6b    if( pWInfo->ok
32cc0 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20 20 20 20  OnePass ){.     
32cd0 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57     op = OP_OpenW
32ce0 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57  rite;.        pW
32cf0 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
32d00 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74 65 6d  ss[0] = pTabItem
32d10 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
32d20 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   };.      sqlite
32d30 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
32d40 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
32d50 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  rsor, iDb, pTab,
32d60 20 6f 70 29 3b 0a 20 20 20 20 20 20 61 73 73 65   op);.      asse
32d70 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  rt( pTabItem->iC
32d80 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69  ursor==pLevel->i
32d90 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20 20 20  TabCur );.      
32da0 74 65 73 74 63 61 73 65 28 20 21 70 57 49 6e 66  testcase( !pWInf
32db0 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20  o->okOnePass && 
32dc0 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d  pTab->nCol==BMS-
32dd0 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
32de0 61 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b  ase( !pWInfo->ok
32df0 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62 2d  OnePass && pTab-
32e00 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nCol==BMS );.  
32e10 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d      if( !pWInfo-
32e20 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54  >okOnePass && pT
32e30 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26 20  ab->nCol<BMS && 
32e40 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
32e50 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  {.        Bitmas
32e60 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  k b = pTabItem->
32e70 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20  colUsed;.       
32e80 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20   int n = 0;.    
32e90 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62      for(; b; b=b
32ea0 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  >>1, n++){}.    
32eb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
32ec0 68 61 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74  hangeP4(v, sqlit
32ed0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
32ee0 72 28 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20  r(v)-1, .       
32ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f00 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f       SQLITE_INT_
32f10 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e  TO_PTR(n), P4_IN
32f20 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73  T32);.        as
32f30 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e  sert( n<=pTab->n
32f40 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Col );.      }. 
32f50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32f60 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
32f70 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
32f80 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
32f90 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
32fa0 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
32fb0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
32fc0 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20  INDEXED ){.     
32fd0 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c   Index *pIx = pL
32fe0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
32ff0 64 65 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  dex;.      int i
33000 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20  IndexCur;.      
33010 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e  int op = OP_Open
33020 52 65 61 64 3b 0a 20 20 20 20 20 20 2f 2a 20 69  Read;.      /* i
33030 49 64 78 43 75 72 20 69 73 20 61 6c 77 61 79 73  IdxCur is always
33040 20 73 65 74 20 69 66 20 74 6f 20 61 20 70 6f 73   set if to a pos
33050 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 4f  itive value if O
33060 4e 45 50 41 53 53 20 69 73 20 70 6f 73 73 69 62  NEPASS is possib
33070 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
33080 72 74 28 20 69 49 64 78 43 75 72 21 3d 30 20 7c  rt( iIdxCur!=0 |
33090 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  | (pWInfo->wctrl
330a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
330b0 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
330c0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
330d0 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
330e0 20 29 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65   ){.        Inde
330f0 78 20 2a 70 4a 20 3d 20 70 54 61 62 49 74 65 6d  x *pJ = pTabItem
33100 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  ->pTab->pIndex;.
33110 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
33120 72 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20  r = iIdxCur;.   
33130 20 20 20 20 20 61 73 73 65 72 74 28 20 77 63 74       assert( wct
33140 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
33150 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20  ONEPASS_DESIRED 
33160 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
33170 28 20 41 4c 57 41 59 53 28 70 4a 29 20 26 26 20  ( ALWAYS(pJ) && 
33180 70 4a 21 3d 70 49 78 20 29 7b 0a 20 20 20 20 20  pJ!=pIx ){.     
33190 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 2b 2b       iIndexCur++
331a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4a 20 3d  ;.          pJ =
331b0 20 70 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20   pJ->pNext;.    
331c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 70      }.        op
331d0 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b   = OP_OpenWrite;
331e0 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
331f0 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d  >aiCurOnePass[1]
33200 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20   = iIndexCur;.  
33210 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 49      }else if( iI
33220 64 78 43 75 72 20 26 26 20 28 77 63 74 72 6c 46  dxCur && (wctrlF
33230 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
33240 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29  TABLE_ONLY)!=0 )
33250 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78  {.        iIndex
33260 43 75 72 20 3d 20 69 49 64 78 43 75 72 3b 0a 20  Cur = iIdxCur;. 
33270 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
33280 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20      iIndexCur = 
33290 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
332a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
332b0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
332c0 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20  iIndexCur;.     
332d0 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53   assert( pIx->pS
332e0 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
332f0 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73  hema );.      as
33300 73 65 72 74 28 20 69 49 6e 64 65 78 43 75 72 3e  sert( iIndexCur>
33310 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
33320 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
33330 20 6f 70 2c 20 69 49 6e 64 65 78 43 75 72 2c 20   op, iIndexCur, 
33340 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  pIx->tnum, iDb);
33350 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
33360 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
33370 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20  Parse, pIx);.   
33380 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
33390 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e  v, "%s", pIx->zN
333a0 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ame));.    }.   
333b0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
333c0 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
333d0 20 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65   iDb);.    notRe
333e0 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  ady &= ~getMask(
333f0 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
33400 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  t, pTabItem->iCu
33410 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57 49  rsor);.  }.  pWI
33420 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69  nfo->iTop = sqli
33430 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
33440 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d  dr(v);.  if( db-
33450 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
33460 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
33470 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  rror;..  /* Gene
33480 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f  rate the code to
33490 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20   do the search. 
334a0 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20   Each iteration 
334b0 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20  of the for.  ** 
334c0 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72  loop below gener
334d0 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20  ates code for a 
334e0 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f  single nested lo
334f0 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a  op of the VM.  *
33500 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a  * program..  */.
33510 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42    notReady = ~(B
33520 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28  itmask)0;.  for(
33530 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73  ii=0; ii<nTabLis
33540 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 70 4c  t; ii++){.    pL
33550 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
33560 61 5b 69 69 5d 3b 0a 23 69 66 6e 64 65 66 20 53  a[ii];.#ifndef S
33570 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
33580 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69  ATIC_INDEX.    i
33590 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  f( (pLevel->pWLo
335a0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
335b0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
335c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
335d0 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e  tructAutomaticIn
335e0 64 65 78 28 70 50 61 72 73 65 2c 20 26 70 57 49  dex(pParse, &pWI
335f0 6e 66 6f 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20  nfo->sWC,.      
33600 20 20 20 20 20 20 20 20 20 20 26 70 54 61 62 4c            &pTabL
33610 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
33620 46 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c  From], notReady,
33630 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20   pLevel);.      
33640 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
33650 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
33660 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20  eBeginError;.   
33670 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 65 78   }.#endif.    ex
33680 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 70 50 61  plainOneScan(pPa
33690 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
336a0 4c 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65  Level, ii, pLeve
336b0 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46  l->iFrom, wctrlF
336c0 6c 61 67 73 29 3b 0a 20 20 20 20 70 4c 65 76 65  lags);.    pLeve
336d0 6c 2d 3e 61 64 64 72 42 6f 64 79 20 3d 20 73 71  l->addrBody = sq
336e0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
336f0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74  Addr(v);.    not
33700 52 65 61 64 79 20 3d 20 63 6f 64 65 4f 6e 65 4c  Ready = codeOneL
33710 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c  oopStart(pWInfo,
33720 20 69 69 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a   ii, notReady);.
33730 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e      pWInfo->iCon
33740 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e  tinue = pLevel->
33750 61 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 20  addrCont;.  }.. 
33760 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 72   /* Done. */.  r
33770 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20  eturn pWInfo;.. 
33780 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
33790 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
337a0 0a 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72  .whereBeginError
337b0 3a 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29  :.  if( pWInfo )
337c0 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51  {.    pParse->nQ
337d0 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66  ueryLoop = pWInf
337e0 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  o->savedNQueryLo
337f0 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 49 6e 66  op;.    whereInf
33800 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  oFree(db, pWInfo
33810 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
33820 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
33830 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  rate the end of 
33840 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20  the WHERE loop. 
33850 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e   See comments on
33860 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72   .** sqlite3Wher
33870 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64  eBegin() for add
33880 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
33890 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
338a0 69 74 65 33 57 68 65 72 65 45 6e 64 28 57 68 65  ite3WhereEnd(Whe
338b0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
338c0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
338d0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
338e0 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  e;.  Vdbe *v = p
338f0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
33900 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65  int i;.  WhereLe
33910 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 57  vel *pLevel;.  W
33920 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
33930 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
33940 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
33950 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  TabList;.  sqlit
33960 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
33970 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  >db;..  /* Gener
33980 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  ate loop termina
33990 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  tion code..  */.
339a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
339b0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
339c0 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d  .  for(i=pWInfo-
339d0 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b  >nLevel-1; i>=0;
339e0 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65   i--){.    pLeve
339f0 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
33a00 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  ];.    pLoop = p
33a10 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
33a20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
33a30 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
33a40 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b  evel->addrCont);
33a50 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
33a60 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  >op!=OP_Noop ){.
33a70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
33a80 65 41 64 64 4f 70 32 28 76 2c 20 70 4c 65 76 65  eAddOp2(v, pLeve
33a90 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70  l->op, pLevel->p
33aa0 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a  1, pLevel->p2);.
33ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
33ac0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65  eChangeP5(v, pLe
33ad0 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 7d 0a  vel->p5);.    }.
33ae0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
33af0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
33b00 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c  N_ABLE && pLevel
33b10 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a  ->u.in.nIn>0 ){.
33b20 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c        struct InL
33b30 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20  oop *pIn;.      
33b40 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c  int j;.      sql
33b50 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
33b60 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
33b70 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
33b80 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e  for(j=pLevel->u.
33b90 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65  in.nIn, pIn=&pLe
33ba0 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
33bb0 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d  p[j-1]; j>0; j--
33bc0 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20  , pIn--){.      
33bd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
33be0 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64  pHere(v, pIn->ad
33bf0 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20  drInTop+1);.    
33c00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
33c10 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e 65 45  ddOp2(v, pIn->eE
33c20 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69  ndLoopOp, pIn->i
33c30 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  Cur, pIn->addrIn
33c40 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Top);.        sq
33c50 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
33c60 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  e(v, pIn->addrIn
33c70 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  Top-1);.      }.
33c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
33c90 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e  ree(db, pLevel->
33ca0 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20  u.in.aInLoop);. 
33cb0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
33cc0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
33cd0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
33ce0 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  Brk);.    if( pL
33cf0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
33d00 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  ){.      int add
33d10 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  r;.      addr = 
33d20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
33d30 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70  1(v, OP_IfPos, p
33d40 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
33d50 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
33d60 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
33d70 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
33d80 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  Y)==0.          
33d90 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   || (pLoop->wsFl
33da0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
33db0 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  XED)!=0 );.     
33dc0 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
33dd0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
33de0 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  _ONLY)==0 ){.   
33df0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33e00 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
33e10 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e  lRow, pTabList->
33e20 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  a[i].iCursor);. 
33e30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
33e40 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
33e50 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
33e60 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
33e70 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
33e80 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76  OP_NullRow, pLev
33e90 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20  el->iIdxCur);.  
33ea0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
33eb0 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52  pLevel->op==OP_R
33ec0 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20  eturn ){.       
33ed0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33ee0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
33ef0 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76  pLevel->p1, pLev
33f00 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a  el->addrFirst);.
33f10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33f20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33f30 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
33f40 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  o, 0, pLevel->ad
33f50 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  drFirst);.      
33f60 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
33f70 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
33f80 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ddr);.    }.    
33f90 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
33fa0 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 4c  (v, "End WHERE-L
33fb0 6f 6f 70 20 25 64 3a 20 25 73 22 2c 20 69 2c 0a  oop %d: %s", i,.
33fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33fd0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61       pWInfo->pTa
33fe0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
33ff0 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e  >iFrom].pTab->zN
34000 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ame));.  }..  /*
34010 20 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69   The "break" poi
34020 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74  nt is here, just
34030 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
34040 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e   the outer loop.
34050 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20  .  ** Set it..  
34060 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
34070 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
34080 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b  pWInfo->iBreak);
34090 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ..  assert( pWIn
340a0 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61 62  fo->nLevel<=pTab
340b0 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
340c0 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  for(i=0, pLevel=
340d0 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49  pWInfo->a; i<pWI
340e0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b  nfo->nLevel; i++
340f0 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
34100 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30   Index *pIdx = 0
34110 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
34120 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
34130 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
34140 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
34150 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ];.    Table *pT
34160 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70  ab = pTabItem->p
34170 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
34180 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
34190 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
341a0 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 20  pWLoop;..    /* 
341b0 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65  Close all of the
341c0 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 65   cursors that we
341d0 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c  re opened by sql
341e0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a  ite3WhereBegin..
341f0 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64      ** Except, d
34200 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 63 75 72 73  o not close curs
34210 6f 72 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ors that will be
34220 20 72 65 75 73 65 64 20 62 79 20 74 68 65 20 4f   reused by the O
34230 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20  R optimization. 
34240 20 20 20 2a 2a 20 28 57 48 45 52 45 5f 4f 4d 49     ** (WHERE_OMI
34250 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 2e 20 20  T_OPEN_CLOSE).  
34260 41 6e 64 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65  And do not close
34270 20 74 68 65 20 4f 50 5f 4f 70 65 6e 57 72 69 74   the OP_OpenWrit
34280 65 20 63 75 72 73 6f 72 73 0a 20 20 20 20 2a 2a  e cursors.    **
34290 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 65   created for the
342a0 20 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a   ONEPASS optimiz
342b0 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
342c0 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
342d0 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
342e0 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26  eral)==0.     &&
342f0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
34300 30 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66  0.     && (pWInf
34310 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
34320 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f  WHERE_OMIT_OPEN_
34330 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b  CLOSE)==0.    ){
34340 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20  .      int ws = 
34350 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  pLoop->wsFlags;.
34360 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66        if( !pWInf
34370 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20  o->okOnePass && 
34380 28 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  (ws & WHERE_IDX_
34390 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
343a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
343b0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
343c0 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
343d0 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
343e0 20 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57       if( (ws & W
343f0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
34400 0a 20 20 20 20 20 20 20 26 26 20 28 77 73 20 26  .       && (ws &
34410 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52   (WHERE_IPK|WHER
34420 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 29 3d 3d  E_AUTO_INDEX))==
34430 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 4c 65  0 .       && pLe
34440 76 65 6c 2d 3e 69 49 64 78 43 75 72 21 3d 70 57  vel->iIdxCur!=pW
34450 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
34460 73 73 5b 31 5d 0a 20 20 20 20 20 20 29 7b 0a 20  ss[1].      ){. 
34470 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
34480 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
34490 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lose, pLevel->iI
344a0 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a  dxCur);.      }.
344b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
344c0 20 74 68 69 73 20 73 63 61 6e 20 75 73 65 73 20   this scan uses 
344d0 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 56  an index, make V
344e0 44 42 45 20 63 6f 64 65 20 73 75 62 73 74 69 74  DBE code substit
344f0 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64  utions to read d
34500 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  ata.    ** from 
34510 74 68 65 20 69 6e 64 65 78 20 69 6e 73 74 65 61  the index instea
34520 64 20 6f 66 20 66 72 6f 6d 20 74 68 65 20 74 61  d of from the ta
34530 62 6c 65 20 77 68 65 72 65 20 70 6f 73 73 69 62  ble where possib
34540 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63 61 73  le.  In some cas
34550 65 73 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 6f  es.    ** this o
34560 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72 65 76  ptimization prev
34570 65 6e 74 73 20 74 68 65 20 74 61 62 6c 65 20 66  ents the table f
34580 72 6f 6d 20 65 76 65 72 20 62 65 69 6e 67 20 72  rom ever being r
34590 65 61 64 2c 20 77 68 69 63 68 20 63 61 6e 0a 20  ead, which can. 
345a0 20 20 20 2a 2a 20 79 69 65 6c 64 20 61 20 73 69     ** yield a si
345b0 67 6e 69 66 69 63 61 6e 74 20 70 65 72 66 6f 72  gnificant perfor
345c0 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20 20  mance boost..   
345d0 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c   ** .    ** Call
345e0 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65  s to the code ge
345f0 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65  nerator in betwe
34600 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  en sqlite3WhereB
34610 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20  egin and.    ** 
34620 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20  sqlite3WhereEnd 
34630 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65  will have create
34640 64 20 63 6f 64 65 20 74 68 61 74 20 72 65 66 65  d code that refe
34650 72 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65  rences the table
34660 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
34670 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61  .  This loop sca
34680 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65  ns all that code
34690 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63   looking for opc
346a0 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  odes.    ** that
346b0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74   reference the t
346c0 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74  able and convert
346d0 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f  s them into opco
346e0 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  des that.    ** 
346f0 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e  reference the in
34700 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  dex..    */.    
34710 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
34720 67 73 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45  gs & (WHERE_INDE
34730 58 45 44 7c 57 48 45 52 45 5f 49 44 58 5f 4f 4e  XED|WHERE_IDX_ON
34740 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64  LY) ){.      pId
34750 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
34760 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d  ee.pIndex;.    }
34770 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  else if( pLoop->
34780 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
34790 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20  MULTI_OR ){.    
347a0 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d    pIdx = pLevel-
347b0 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20 20 20  >u.pCovidx;.    
347c0 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 26  }.    if( pIdx &
347d0 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
347e0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  led ){.      int
347f0 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20   k, last;.      
34800 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20  VdbeOp *pOp;..  
34810 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74      last = sqlit
34820 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
34830 72 28 76 29 3b 0a 20 20 20 20 20 20 6b 20 3d 20  r(v);.      k = 
34840 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79  pLevel->addrBody
34850 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71  ;.      pOp = sq
34860 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
34870 2c 20 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  , k);.      for(
34880 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70  ; k<last; k++, p
34890 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Op++){.        i
348a0 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76  f( pOp->p1!=pLev
348b0 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f  el->iTabCur ) co
348c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
348d0 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
348e0 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  =OP_Column ){.  
348f0 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
34900 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
34910 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
34920 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b  >pTable==pTab );
34930 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
34940 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
34950 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e  {.            In
34960 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74  dex *pPk = sqlit
34970 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
34980 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  x(pTab);.       
34990 20 20 20 20 20 78 20 3d 20 70 50 6b 2d 3e 61 69       x = pPk->ai
349a0 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20  Column[x];.     
349b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
349c0 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75   x = sqlite3Colu
349d0 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20  mnOfIndex(pIdx, 
349e0 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  x);.          if
349f0 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( x>=0 ){.      
34a00 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
34a10 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  x;.            p
34a20 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d  Op->p1 = pLevel-
34a30 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
34a40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
34a50 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
34a60 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
34a70 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20  IDX_ONLY)==0 || 
34a80 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  x>=0 );.        
34a90 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
34aa0 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20  pcode==OP_Rowid 
34ab0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
34ac0 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
34ad0 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
34ae0 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
34af0 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20  OP_IdxRowid;.   
34b00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
34b10 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
34b20 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a  inal cleanup.  *
34b30 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  /.  pParse->nQue
34b40 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  ryLoop = pWInfo-
34b50 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
34b60 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65  ;.  whereInfoFre
34b70 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
34b80 20 72 65 74 75 72 6e 3b 0a 7d 0a                  return;.}.