/ Hex Artifact Content
Login

Artifact 9d0b21b65b3d1c9f923b5c6bd0ba250dcd16b645:


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 20 73 63 61 6e 2e 0a 2a 2a 0a   index scan..**.
151f0 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
15200 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74  consider table t
15210 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77  1(a,b,c,d,e,f) w
15220 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62  ith index i1(a,b
15230 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ,c)..** Suppose 
15240 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
15250 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20   is this:  a==5 
15260 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29  AND b IN (1,2,3)
15270 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31   AND c>5 AND c<1
15280 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68  0.** The index h
15290 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68  as as many as th
152a0 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ree equality con
152b0 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e  straints, but in
152c0 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65   this.** example
152d0 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20  , the third "c" 
152e0 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71  value is an ineq
152f0 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79  uality.  So only
15300 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61   two .** constra
15310 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20  ints are coded. 
15320 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
15330 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  ll generate code
15340 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20   to evaluate.** 
15350 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31  a==5 and b IN (1
15360 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72  ,2,3).  The curr
15370 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61  ent values for a
15380 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73   and b will be s
15390 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73  tored.** in cons
153a0 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
153b0 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  s and the index 
153c0 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65 67  of the first reg
153d0 69 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65  ister is returne
153e0 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  d..**.** In the 
153f0 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45  example above nE
15400 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20  q==2.  But this 
15410 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  subroutine works
15420 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a   for any value.*
15430 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69  * of nEq includi
15440 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30  ng 0.  If nEq==0
15450 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
15460 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70  s nearly a no-op
15470 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68  ..** The only th
15480 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61  ing it does is a
15490 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76  llocate the pLev
154a0 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20  el->iMem memory 
154b0 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70  cell and.** comp
154c0 75 74 65 20 74 68 65 20 61 66 66 69 6e 69 74 79  ute the affinity
154d0 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
154e0 68 65 20 6e 45 78 74 72 61 52 65 67 20 70 61 72  he nExtraReg par
154f0 61 6d 65 74 65 72 20 69 73 20 30 20 6f 72 20 31  ameter is 0 or 1
15500 2e 20 20 49 74 20 69 73 20 30 20 69 66 20 61 6c  .  It is 0 if al
15510 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  l WHERE clause c
15520 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 61 72  onstraints.** ar
15530 65 20 3d 3d 20 6f 72 20 49 4e 20 61 6e 64 20 61  e == or IN and a
15540 72 65 20 63 6f 76 65 72 65 64 20 62 79 20 74 68  re covered by th
15550 65 20 6e 45 71 2e 20 20 6e 45 78 74 72 61 52 65  e nEq.  nExtraRe
15560 67 20 69 73 20 31 20 69 66 20 74 68 65 72 65 20  g is 1 if there 
15570 69 73 0a 2a 2a 20 61 6e 20 69 6e 65 71 75 61 6c  is.** an inequal
15580 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  ity constraint (
15590 73 75 63 68 20 61 73 20 74 68 65 20 22 63 3e 3d  such as the "c>=
155a0 35 20 41 4e 44 20 63 3c 31 30 22 20 69 6e 20 74  5 AND c<10" in t
155b0 68 65 20 65 78 61 6d 70 6c 65 29 20 74 68 61 74  he example) that
155c0 0a 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72  .** occurs after
155d0 20 74 68 65 20 6e 45 71 20 71 75 61 6c 69 74 79   the nEq quality
155e0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a   constraints..**
155f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15600 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 72 61 6e   allocates a ran
15610 67 65 20 6f 66 20 6e 45 71 2b 6e 45 78 74 72 61  ge of nEq+nExtra
15620 52 65 67 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  Reg memory cells
15630 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20   and returns.** 
15640 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
15650 20 66 69 72 73 74 20 6d 65 6d 6f 72 79 20 63 65   first memory ce
15660 6c 6c 20 69 6e 20 74 68 61 74 20 72 61 6e 67 65  ll in that range
15670 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a  . The code that.
15680 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  ** calls this ro
15690 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74  utine will use t
156a0 68 61 74 20 6d 65 6d 6f 72 79 20 72 61 6e 67 65  hat memory range
156b0 20 74 6f 20 73 74 6f 72 65 20 6b 65 79 73 20 66   to store keys f
156c0 6f 72 0a 2a 2a 20 73 74 61 72 74 20 61 6e 64 20  or.** start and 
156d0 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64  termination cond
156e0 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f  itions of the lo
156f0 6f 70 2e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65  op..** key value
15700 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49   of the loop.  I
15710 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e  f one or more IN
15720 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61   operators appea
15730 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  r, then.** this 
15740 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65  routine allocate
15750 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  s an additional 
15760 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  nEq memory cells
15770 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   for internal.**
15780 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f   use..**.** Befo
15790 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
157a0 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f 20 70  zAff is set to p
157b0 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
157c0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a   containing a.**
157d0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c   copy of the col
157e0 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72  umn affinity str
157f0 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ing of the index
15800 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
15810 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  .** sqlite3DbMal
15820 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65  loc(). Except, e
15830 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f  ntries in the co
15840 70 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  py of the string
15850 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
15860 69 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ith equality con
15870 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 75 73  straints that us
15880 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20  e NONE affinity 
15890 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51  are set to.** SQ
158a0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54  LITE_AFF_NONE. T
158b0 68 69 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77  his is to deal w
158c0 69 74 68 20 53 51 4c 20 73 75 63 68 20 61 73 20  ith SQL such as 
158d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
158e0 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41  *.**   CREATE TA
158f0 42 4c 45 20 74 31 28 61 20 54 45 58 54 20 50 52  BLE t1(a TEXT PR
15900 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a  IMARY KEY, b);.*
15910 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46  *   SELECT ... F
15920 52 4f 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31  ROM t1 AS t2, t1
15930 20 57 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32   WHERE t1.a = t2
15940 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  .b;.**.** In the
15950 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20   example above, 
15960 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28  the index on t1(
15970 61 29 20 68 61 73 20 54 45 58 54 20 61 66 66 69  a) has TEXT affi
15980 6e 69 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a  nity. But since.
15990 2a 2a 20 74 68 65 20 72 69 67 68 74 20 68 61 6e  ** the right han
159a0 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 65 71  d side of the eq
159b0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
159c0 74 20 28 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e  t (t2.b) has NON
159d0 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e  E affinity,.** n
159e0 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f  o conversion sho
159f0 75 6c 64 20 62 65 20 61 74 74 65 6d 70 74 65 64  uld be attempted
15a00 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20   before using a 
15a10 74 32 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61  t2.b value as pa
15a20 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74  rt of.** a key t
15a30 6f 20 73 65 61 72 63 68 20 74 68 65 20 69 6e 64  o search the ind
15a40 65 78 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69  ex. Hence the fi
15a50 72 73 74 20 62 79 74 65 20 69 6e 20 74 68 65 20  rst byte in the 
15a60 72 65 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74  returned affinit
15a70 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74  y.** string in t
15a80 68 69 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c  his example woul
15a90 64 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49  d be set to SQLI
15aa0 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a  TE_AFF_NONE..*/.
15ab0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41  static int codeA
15ac0 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28  llEqualityTerms(
15ad0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
15ae0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
15af0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
15b00 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
15b10 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20  vel,   /* Which 
15b20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
15b30 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63  he FROM we are c
15b40 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62  oding */.  int b
15b50 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rev,            
15b60 20 2f 2a 20 52 65 76 65 72 73 65 20 74 68 65 20   /* Reverse the 
15b70 6f 72 64 65 72 20 6f 66 20 49 4e 20 6f 70 65 72  order of IN oper
15b80 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  ators */.  int n
15b90 45 78 74 72 61 52 65 67 2c 20 20 20 20 20 20 20  ExtraReg,       
15ba0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
15bb0 74 72 61 20 72 65 67 69 73 74 65 72 73 20 74 6f  tra registers to
15bc0 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63   allocate */.  c
15bd0 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20 20 20  har **pzAff     
15be0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74       /* OUT: Set
15bf0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66 66   to point to aff
15c00 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a  inity string */.
15c10 29 7b 0a 20 20 75 31 36 20 6e 45 71 3b 20 20 20  ){.  u16 nEq;   
15c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c30 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
15c40 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e   of == or IN con
15c50 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65  straints to code
15c60 20 2a 2f 0a 20 20 75 31 36 20 6e 53 6b 69 70 3b   */.  u16 nSkip;
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c80 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15c90 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
15ca0 6e 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20  ns to skip */.  
15cb0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
15cc0 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
15cd0 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f   The vm under co
15ce0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
15cf0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
15d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15d10 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   The index being
15d20 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c   used for this l
15d30 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  oop */.  WhereTe
15d40 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
15d50 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
15d60 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  le constraint te
15d70 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  rm */.  WhereLoo
15d80 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
15d90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
15da0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
15db0 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dd0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
15de0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
15df0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
15e00 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
15e10 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ster */.  int nR
15e20 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
15e30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
15e40 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  r of registers t
15e50 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
15e60 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20  char *zAff;     
15e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15e80 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   Affinity string
15e90 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20   to return */.. 
15ea0 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20   /* This module 
15eb0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f  is only called o
15ec0 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68  n query plans th
15ed0 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e  at use an index.
15ee0 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c   */.  pLoop = pL
15ef0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
15f00 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
15f10 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
15f20 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
15f30 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f   );.  nEq = pLoo
15f40 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
15f50 20 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d    nSkip = pLoop-
15f60 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3b 0a  >u.btree.nSkip;.
15f70 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
15f80 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
15f90 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
15fa0 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  0 );..  /* Figur
15fb0 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d  e out how many m
15fc0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77  emory cells we w
15fd0 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c  ill need then al
15fe0 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a  locate them..  *
15ff0 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50  /.  regBase = pP
16000 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
16010 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e    nReg = pLoop->
16020 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45  u.btree.nEq + nE
16030 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73  xtraReg;.  pPars
16040 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
16050 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74  ..  zAff = sqlit
16060 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73  e3DbStrDup(pPars
16070 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33 49 6e  e->db, sqlite3In
16080 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76  dexAffinityStr(v
16090 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66 28 20  , pIdx));.  if( 
160a0 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70 50 61  !zAff ){.    pPa
160b0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
160c0 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a  ailed = 1;.  }..
160d0 20 20 69 66 28 20 6e 53 6b 69 70 20 29 7b 0a 20    if( nSkip ){. 
160e0 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 3d     int iIdxCur =
160f0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
16100 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16110 65 41 64 64 4f 70 31 28 76 2c 20 28 62 52 65 76  eAddOp1(v, (bRev
16120 3f 4f 50 5f 4c 61 73 74 3a 4f 50 5f 52 65 77 69  ?OP_Last:OP_Rewi
16130 6e 64 29 2c 20 69 49 64 78 43 75 72 29 3b 0a 20  nd), iIdxCur);. 
16140 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
16150 76 2c 20 22 62 65 67 69 6e 20 73 6b 69 70 2d 73  v, "begin skip-s
16160 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 49 64 78  can on %s", pIdx
16170 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 6a  ->zName));.    j
16180 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
16190 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
161a0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  ;.    pLevel->ad
161b0 64 72 53 6b 69 70 20 3d 20 73 71 6c 69 74 65 33  drSkip = sqlite3
161c0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
161d0 20 28 62 52 65 76 3f 4f 50 5f 53 65 65 6b 4c 74   (bRev?OP_SeekLt
161e0 3a 4f 50 5f 53 65 65 6b 47 74 29 2c 0a 20 20 20  :OP_SeekGt),.   
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16200 20 20 20 20 20 20 20 20 20 69 49 64 78 43 75 72           iIdxCur
16210 2c 20 30 2c 20 72 65 67 42 61 73 65 2c 20 6e 53  , 0, regBase, nS
16220 6b 69 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  kip);.    sqlite
16230 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
16240 20 6a 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30   j);.    for(j=0
16250 3b 20 6a 3c 6e 53 6b 69 70 3b 20 6a 2b 2b 29 7b  ; j<nSkip; j++){
16260 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16270 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
16280 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20  olumn, iIdxCur, 
16290 6a 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  j, regBase+j);. 
162a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
162b0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d  x->aiColumn[j]>=
162c0 30 20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  0 );.      VdbeC
162d0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
162e0 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
162f0 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75  Col[pIdx->aiColu
16300 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 29 29 3b 0a  mn[j]].zName));.
16310 20 20 20 20 7d 0a 20 20 7d 20 20 20 20 0a 0a 20      }.  }    .. 
16320 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
16330 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
16340 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  aints.  */.  ass
16350 65 72 74 28 20 7a 41 66 66 3d 3d 30 20 7c 7c 20  ert( zAff==0 || 
16360 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 66 66  (int)strlen(zAff
16370 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28  )>=nEq );.  for(
16380 6a 3d 6e 53 6b 69 70 3b 20 6a 3c 6e 45 71 3b 20  j=nSkip; j<nEq; 
16390 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31  j++){.    int r1
163a0 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c  ;.    pTerm = pL
163b0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a  oop->aLTerm[j];.
163c0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
163d0 6d 21 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54  m!=0 );.    /* T
163e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
163f0 74 63 61 73 65 20 69 73 20 74 72 75 65 20 66 6f  tcase is true fo
16400 72 20 69 6e 64 69 63 65 73 20 77 69 74 68 20 72  r indices with r
16410 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73  edundant columns
16420 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20 43 52  . .    ** Ex: CR
16430 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
16440 20 74 31 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45   t1(a,b,a); SELE
16450 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
16460 52 45 20 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20  RE a=0 AND b=0; 
16470 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  */.    testcase(
16480 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
16490 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d   & TERM_CODED)!=
164a0 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
164b0 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
164c0 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
164d0 20 29 3b 0a 20 20 20 20 72 31 20 3d 20 63 6f 64   );.    r1 = cod
164e0 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
164f0 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65  arse, pTerm, pLe
16500 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 72 65  vel, j, bRev, re
16510 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66  gBase+j);.    if
16520 28 20 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20  ( r1!=regBase+j 
16530 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65  ){.      if( nRe
16540 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  g==1 ){.        
16550 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
16560 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
16570 67 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  gBase);.        
16580 72 65 67 42 61 73 65 20 3d 20 72 31 3b 0a 20 20  regBase = r1;.  
16590 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
165a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
165b0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
165c0 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b 6a 29  , r1, regBase+j)
165d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
165e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
165f0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
16600 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
16610 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
16620 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
16630 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66 28 20  O_IN );.    if( 
16640 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
16650 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57  r & (WO_ISNULL|W
16660 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20  O_IN))==0 ){.   
16670 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
16680 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  = pTerm->pExpr->
16690 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71  pRight;.      sq
166a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e  lite3ExprCodeIsN
166b0 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68  ullJump(v, pRigh
166c0 74 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c  t, regBase+j, pL
166d0 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
166e0 20 20 20 20 20 20 69 66 28 20 7a 41 66 66 20 29        if( zAff )
166f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
16700 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
16710 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 41 66  nity(pRight, zAf
16720 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46  f[j])==SQLITE_AF
16730 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  F_NONE ){.      
16740 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51      zAff[j] = SQ
16750 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
16760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16770 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
16780 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
16790 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 41  hange(pRight, zA
167a0 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20  ff[j]) ){.      
167b0 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51      zAff[j] = SQ
167c0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
167d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
167e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a  .    }.  }.  *pz
167f0 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65  Aff = zAff;.  re
16800 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a  turn regBase;.}.
16810 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16820 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
16830 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
16840 69 73 20 61 20 68 65 6c 70 65 72 20 66 6f 72 20  is a helper for 
16850 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
16860 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20  e() below.**.** 
16870 70 53 74 72 20 68 6f 6c 64 73 20 74 68 65 20 74  pStr holds the t
16880 65 78 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  ext of an expres
16890 73 69 6f 6e 20 74 68 61 74 20 77 65 20 61 72 65  sion that we are
168a0 20 62 75 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65   building up one
168b0 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69   term.** at a ti
168c0 6d 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  me.  This routin
168d0 65 20 61 64 64 73 20 61 20 6e 65 77 20 74 65 72  e adds a new ter
168e0 6d 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  m to the end of 
168f0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  the expression..
16900 2a 2a 20 54 65 72 6d 73 20 61 72 65 20 73 65 70  ** Terms are sep
16910 61 72 61 74 65 64 20 62 79 20 41 4e 44 20 73 6f  arated by AND so
16920 20 61 64 64 20 74 68 65 20 22 41 4e 44 22 20 74   add the "AND" t
16930 65 78 74 20 66 6f 72 20 73 65 63 6f 6e 64 20 61  ext for second a
16940 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  nd subsequent.**
16950 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a   terms only..*/.
16960 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
16970 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 0a 20  ainAppendTerm(. 
16980 20 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72 2c   StrAccum *pStr,
16990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
169a0 54 68 65 20 74 65 78 74 20 65 78 70 72 65 73 73  The text express
169b0 69 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c 74 20  ion being built 
169c0 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20  */.  int iTerm, 
169d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169e0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 69   /* Index of thi
169f0 73 20 74 65 72 6d 2e 20 20 46 69 72 73 74 20 69  s term.  First i
16a00 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73  s zero */.  cons
16a10 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c  t char *zColumn,
16a20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
16a30 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f  of the column */
16a40 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
16a50 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  Op             /
16a60 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
16a70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69  erator */.){.  i
16a80 66 28 20 69 54 65 72 6d 20 29 20 73 71 6c 69 74  f( iTerm ) sqlit
16a90 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
16aa0 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22 2c 20  (pStr, " AND ", 
16ab0 35 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  5);.  sqlite3Str
16ac0 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
16ad0 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31 29 3b 0a  , zColumn, -1);.
16ae0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
16af0 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f  mAppend(pStr, zO
16b00 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  p, 1);.  sqlite3
16b10 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
16b20 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a  Str, "?", 1);.}.
16b30 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
16b40 70 4c 65 76 65 6c 20 64 65 73 63 72 69 62 65 73  pLevel describes
16b50 20 61 20 73 74 72 61 74 65 67 79 20 66 6f 72 20   a strategy for 
16b60 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70  scanning table p
16b70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  Tab. This .** fu
16b80 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
16b90 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
16ba0 72 69 6e 67 20 62 75 66 66 65 72 20 63 6f 6e 74  ring buffer cont
16bb0 61 69 6e 69 6e 67 20 61 20 64 65 73 63 72 69 70  aining a descrip
16bc0 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 73  tion.** of the s
16bd0 75 62 73 65 74 20 6f 66 20 74 61 62 6c 65 20 72  ubset of table r
16be0 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79 20 74  ows scanned by t
16bf0 68 65 20 73 74 72 61 74 65 67 79 20 69 6e 20 74  he strategy in t
16c00 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a  he form of an.**
16c10 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e   SQL expression.
16c20 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72 6f 77 73   Or, if all rows
16c30 20 61 72 65 20 73 63 61 6e 6e 65 64 2c 20 4e 55   are scanned, NU
16c40 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
16c50 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
16c60 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 3a  e, if the query:
16c70 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
16c80 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
16c90 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a  a=1 AND b>2;.**.
16ca0 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64 20 74 68  ** is run and th
16cb0 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ere is an index 
16cc0 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 6e 20  on (a, b), then 
16cd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
16ce0 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e  turns a.** strin
16cf0 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a  g similar to:.**
16d00 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44 20 62  .**   "a=? AND b
16d10 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  >?".**.** The re
16d20 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 20 70  turned pointer p
16d30 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f 72 79 20  oints to memory 
16d40 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
16d50 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e  lite3DbMalloc().
16d60 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65  .** It is the re
16d70 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
16d80 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 66 72  the caller to fr
16d90 65 65 20 74 68 65 20 62 75 66 66 65 72 20 77 68  ee the buffer wh
16da0 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c  en it is.** no l
16db0 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a  onger required..
16dc0 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
16dd0 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
16de0 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
16df0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c  hereLoop *pLoop,
16e00 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20   Table *pTab){. 
16e10 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
16e20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
16e30 70 49 6e 64 65 78 3b 0a 20 20 75 31 36 20 6e 45  pIndex;.  u16 nE
16e40 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
16e50 65 65 2e 6e 45 71 3b 0a 20 20 75 31 36 20 6e 53  ee.nEq;.  u16 nS
16e60 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  kip = pLoop->u.b
16e70 74 72 65 65 2e 6e 53 6b 69 70 3b 0a 20 20 69 6e  tree.nSkip;.  in
16e80 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e  t i, j;.  Column
16e90 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61   *aCol = pTab->a
16ea0 43 6f 6c 3b 0a 20 20 69 31 36 20 2a 61 69 43 6f  Col;.  i16 *aiCo
16eb0 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61  lumn = pIndex->a
16ec0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63  iColumn;.  StrAc
16ed0 63 75 6d 20 74 78 74 3b 0a 0a 20 20 69 66 28 20  cum txt;..  if( 
16ee0 6e 45 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70  nEq==0 && (pLoop
16ef0 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
16f00 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45  RE_BTM_LIMIT|WHE
16f10 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d  RE_TOP_LIMIT))==
16f20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
16f30 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
16f40 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 74 78  StrAccumInit(&tx
16f50 74 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f  t, 0, 0, SQLITE_
16f60 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74  MAX_LENGTH);.  t
16f70 78 74 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 71  xt.db = db;.  sq
16f80 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
16f90 65 6e 64 28 26 74 78 74 2c 20 22 20 28 22 2c 20  end(&txt, " (", 
16fa0 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  2);.  for(i=0; i
16fb0 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nEq; i++){.    
16fc0 63 68 61 72 20 2a 7a 20 3d 20 28 69 3d 3d 70 49  char *z = (i==pI
16fd0 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20  ndex->nKeyCol ) 
16fe0 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c  ? "rowid" : aCol
16ff0 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e  [aiColumn[i]].zN
17000 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d  ame;.    if( i>=
17010 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 65  nSkip ){.      e
17020 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
17030 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20 22 3d 22  (&txt, i, z, "="
17040 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
17050 20 20 20 20 69 66 28 20 69 20 29 20 73 71 6c 69      if( i ) sqli
17060 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
17070 64 28 26 74 78 74 2c 20 22 20 41 4e 44 20 22 2c  d(&txt, " AND ",
17080 20 35 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   5);.      sqlit
17090 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
170a0 28 26 74 78 74 2c 20 22 41 4e 59 28 22 2c 20 34  (&txt, "ANY(", 4
170b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
170c0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
170d0 74 78 74 2c 20 7a 2c 20 2d 31 29 3b 0a 20 20 20  txt, z, -1);.   
170e0 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
170f0 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22  umAppend(&txt, "
17100 29 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  )", 1);.    }.  
17110 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66  }..  j = i;.  if
17120 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
17130 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  &WHERE_BTM_LIMIT
17140 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20   ){.    char *z 
17150 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 4b  = (j==pIndex->nK
17160 65 79 43 6f 6c 20 29 20 3f 20 22 72 6f 77 69 64  eyCol ) ? "rowid
17170 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d  " : aCol[aiColum
17180 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  n[j]].zName;.   
17190 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
171a0 72 6d 28 26 74 78 74 2c 20 69 2b 2b 2c 20 7a 2c  rm(&txt, i++, z,
171b0 20 22 3e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28   ">");.  }.  if(
171c0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26   pLoop->wsFlags&
171d0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
171e0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
171f0 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65   (j==pIndex->nKe
17200 79 43 6f 6c 20 29 20 3f 20 22 72 6f 77 69 64 22  yCol ) ? "rowid"
17210 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e   : aCol[aiColumn
17220 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  [j]].zName;.    
17230 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72  explainAppendTer
17240 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20 22 3c  m(&txt, i, z, "<
17250 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ");.  }.  sqlite
17260 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
17270 26 74 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20  &txt, ")", 1);. 
17280 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
17290 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 74  trAccumFinish(&t
172a0 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  xt);.}../*.** Th
172b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
172c0 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75   no-op unless cu
172d0 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69  rrently processi
172e0 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55  ng an EXPLAIN QU
172f0 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d  ERY PLAN.** comm
17300 61 6e 64 2e 20 49 66 20 74 68 65 20 71 75 65 72  and. If the quer
17310 79 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c 65 64  y being compiled
17320 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 51   is an EXPLAIN Q
17330 55 45 52 59 20 50 4c 41 4e 2c 20 61 20 73 69 6e  UERY PLAN, a sin
17340 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 73  gle.** record is
17350 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6f 75   added to the ou
17360 74 70 75 74 20 74 6f 20 64 65 73 63 72 69 62 65  tput to describe
17370 20 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20   the table scan 
17380 73 74 72 61 74 65 67 79 20 69 6e 20 0a 2a 2a 20  strategy in .** 
17390 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  pLevel..*/.stati
173a0 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e  c void explainOn
173b0 65 53 63 61 6e 28 0a 20 20 50 61 72 73 65 20 2a  eScan(.  Parse *
173c0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
173d0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
173e0 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  e context */.  S
173f0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
17400 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
17410 2a 20 54 61 62 6c 65 20 6c 69 73 74 20 74 68 69  * Table list thi
17420 73 20 6c 6f 6f 70 20 72 65 66 65 72 73 20 74 6f  s loop refers to
17430 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
17440 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20 20 20   *pLevel,       
17450 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 74 6f        /* Scan to
17460 20 77 72 69 74 65 20 4f 50 5f 45 78 70 6c 61 69   write OP_Explai
17470 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a 2f 0a  n opcode for */.
17480 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20    int iLevel,   
17490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174a0 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22    /* Value for "
174b0 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66  level" column of
174c0 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74   output */.  int
174d0 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
174e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
174f0 56 61 6c 75 65 20 66 6f 72 20 22 66 72 6f 6d 22  Value for "from"
17500 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75   column of outpu
17510 74 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  t */.  u16 wctrl
17520 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
17530 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
17540 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
17550 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
17560 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
17570 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
17580 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
17590 32 20 29 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  2 ).#endif.  {. 
175a0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
175b0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
175c0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
175d0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
175e0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
175f0 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
17600 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74  * VM being const
17610 72 75 63 74 65 64 20 2a 2f 0a 20 20 20 20 73 71  ructed */.    sq
17620 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
17630 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44  se->db;     /* D
17640 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
17650 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  /.    char *zMsg
17660 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17670 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61      /* Text to a
17680 64 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74  dd to EQP output
17690 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 20   */.    int iId 
176a0 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  = pParse->iSelec
176b0 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20  tId;  /* Select 
176c0 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75  id (left-most ou
176d0 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a  tput column) */.
176e0 20 20 20 20 69 6e 74 20 69 73 53 65 61 72 63 68      int isSearch
176f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17700 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
17710 53 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66 6f  SEARCH. False fo
17720 72 20 53 43 41 4e 2e 20 2a 2f 0a 20 20 20 20 57  r SCAN. */.    W
17730 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
17740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17750 54 68 65 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  The controlling 
17760 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
17770 20 2a 2f 0a 20 20 20 20 75 33 32 20 66 6c 61 67   */.    u32 flag
17780 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
17790 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
177a0 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68 69  hat describe thi
177b0 73 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 70  s loop */..    p
177c0 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
177d0 57 4c 6f 6f 70 3b 0a 20 20 20 20 66 6c 61 67 73  WLoop;.    flags
177e0 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67   = pLoop->wsFlag
177f0 73 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67  s;.    if( (flag
17800 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  s&WHERE_MULTI_OR
17810 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73  ) || (wctrlFlags
17820 26 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f  &WHERE_ONETABLE_
17830 4f 4e 4c 59 29 20 29 20 72 65 74 75 72 6e 3b 0a  ONLY) ) return;.
17840 0a 20 20 20 20 69 73 53 65 61 72 63 68 20 3d 20  .    isSearch = 
17850 28 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54  (flags&(WHERE_BT
17860 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f  M_LIMIT|WHERE_TO
17870 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20  P_LIMIT))!=0.   
17880 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c           || ((fl
17890 61 67 73 26 57 48 45 52 45 5f 56 49 52 54 55 41  ags&WHERE_VIRTUA
178a0 4c 54 41 42 4c 45 29 3d 3d 30 20 26 26 20 28 70  LTABLE)==0 && (p
178b0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
178c0 71 3e 30 29 29 0a 20 20 20 20 20 20 20 20 20 20  q>0)).          
178d0 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73    || (wctrlFlags
178e0 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  &(WHERE_ORDERBY_
178f0 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42  MIN|WHERE_ORDERB
17900 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a 4d  Y_MAX));..    zM
17910 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
17920 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 69 73  ntf(db, "%s", is
17930 53 65 61 72 63 68 3f 22 53 45 41 52 43 48 22 3a  Search?"SEARCH":
17940 22 53 43 41 4e 22 29 3b 0a 20 20 20 20 69 66 28  "SCAN");.    if(
17950 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
17960 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
17970 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
17980 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53 55  db, zMsg, "%s SU
17990 42 51 55 45 52 59 20 25 64 22 2c 20 7a 4d 73 67  BQUERY %d", zMsg
179a0 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  ,pItem->iSelectI
179b0 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
179c0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
179d0 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
179e0 7a 4d 73 67 2c 20 22 25 73 20 54 41 42 4c 45 20  zMsg, "%s TABLE 
179f0 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d  %s", zMsg, pItem
17a00 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
17a10 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
17a20 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
17a30 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
17a40 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
17a50 20 22 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73   "%s AS %s", zMs
17a60 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  g, pItem->zAlias
17a70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
17a80 20 28 66 6c 61 67 73 20 26 20 28 57 48 45 52 45   (flags & (WHERE
17a90 5f 49 50 4b 7c 57 48 45 52 45 5f 56 49 52 54 55  _IPK|WHERE_VIRTU
17aa0 41 4c 54 41 42 4c 45 29 29 3d 3d 30 0a 20 20 20  ALTABLE))==0.   
17ab0 20 20 26 26 20 41 4c 57 41 59 53 28 70 4c 6f 6f    && ALWAYS(pLoo
17ac0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
17ad0 78 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  x!=0).    ){.   
17ae0 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20     char *zWhere 
17af0 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61  = explainIndexRa
17b00 6e 67 65 28 64 62 2c 20 70 4c 6f 6f 70 2c 20 70  nge(db, pLoop, p
17b10 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
17b20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
17b30 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
17b40 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  sg,.            
17b50 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45     ((flags & WHE
17b60 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 3f  RE_AUTO_INDEX) ?
17b70 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
17b80 20 20 20 20 20 22 25 73 20 55 53 49 4e 47 20 41       "%s USING A
17b90 55 54 4f 4d 41 54 49 43 20 25 73 49 4e 44 45 58  UTOMATIC %sINDEX
17ba0 25 2e 30 73 25 73 22 20 3a 0a 20 20 20 20 20 20  %.0s%s" :.      
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73               "%s
17bc0 20 55 53 49 4e 47 20 25 73 49 4e 44 45 58 20 25   USING %sINDEX %
17bd0 73 25 73 22 29 2c 20 0a 20 20 20 20 20 20 20 20  s%s"), .        
17be0 20 20 20 20 20 20 20 7a 4d 73 67 2c 20 28 28 66         zMsg, ((f
17bf0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
17c00 5f 4f 4e 4c 59 29 20 3f 20 22 43 4f 56 45 52 49  _ONLY) ? "COVERI
17c10 4e 47 20 22 20 3a 20 22 22 29 2c 0a 20 20 20 20  NG " : ""),.    
17c20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
17c30 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
17c40 2d 3e 7a 4e 61 6d 65 2c 20 7a 57 68 65 72 65 29  ->zName, zWhere)
17c50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
17c60 62 46 72 65 65 28 64 62 2c 20 7a 57 68 65 72 65  bFree(db, zWhere
17c70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
17c80 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f   (flags & WHERE_
17c90 49 50 4b 29 21 3d 30 20 26 26 20 28 66 6c 61 67  IPK)!=0 && (flag
17ca0 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52  s & WHERE_CONSTR
17cb0 41 49 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  AINT)!=0 ){.    
17cc0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
17cd0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
17ce0 67 2c 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54  g, "%s USING INT
17cf0 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
17d00 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20  ", zMsg);..     
17d10 20 69 66 28 20 66 6c 61 67 73 26 28 57 48 45 52   if( flags&(WHER
17d20 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
17d30 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a  E_COLUMN_IN) ){.
17d40 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
17d50 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
17d60 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f  b, zMsg, "%s (ro
17d70 77 69 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a  wid=?)", zMsg);.
17d80 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
17d90 28 66 6c 61 67 73 26 57 48 45 52 45 5f 42 4f 54  (flags&WHERE_BOT
17da0 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f  H_LIMIT)==WHERE_
17db0 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  BOTH_LIMIT ){.  
17dc0 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
17dd0 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
17de0 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
17df0 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29  d>? AND rowid<?)
17e00 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
17e10 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26  }else if( flags&
17e20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
17e30 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
17e40 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
17e50 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
17e60 28 72 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67  (rowid>?)", zMsg
17e70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
17e80 66 28 20 41 4c 57 41 59 53 28 66 6c 61 67 73 26  f( ALWAYS(flags&
17e90 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
17ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
17eb0 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
17ec0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
17ed0 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73   (rowid<?)", zMs
17ee0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
17ef0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
17f00 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
17f10 4c 45 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  LE.    else if( 
17f20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  (flags & WHERE_V
17f30 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
17f40 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
17f50 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
17f60 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49  db, zMsg, "%s VI
17f70 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45  RTUAL TABLE INDE
17f80 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a  X %d:%s", zMsg,.
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fa0 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
17fb0 69 64 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75  idxNum, pLoop->u
17fc0 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20  .vtab.idxStr);. 
17fd0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
17fe0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
17ff0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
18000 20 22 25 73 22 2c 20 7a 4d 73 67 29 3b 0a 20 20   "%s", zMsg);.  
18010 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18020 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
18030 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20  n, iId, iLevel, 
18040 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f  iFrom, zMsg, P4_
18050 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
18060 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65  #else.# define e
18070 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c  xplainOneScan(u,
18080 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  v,w,x,y,z).#endi
18090 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
180a0 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a  _EXPLAIN */.../*
180b0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
180c0 65 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  e for the start 
180d0 6f 66 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68  of the iLevel-th
180e0 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45   loop in the WHE
180f0 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70  RE clause.** imp
18100 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63  lementation desc
18110 72 69 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e  ribed by pWInfo.
18120 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
18130 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74  sk codeOneLoopSt
18140 61 72 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  art(.  WhereInfo
18150 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43   *pWInfo,   /* C
18160 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74  omplete informat
18170 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48  ion about the WH
18180 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
18190 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
181a0 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65       /* Which le
181b0 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61  vel of pWInfo->a
181c0 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64  [] should be cod
181d0 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ed */.  Bitmask 
181e0 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20  notReady     /* 
181f0 57 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65  Which tables are
18200 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c   currently avail
18210 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  able */.){.  int
18220 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
18230 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
18240 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  rs */.  int iCur
18250 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18260 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
18270 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
18280 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20  .  int addrNxt; 
18290 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
182a0 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74   to jump to cont
182b0 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
182c0 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20  xt IN case */.  
182d0 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20  int omitTable;  
182e0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
182f0 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78  we use the index
18300 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62   only */.  int b
18310 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rev;            
18320 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65  /* True if we ne
18330 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65  ed to scan in re
18340 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20  verse order */. 
18350 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
18360 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65  vel;  /* The whe
18370 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63  re level to be c
18380 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oded */.  WhereL
18390 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f  oop *pLoop;    /
183a0 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
183b0 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 63 6f 64  object being cod
183c0 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ed */.  WhereCla
183d0 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20  use *pWC;    /* 
183e0 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66  Decomposition of
183f0 20 74 68 65 20 65 6e 74 69 72 65 20 57 48 45 52   the entire WHER
18400 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
18410 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
18420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18430 20 41 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   A WHERE clause 
18440 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20  term */.  Parse 
18450 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
18460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
18470 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
18480 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
18490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184a0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
184b0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  nnection */.  Vd
184c0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
184d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
184e0 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
184f0 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  mt under constru
18500 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75  ctions */.  stru
18510 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
18520 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46  *pTabItem;  /* F
18530 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
18540 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
18550 20 69 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20   int addrBrk;   
18560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18570 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
18580 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
18590 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  e loop */.  int 
185a0 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20  addrCont;       
185b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
185c0 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74  ump here to cont
185d0 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 63  inue with next c
185e0 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  ycle */.  int iR
185f0 6f 77 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20  owidReg = 0;    
18600 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20      /* Rowid is 
18610 73 74 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72  stored in this r
18620 65 67 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20  egister, if not 
18630 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52  zero */.  int iR
18640 65 6c 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20  eleaseReg = 0;  
18650 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69      /* Temp regi
18660 73 74 65 72 20 74 6f 20 66 72 65 65 20 62 65 66  ster to free bef
18670 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f  ore returning */
18680 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ..  pParse = pWI
18690 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76  nfo->pParse;.  v
186a0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
186b0 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66  ;.  pWC = &pWInf
186c0 6f 2d 3e 73 57 43 3b 0a 20 20 64 62 20 3d 20 70  o->sWC;.  db = p
186d0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4c 65  Parse->db;.  pLe
186e0 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
186f0 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f  [iLevel];.  pLoo
18700 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
18710 6f 70 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d  op;.  pTabItem =
18720 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69   &pWInfo->pTabLi
18730 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
18740 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70  rom];.  iCur = p
18750 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
18760 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  ;.  pLevel->notR
18770 65 61 64 79 20 3d 20 6e 6f 74 52 65 61 64 79 20  eady = notReady 
18780 26 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e  & ~getMask(&pWIn
18790 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43  fo->sMaskSet, iC
187a0 75 72 29 3b 0a 20 20 62 52 65 76 20 3d 20 28 70  ur);.  bRev = (p
187b0 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 3e 3e  WInfo->revMask>>
187c0 69 4c 65 76 65 6c 29 26 31 3b 0a 20 20 6f 6d 69  iLevel)&1;.  omi
187d0 74 54 61 62 6c 65 20 3d 20 28 70 4c 6f 6f 70 2d  tTable = (pLoop-
187e0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
187f0 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20  _IDX_ONLY)!=0 . 
18800 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57            && (pW
18810 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
18820 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54   & WHERE_FORCE_T
18830 41 42 4c 45 29 3d 3d 30 3b 0a 20 20 56 64 62 65  ABLE)==0;.  Vdbe
18840 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
18850 22 42 65 67 69 6e 20 57 48 45 52 45 2d 6c 6f 6f  "Begin WHERE-loo
18860 70 25 64 3a 20 25 73 22 2c 69 4c 65 76 65 6c 2c  p%d: %s",iLevel,
18870 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
18880 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 43  zName));..  /* C
18890 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72  reate labels for
188a0 20 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64   the "break" and
188b0 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74   "continue" inst
188c0 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f  ructions.  ** fo
188d0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  r the current lo
188e0 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64 64  op.  Jump to add
188f0 72 42 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75  rBrk to break ou
18900 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a  t of a loop..  *
18910 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74  * Jump to cont t
18920 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79  o go immediately
18930 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65   to the next ite
18940 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  ration of the.  
18950 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20  ** loop..  **.  
18960 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69 73  ** When there is
18970 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c   an IN operator,
18980 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61 20   we also have a 
18990 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 20  "addrNxt" label 
189a0 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20  that.  ** means 
189b0 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
189c0 20 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61 6c   the next IN val
189d0 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20  ue combination. 
189e0 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65   When.  ** there
189f0 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61   are no IN opera
18a00 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e 73  tors in the cons
18a10 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22 61 64  traints, the "ad
18a20 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a  drNxt" label.  *
18a30 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  * is the same as
18a40 20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f   "addrBrk"..  */
18a50 0a 20 20 61 64 64 72 42 72 6b 20 3d 20 70 4c 65  .  addrBrk = pLe
18a60 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70  vel->addrBrk = p
18a70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d  Level->addrNxt =
18a80 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
18a90 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64 72  Label(v);.  addr
18aa0 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  Cont = pLevel->a
18ab0 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65  ddrCont = sqlite
18ac0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
18ad0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
18ae0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61   is the right ta
18af0 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  ble of a LEFT OU
18b00 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61  TER JOIN, alloca
18b10 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74  te and.  ** init
18b20 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20  ialize a memory 
18b30 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64  cell that record
18b40 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20  s if this table 
18b50 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a  matches any.  **
18b60 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74   row of the left
18b70 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
18b80 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  in..  */.  if( p
18b90 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26  Level->iFrom>0 &
18ba0 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a  & (pTabItem[0].j
18bb0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
18bc0 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65  T)!=0 ){.    pLe
18bd0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d  vel->iLeftJoin =
18be0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
18bf0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18c00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
18c10 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  eger, 0, pLevel-
18c20 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
18c30 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
18c40 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e   "init LEFT JOIN
18c50 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22 29   no-match flag")
18c60 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65  );.  }..  /* Spe
18c70 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 46  cial case of a F
18c80 52 4f 4d 20 63 6c 61 75 73 65 20 73 75 62 71 75  ROM clause subqu
18c90 65 72 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  ery implemented 
18ca0 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  as a co-routine 
18cb0 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 49 74 65  */.  if( pTabIte
18cc0 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  m->viaCoroutine 
18cd0 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59 69  ){.    int regYi
18ce0 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  eld = pTabItem->
18cf0 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 73  regReturn;.    s
18d00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18d10 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
18d20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46 69  pTabItem->addrFi
18d30 6c 6c 53 75 62 2d 31 2c 20 72 65 67 59 69 65 6c  llSub-1, regYiel
18d40 64 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  d);.    pLevel->
18d50 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64 62  p2 =  sqlite3Vdb
18d60 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
18d70 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a  eld, regYield);.
18d80 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
18d90 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66  (v, "next row of
18da0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 25 73 22 2c   co-routine %s",
18db0 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d   pTabItem->pTab-
18dc0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73 71  >zName));.    sq
18dd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18de0 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 59 69 65  v, OP_If, regYie
18df0 6c 64 2b 31 2c 20 61 64 64 72 42 72 6b 29 3b 0a  ld+1, addrBrk);.
18e00 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
18e10 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73   OP_Goto;.  }els
18e20 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e..#ifndef SQLIT
18e30 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
18e40 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 6f 6f  BLE.  if(  (pLoo
18e50 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
18e60 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
18e70 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  !=0 ){.    /* Ca
18e80 73 65 20 31 3a 20 20 54 68 65 20 74 61 62 6c 65  se 1:  The table
18e90 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61   is a virtual-ta
18ea0 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56 46  ble.  Use the VF
18eb0 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a  ilter and VNext.
18ec0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
18ed0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
18ee0 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ta..    */.    i
18ef0 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33  nt iReg;   /* P3
18f00 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46   Value for OP_VF
18f10 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ilter */.    int
18f20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20   addrNotFound;. 
18f30 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69     int nConstrai
18f40 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  nt = pLoop->nLTe
18f50 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  rm;..    sqlite3
18f60 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
18f70 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67 20  arse);.    iReg 
18f80 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
18f90 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
18fa0 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20  onstraint+2);.  
18fb0 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d    addrNotFound =
18fc0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
18fd0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
18fe0 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b  <nConstraint; j+
18ff0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54  +){.      int iT
19000 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a 2b 32  arget = iReg+j+2
19010 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
19020 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
19030 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
19040 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  m==0 ) continue;
19050 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
19060 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
19070 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  _IN ){.        c
19080 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
19090 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
190a0 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20  Level, j, bRev, 
190b0 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20  iTarget);.      
190c0 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d    addrNotFound =
190d0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
190e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
190f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
19100 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
19110 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
19120 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  ght, iTarget);. 
19130 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
19140 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19150 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
19160 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  , pLoop->u.vtab.
19170 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20  idxNum, iReg);. 
19180 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19190 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
191a0 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c  er, nConstraint,
191b0 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71   iReg+1);.    sq
191c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
191d0 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69  v, OP_VFilter, i
191e0 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e  Cur, addrNotFoun
191f0 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20 20 20  d, iReg,.       
19200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19210 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
19220 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Str,.           
19230 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
19240 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
19250 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a  e ? P4_MPRINTF :
19260 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
19270 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e   pLoop->u.vtab.n
19280 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  eedFree = 0;.   
19290 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e   for(j=0; j<nCon
192a0 73 74 72 61 69 6e 74 20 26 26 20 6a 3c 31 36 3b  straint && j<16;
192b0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
192c0 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e   (pLoop->u.vtab.
192d0 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26 31 20 29  omitMask>>j)&1 )
192e0 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c  {.        disabl
192f0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4c  eTerm(pLevel, pL
19300 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 29 3b  oop->aLTerm[j]);
19310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19320 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
19330 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c  OP_VNext;.    pL
19340 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
19350 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
19360 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
19370 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
19380 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
19390 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
193a0 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69   iReg, nConstrai
193b0 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  nt+2);.    sqlit
193c0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
193d0 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65 6c  Parse, 1);.  }el
193e0 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
193f0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
19400 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20  TABLE */..  if( 
19410 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
19420 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a  & WHERE_IPK)!=0.
19430 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
19440 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43  Flags & (WHERE_C
19450 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43  OLUMN_IN|WHERE_C
19460 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20 20  OLUMN_EQ))!=0.  
19470 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32  ){.    /* Case 2
19480 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74  :  We can direct
19490 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73  ly reference a s
194a0 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20  ingle row using 
194b0 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  an.    **       
194c0 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70     equality comp
194d0 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
194e0 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20  he ROWID field. 
194f0 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   Or.    **      
19500 20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63 65      we reference
19510 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75   multiple rows u
19520 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e  sing a "rowid IN
19530 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20   (...)".    **  
19540 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63          construc
19550 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
19560 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62  sert( pLoop->u.b
19570 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20  tree.nEq==1 );. 
19580 20 20 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d     iReleaseReg =
19590 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
195a0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
195b0 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61  pTerm = pLoop->a
195c0 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73  LTerm[0];.    as
195d0 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
195e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
195f0 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b  erm->pExpr!=0 );
19600 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69  .    assert( omi
19610 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  tTable==0 );.   
19620 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
19630 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
19640 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
19650 69 52 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65  iRowidReg = code
19660 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
19670 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
19680 65 6c 2c 20 30 2c 20 62 52 65 76 2c 20 69 52 65  el, 0, bRev, iRe
19690 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20 61  leaseReg);.    a
196a0 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d  ddrNxt = pLevel-
196b0 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71  >addrNxt;.    sq
196c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
196d0 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
196e0 20 69 52 6f 77 69 64 52 65 67 2c 20 61 64 64 72   iRowidReg, addr
196f0 4e 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Nxt);.    sqlite
19700 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
19710 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75  P_NotExists, iCu
19720 72 2c 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77  r, addrNxt, iRow
19730 69 64 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69  idReg);.    sqli
19740 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
19750 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
19760 65 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 31 29  e, iRowidReg, 1)
19770 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
19780 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
19790 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
197a0 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64  owidReg);.    Vd
197b0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70  beComment((v, "p
197c0 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  k"));.    pLevel
197d0 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
197e0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 6f    }else if( (pLo
197f0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
19800 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 20  ERE_IPK)!=0.    
19810 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e       && (pLoop->
19820 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
19830 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29 21 3d 30  COLUMN_RANGE)!=0
19840 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  .  ){.    /* Cas
19850 65 20 33 3a 20 20 57 65 20 68 61 76 65 20 61 6e  e 3:  We have an
19860 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70   inequality comp
19870 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
19880 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a  he ROWID field..
19890 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74      */.    int t
198a0 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  estOp = OP_Noop;
198b0 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a  .    int start;.
198c0 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61      int memEndVa
198d0 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65  lue = 0;.    Whe
198e0 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20  reTerm *pStart, 
198f0 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65  *pEnd;..    asse
19900 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
19910 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20   );.    j = 0;. 
19920 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64     pStart = pEnd
19930 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c   = 0;.    if( pL
19940 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
19950 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
19960 20 70 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d   pStart = pLoop-
19970 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
19980 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
19990 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
199a0 5f 4c 49 4d 49 54 20 29 20 70 45 6e 64 20 3d 20  _LIMIT ) pEnd = 
199b0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b  pLoop->aLTerm[j+
199c0 2b 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +];.    assert( 
199d0 70 53 74 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e  pStart!=0 || pEn
199e0 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  d!=0 );.    if( 
199f0 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54  bRev ){.      pT
19a00 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20  erm = pStart;.  
19a10 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e      pStart = pEn
19a20 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  d;.      pEnd = 
19a30 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  pTerm;.    }.   
19a40 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
19a50 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
19a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19a70 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
19a80 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 74  t defines the st
19a90 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  art bound */.   
19aa0 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70     int r1, rTemp
19ab0 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  ;        /* Regi
19ac0 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e  sters for holdin
19ad0 67 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e  g the start boun
19ae0 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  dary */..      /
19af0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
19b00 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b  constant maps TK
19b10 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63  _xx codes into c
19b20 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20  orresponding .  
19b30 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f      ** seek opco
19b40 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73  des.  It depends
19b50 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
19b60 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f   ordering of TK_
19b70 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  xx.      */.    
19b80 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65    const u8 aMove
19b90 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  Op[] = {.       
19ba0 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20      /* TK_GT */ 
19bb0 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20   OP_SeekGt,.    
19bc0 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20         /* TK_LE 
19bd0 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20  */  OP_SeekLe,. 
19be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
19bf0 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74  LT */  OP_SeekLt
19c00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
19c10 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_GE */  OP_See
19c20 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  kGe.      };.   
19c30 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
19c40 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20  ==TK_GT+1 );    
19c50 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
19c60 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f  he ordering.. */
19c70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
19c80 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
19c90 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66        /*  ... of
19ca0 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65   the TK_xx value
19cb0 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  s... */.      as
19cc0 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f  sert( TK_GE==TK_
19cd0 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+3 );      /* 
19ce0 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74   ... is correcct
19cf0 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65  . */..      asse
19d00 72 74 28 20 28 70 53 74 61 72 74 2d 3e 77 74 46  rt( (pStart->wtF
19d10 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
19d20 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  L)==0 );.      t
19d30 65 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d  estcase( pStart-
19d40 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
19d50 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
19d60 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45   pX = pStart->pE
19d70 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
19d80 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20  t( pX!=0 );.    
19d90 20 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61    testcase( pSta
19da0 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rt->leftCursor!=
19db0 69 43 75 72 20 29 3b 20 2f 2a 20 74 72 61 6e 73  iCur ); /* trans
19dc0 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74  itive constraint
19dd0 73 20 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20  s */.      r1 = 
19de0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
19df0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  emp(pParse, pX->
19e00 70 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b  pRight, &rTemp);
19e10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19e20 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76  beAddOp3(v, aMov
19e30 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54  eOp[pX->op-TK_GT
19e40 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  ], iCur, addrBrk
19e50 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
19e60 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b  eComment((v, "pk
19e70 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
19e80 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
19e90 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
19ea0 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
19eb0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
19ec0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 54  mpReg(pParse, rT
19ed0 65 6d 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61  emp);.      disa
19ee0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
19ef0 70 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c  pStart);.    }el
19f00 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
19f10 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62  3VdbeAddOp2(v, b
19f20 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
19f30 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c  OP_Rewind, iCur,
19f40 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d   addrBrk);.    }
19f50 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b  .    if( pEnd ){
19f60 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
19f70 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64  .      pX = pEnd
19f80 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
19f90 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a  ssert( pX!=0 );.
19fa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
19fb0 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
19fc0 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b  ERM_VNULL)==0 );
19fd0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19fe0 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f   pEnd->leftCurso
19ff0 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54 72  r!=iCur ); /* Tr
1a000 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61  ansitive constra
1a010 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65  ints */.      te
1a020 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74  stcase( pEnd->wt
1a030 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1a040 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65  TUAL );.      me
1a050 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50  mEndValue = ++pP
1a060 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1a070 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1a080 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  e(pParse, pX->pR
1a090 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75  ight, memEndValu
1a0a0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  e);.      if( pX
1a0b0 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70  ->op==TK_LT || p
1a0c0 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a  X->op==TK_GT ){.
1a0d0 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
1a0e0 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20   bRev ? OP_Le : 
1a0f0 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c  OP_Ge;.      }el
1a100 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
1a110 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c  Op = bRev ? OP_L
1a120 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20  t : OP_Gt;.     
1a130 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65   }.      disable
1a140 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e  Term(pLevel, pEn
1a150 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  d);.    }.    st
1a160 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
1a170 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1a180 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1a190 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
1a1a0 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
1a1b0 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
1a1c0 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
1a1d0 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61  2 = start;.    a
1a1e0 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70  ssert( pLevel->p
1a1f0 35 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  5==0 );.    if( 
1a200 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  testOp!=OP_Noop 
1a210 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52  ){.      iRowidR
1a220 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67  eg = iReleaseReg
1a230 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1a240 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
1a250 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a260 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
1a270 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52  d, iCur, iRowidR
1a280 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
1a290 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
1a2a0 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d  (pParse, iCur, -
1a2b0 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  1, iRowidReg);. 
1a2c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a2d0 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70  AddOp3(v, testOp
1a2e0 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61  , memEndValue, a
1a2f0 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65  ddrBrk, iRowidRe
1a300 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1a310 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1a320 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
1a330 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d  RIC | SQLITE_JUM
1a340 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a  PIFNULL);.    }.
1a350 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f    }else if( pLoo
1a360 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1a370 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20  RE_INDEXED ){.  
1a380 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 41 20 73    /* Case 4: A s
1a390 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64  can using an ind
1a3a0 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ex..    **.    *
1a3b0 2a 20 20 20 20 20 20 20 20 20 54 68 65 20 57 48  *         The WH
1a3c0 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63  ERE clause may c
1a3d0 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d  ontain zero or m
1a3e0 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20  ore equality .  
1a3f0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72    **         ter
1a400 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22  ms ("==" or "IN"
1a410 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68 61 74   operators) that
1a420 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a   refer to the N.
1a430 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c      **         l
1a440 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73  eft-most columns
1a450 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49   of the index. I
1a460 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61  t may also conta
1a470 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  in.    **       
1a480 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e    inequality con
1a490 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20  straints (>, <, 
1a4a0 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65  >= or <=) on the
1a4b0 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a 20   indexed.    ** 
1a4c0 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74          column t
1a4d0 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  hat immediately 
1a4e0 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65 71  follows the N eq
1a4f0 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a  ualities. Only .
1a500 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
1a510 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f  he right-most co
1a520 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69  lumn can be an i
1a530 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20  nequality - the 
1a540 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a  rest must.    **
1a550 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68 65           use the
1a560 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f   "==" and "IN" o
1a570 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78  perators. For ex
1a580 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20  ample, if the . 
1a590 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e     **         in
1a5a0 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a  dex is on (x,y,z
1a5b0 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c  ), then the foll
1a5c0 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20 61 72  owing clauses ar
1a5d0 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20  e all .    **   
1a5e0 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a        optimized:
1a5f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1a600 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a 20 20            x=5.  
1a610 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1a620 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20 20 20  x=5 AND y=10.   
1a630 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
1a640 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20  =5 AND y<10.    
1a650 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
1a660 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c  5 AND y>5 AND y<
1a670 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
1a680 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35       x=5 AND y=5
1a690 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a   AND z<=10.    *
1a6a0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1a6b0 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f   The z<10 term o
1a6c0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1a6d0 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20  cannot be used, 
1a6e0 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 20  only.    **     
1a6f0 20 20 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d      the x=5 term
1a700 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1a710 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1a720 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20  ND z<10.    **. 
1a730 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20     **         N 
1a740 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74  may be zero if t
1a750 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c  here are inequal
1a760 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ity constraints.
1a770 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1a780 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
1a790 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1a7a0 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69  raints, then N i
1a7b0 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  s at.    **     
1a7c0 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20      least one.. 
1a7d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1a7e0 20 20 20 20 20 54 68 69 73 20 63 61 73 65 20 69       This case i
1a7f0 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e  s also used when
1a800 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48   there are no WH
1a810 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 2a  ERE clause.    *
1a820 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72  *         constr
1a830 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64  aints but an ind
1a840 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20 61  ex is selected a
1a850 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a  nyway, in order.
1a860 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
1a870 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70  o force the outp
1a880 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66  ut order to conf
1a890 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20  orm to an ORDER 
1a8a0 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20  BY..    */  .   
1a8b0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
1a8c0 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a   aStartOp[] = {.
1a8d0 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30        0,.      0
1a8e0 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e  ,.      OP_Rewin
1a8f0 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
1a900 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74  2: (!start_const
1a910 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45  raints && startE
1a920 71 20 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a  q &&  !bRev) */.
1a930 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20        OP_Last,  
1a940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a             /* 3:
1a950 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61   (!start_constra
1a960 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20  ints && startEq 
1a970 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20  &&   bRev) */.  
1a980 20 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20      OP_SeekGt,  
1a990 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28           /* 4: (
1a9a0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1a9b0 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26  s  && !startEq &
1a9c0 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  & !bRev) */.    
1a9d0 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20    OP_SeekLt,    
1a9e0 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74         /* 5: (st
1a9f0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1aa00 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20   && !startEq && 
1aa10 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20   bRev) */.      
1aa20 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20 20 20 20  OP_SeekGe,      
1aa30 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72       /* 6: (star
1aa40 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
1aa50 26 20 20 73 74 61 72 74 45 71 20 26 26 20 21 62  &  startEq && !b
1aa60 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
1aa70 5f 53 65 65 6b 4c 65 20 20 20 20 20 20 20 20 20  _SeekLe         
1aa80 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f     /* 7: (start_
1aa90 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
1aaa0 20 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65   startEq &&  bRe
1aab0 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20  v) */.    };.   
1aac0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
1aad0 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20   aEndOp[] = {.  
1aae0 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20      OP_Noop,    
1aaf0 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 28           /* 0: (
1ab00 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  !end_constraints
1ab10 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64  ) */.      OP_Id
1ab20 78 47 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  xGE,            
1ab30 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 1: (end_const
1ab40 72 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 29  raints && !bRev)
1ab50 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78   */.      OP_Idx
1ab60 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  LT             /
1ab70 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72  * 2: (end_constr
1ab80 61 69 6e 74 73 20 26 26 20 62 52 65 76 29 20 2a  aints && bRev) *
1ab90 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 75 31 36  /.    };.    u16
1aba0 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e   nEq = pLoop->u.
1abb0 62 74 72 65 65 2e 6e 45 71 3b 20 20 20 20 20 2f  btree.nEq;     /
1abc0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  * Number of == o
1abd0 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r IN terms */.  
1abe0 20 20 69 6e 74 20 69 73 4d 69 6e 51 75 65 72 79    int isMinQuery
1abf0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
1ac00 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
1ac10 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c 45 43 54  optimized SELECT
1ac20 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20   min(x).. */.   
1ac30 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20   int regBase;   
1ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ac50 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20 68   Base register h
1ac60 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e  olding constrain
1ac70 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20  t values */.    
1ac80 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20 20  int r1;         
1ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1aca0 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 2a 2f  Temp register */
1acb0 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
1acc0 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b  pRangeStart = 0;
1acd0 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20    /* Inequality 
1ace0 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61  constraint at ra
1acf0 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20  nge start */.   
1ad00 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e   WhereTerm *pRan
1ad10 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a  geEnd = 0;    /*
1ad20 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   Inequality cons
1ad30 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20  traint at range 
1ad40 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  end */.    int s
1ad50 74 61 72 74 45 71 3b 20 20 20 20 20 20 20 20 20  tartEq;         
1ad60 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1ad70 69 66 20 72 61 6e 67 65 20 73 74 61 72 74 20 75  if range start u
1ad80 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d  ses ==, >= or <=
1ad90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45   */.    int endE
1ada0 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
1adb0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1adc0 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d  range end uses =
1add0 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20  =, >= or <= */. 
1ade0 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e     int start_con
1adf0 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20  straints;       
1ae00 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67  /* Start of rang
1ae10 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64  e is constrained
1ae20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e   */.    int nCon
1ae30 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20  straint;        
1ae40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ae50 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  f constraint ter
1ae60 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  ms */.    Index 
1ae70 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
1ae80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
1ae90 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75  dex we will be u
1aea0 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sing */.    int 
1aeb0 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20 20  iIdxCur;        
1aec0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1aed0 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
1aee0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
1aef0 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20 3d   int nExtraReg =
1af00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1af10 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
1af20 20 72 65 67 69 73 74 65 72 73 20 6e 65 65 64 65   registers neede
1af30 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b  d */.    int op;
1af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af50 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63        /* Instruc
1af60 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  tion opcode */. 
1af70 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72 74 41     char *zStartA
1af80 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
1af90 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20  /* Affinity for 
1afa0 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 63  start of range c
1afb0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
1afc0 20 63 68 61 72 20 2a 7a 45 6e 64 41 66 66 3b 20   char *zEndAff; 
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1afe0 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 65 6e   Affinity for en
1aff0 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74  d of range const
1b000 72 61 69 6e 74 20 2a 2f 0a 0a 20 20 20 20 70 49  raint */..    pI
1b010 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  dx = pLoop->u.bt
1b020 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
1b030 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
1b040 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 61  ->iIdxCur;.    a
1b050 73 73 65 72 74 28 20 6e 45 71 3e 3d 70 4c 6f 6f  ssert( nEq>=pLoo
1b060 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70  p->u.btree.nSkip
1b070 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   );..    /* If t
1b080 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69  his loop satisfi
1b090 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20  es a sort order 
1b0a0 28 70 4f 72 64 65 72 42 79 29 20 72 65 71 75 65  (pOrderBy) reque
1b0b0 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a 2a 20  st that .    ** 
1b0c0 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  was passed to th
1b0d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69  is function to i
1b0e0 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c 45  mplement a "SELE
1b0f0 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a  CT min(x) ..." .
1b100 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68      ** query, th
1b110 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  en the caller wi
1b120 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68  ll only allow th
1b130 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f  e loop to run fo
1b140 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c  r.    ** a singl
1b150 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69  e iteration. Thi
1b160 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
1b170 20 66 69 72 73 74 20 72 6f 77 20 72 65 74 75 72   first row retur
1b180 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c  ned.    ** shoul
1b190 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55 4c  d not have a NUL
1b1a0 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  L value stored i
1b1b0 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e  n 'x'. If column
1b1c0 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a 20 74   'x' is.    ** t
1b1d0 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61 66 74  he first one aft
1b1e0 65 72 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c  er the nEq equal
1b1f0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
1b200 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20  in the index,.  
1b210 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75 69 72    ** this requir
1b220 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c 20  es some special 
1b230 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f  handling..    */
1b240 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f  .    if( (pWInfo
1b250 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45  ->wctrlFlags&WHE
1b260 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21  RE_ORDERBY_MIN)!
1b270 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e  =0.     && (pWIn
1b280 66 6f 2d 3e 62 4f 42 53 61 74 21 3d 30 29 0a 20  fo->bOBSat!=0). 
1b290 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e 6e 4b      && (pIdx->nK
1b2a0 65 79 43 6f 6c 3e 6e 45 71 29 0a 20 20 20 20 29  eyCol>nEq).    )
1b2b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1b2c0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
1b2d0 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Skip==0 );.     
1b2e0 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31 3b   isMinQuery = 1;
1b2f0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
1b300 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
1b310 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65   /* Find any ine
1b320 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1b330 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65  nt terms for the
1b340 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a   start and end .
1b350 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61      ** of the ra
1b360 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nge. .    */.   
1b370 20 6a 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66   j = nEq;.    if
1b380 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1b390 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
1b3a0 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e  IT ){.      pRan
1b3b0 67 65 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d  geStart = pLoop-
1b3c0 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
1b3d0 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
1b3e0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
1b3f0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1b400 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
1b410 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67  T ){.      pRang
1b420 65 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  eEnd = pLoop->aL
1b430 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20  Term[j++];.     
1b440 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a   nExtraReg = 1;.
1b450 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
1b460 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
1b470 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73  valuate all cons
1b480 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69  traint terms usi
1b490 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20  ng == or IN.    
1b4a0 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
1b4b0 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65   values of those
1b4c0 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72   terms in an arr
1b4d0 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a  ay of registers.
1b4e0 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
1b4f0 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20  at regBase..    
1b500 2a 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d  */.    regBase =
1b510 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79   codeAllEquality
1b520 54 65 72 6d 73 28 70 50 61 72 73 65 2c 70 4c 65  Terms(pParse,pLe
1b530 76 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72 61 52  vel,bRev,nExtraR
1b540 65 67 2c 26 7a 53 74 61 72 74 41 66 66 29 3b 0a  eg,&zStartAff);.
1b550 20 20 20 20 7a 45 6e 64 41 66 66 20 3d 20 73 71      zEndAff = sq
1b560 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
1b570 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  , zStartAff);.  
1b580 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76    addrNxt = pLev
1b590 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20  el->addrNxt;..  
1b5a0 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
1b5b0 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f  oing a reverse o
1b5c0 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20  rder scan on an 
1b5d0 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c  ascending index,
1b5e0 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72   or.    ** a for
1b5f0 77 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20  ward order scan 
1b600 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20  on a descending 
1b610 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e  index, interchan
1b620 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73  ge the .    ** s
1b630 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72  tart and end ter
1b640 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20  ms (pRangeStart 
1b650 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a  and pRangeEnd)..
1b660 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1b670 6e 45 71 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  nEq<pIdx->nKeyCo
1b680 6c 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78  l && bRev==(pIdx
1b690 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71  ->aSortOrder[nEq
1b6a0 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  ]==SQLITE_SO_ASC
1b6b0 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76  )).     || (bRev
1b6c0 20 26 26 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   && pIdx->nKeyCo
1b6d0 6c 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20  l==nEq).    ){. 
1b6e0 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54       SWAP(WhereT
1b6f0 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64  erm *, pRangeEnd
1b700 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
1b710 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63      }..    testc
1b720 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
1b730 20 26 26 20 28 70 52 61 6e 67 65 53 74 61 72 74   && (pRangeStart
1b740 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1b750 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74  _LE)!=0 );.    t
1b760 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
1b770 74 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53  tart && (pRangeS
1b780 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
1b790 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20  & WO_GE)!=0 );. 
1b7a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
1b7b0 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67  ngeEnd && (pRang
1b7c0 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
1b7d0 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20  & WO_LE)!=0 );. 
1b7e0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
1b7f0 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67  ngeEnd && (pRang
1b800 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
1b810 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20  & WO_GE)!=0 );. 
1b820 20 20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52     startEq = !pR
1b830 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61  angeStart || pRa
1b840 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
1b850 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f  tor & (WO_LE|WO_
1b860 47 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d  GE);.    endEq =
1b870 20 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c     !pRangeEnd ||
1b880 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65   pRangeEnd->eOpe
1b890 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57  rator & (WO_LE|W
1b8a0 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74  O_GE);.    start
1b8b0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70  _constraints = p
1b8c0 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45  RangeStart || nE
1b8d0 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65  q>0;..    /* See
1b8e0 6b 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73  k the index curs
1b8f0 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
1b900 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f  of the range. */
1b910 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74  .    nConstraint
1b920 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20   = nEq;.    if( 
1b930 70 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20  pRangeStart ){. 
1b940 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
1b950 74 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d  t = pRangeStart-
1b960 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
1b970 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b980 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
1b990 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
1b9a0 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  q);.      if( (p
1b9b0 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c  RangeStart->wtFl
1b9c0 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
1b9d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1b9e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1b9f0 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69  sNullJump(v, pRi
1ba00 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
1ba10 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  , addrNxt);.    
1ba20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53    }.      if( zS
1ba30 74 61 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20  tartAff ){.     
1ba40 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
1ba50 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52  mpareAffinity(pR
1ba60 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b  ight, zStartAff[
1ba70 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46  nEq])==SQLITE_AF
1ba80 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20  F_NONE){.       
1ba90 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20     /* Since the 
1baa0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f  comparison is to
1bab0 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69   be performed wi
1bac0 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  th no conversion
1bad0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
1bae0 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70  pplied to the op
1baf0 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20  erands, set the 
1bb00 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c  affinity to appl
1bb10 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a  y to pRight to .
1bb20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c            ** SQL
1bb30 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a  ITE_AFF_NONE.  *
1bb40 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61  /.          zSta
1bb50 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c  rtAff[nEq] = SQL
1bb60 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
1bb70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1bb80 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e  if( sqlite3ExprN
1bb90 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
1bba0 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74  ange(pRight, zSt
1bbb0 61 72 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a  artAff[nEq]) ){.
1bbc0 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74            zStart
1bbd0 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
1bbe0 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
1bbf0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a      }.      }  .
1bc00 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
1bc10 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t++;.      testc
1bc20 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
1bc30 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1bc40 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
1bc50 7d 65 6c 73 65 20 69 66 28 20 69 73 4d 69 6e 51  }else if( isMinQ
1bc60 75 65 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71  uery ){.      sq
1bc70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1bc80 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
1bc90 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20  egBase+nEq);.   
1bca0 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b     nConstraint++
1bcb0 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45 71 20  ;.      startEq 
1bcc0 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74  = 0;.      start
1bcd0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31  _constraints = 1
1bce0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65  ;.    }.    code
1bcf0 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50  ApplyAffinity(pP
1bd00 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
1bd10 43 6f 6e 73 74 72 61 69 6e 74 2c 20 7a 53 74 61  Constraint, zSta
1bd20 72 74 41 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d  rtAff);.    op =
1bd30 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74   aStartOp[(start
1bd40 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29  _constraints<<2)
1bd50 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20   + (startEq<<1) 
1bd60 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61 73 73  + bRev];.    ass
1bd70 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20  ert( op!=0 );.  
1bd80 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1bd90 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20  OP_Rewind );.   
1bda0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1bdb0 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20 74 65  P_Last );.    te
1bdc0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
1bdd0 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 74 65 73  eekGt );.    tes
1bde0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
1bdf0 65 6b 47 65 20 29 3b 0a 20 20 20 20 74 65 73 74  ekGe );.    test
1be00 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
1be10 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63  kLe );.    testc
1be20 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
1be30 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Lt );.    sqlite
1be40 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
1be50 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61  , op, iIdxCur, a
1be60 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c  ddrNxt, regBase,
1be70 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 0a   nConstraint);..
1be80 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20      /* Load the 
1be90 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69 6e  value for the in
1bea0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1beb0 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f  int at the end o
1bec0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e  f the.    ** ran
1bed0 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20  ge (if any)..   
1bee0 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61   */.    nConstra
1bef0 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69  int = nEq;.    i
1bf00 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a  f( pRangeEnd ){.
1bf10 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
1bf20 68 74 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e  ht = pRangeEnd->
1bf30 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
1bf40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1bf50 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
1bf60 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  se, regBase+nEq,
1bf70 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
1bf80 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
1bf90 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  e, pRight, regBa
1bfa0 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69  se+nEq);.      i
1bfb0 66 28 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77  f( (pRangeEnd->w
1bfc0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
1bfd0 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)==0 ){.     
1bfe0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1bff0 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20  deIsNullJump(v, 
1c000 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
1c010 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  nEq, addrNxt);. 
1c020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1c030 20 7a 45 6e 64 41 66 66 20 29 7b 0a 20 20 20 20   zEndAff ){.    
1c040 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
1c050 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
1c060 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e  Right, zEndAff[n
1c070 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46  Eq])==SQLITE_AFF
1c080 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20  _NONE){.        
1c090 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63    /* Since the c
1c0a0 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20  omparison is to 
1c0b0 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74  be performed wit
1c0c0 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73  h no conversions
1c0d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70  .          ** ap
1c0e0 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65  plied to the ope
1c0f0 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61  rands, set the a
1c100 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79  ffinity to apply
1c110 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20   to pRight to . 
1c120 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49           ** SQLI
1c130 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f  TE_AFF_NONE.  */
1c140 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41  .          zEndA
1c150 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
1c160 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
1c170 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1c180 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
1c190 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
1c1a0 65 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66  e(pRight, zEndAf
1c1b0 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20  f[nEq]) ){.     
1c1c0 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71       zEndAff[nEq
1c1d0 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
1c1e0 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
1c1f0 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20 63       }  .      c
1c200 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
1c210 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
1c220 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e 64 41 66 66  , nEq+1, zEndAff
1c230 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  );.      nConstr
1c240 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65  aint++;.      te
1c250 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
1c260 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
1c270 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
1c280 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
1c290 46 72 65 65 28 64 62 2c 20 7a 53 74 61 72 74 41  Free(db, zStartA
1c2a0 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ff);.    sqlite3
1c2b0 44 62 46 72 65 65 28 64 62 2c 20 7a 45 6e 64 41  DbFree(db, zEndA
1c2c0 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70  ff);..    /* Top
1c2d0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64   of the loop bod
1c2e0 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d  y */.    pLevel-
1c2f0 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  >p2 = sqlite3Vdb
1c300 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1c310 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69  ..    /* Check i
1c320 66 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73  f the index curs
1c330 6f 72 20 69 73 20 70 61 73 74 20 74 68 65 20 65  or is past the e
1c340 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  nd of the range.
1c350 20 2a 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e   */.    op = aEn
1c360 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c  dOp[(pRangeEnd |
1c370 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b 20 62 52  | nEq) * (1 + bR
1c380 65 76 29 5d 3b 0a 20 20 20 20 74 65 73 74 63 61  ev)];.    testca
1c390 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20  se( op==OP_Noop 
1c3a0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1c3b0 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b   op==OP_IdxGE );
1c3c0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
1c3d0 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20  p==OP_IdxLT );. 
1c3e0 20 20 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f     if( op!=OP_No
1c3f0 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  op ){.      sqli
1c400 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
1c410 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c  (v, op, iIdxCur,
1c420 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73   addrNxt, regBas
1c430 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  e, nConstraint);
1c440 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1c450 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 65 6e  beChangeP5(v, en
1c460 64 45 71 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b  dEq!=bRev ?1:0);
1c470 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1c480 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71  f there are ineq
1c490 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1c4a0 74 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74  ts, check that t
1c4b0 68 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20  he value.    ** 
1c4c0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
1c4d0 75 6d 6e 20 74 68 61 74 20 74 68 65 20 69 6e 65  umn that the ine
1c4e0 71 75 61 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e  quality contrain
1c4f0 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20  s is not NULL.. 
1c500 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20     ** If it is, 
1c510 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74  jump to the next
1c520 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
1c530 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  e loop..    */. 
1c540 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
1c550 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
1c560 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1c570 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1c580 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
1c590 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  T );.    testcas
1c5a0 65 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  e( pLoop->wsFlag
1c5b0 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
1c5c0 4d 49 54 20 29 3b 0a 20 20 20 20 69 66 28 20 28  MIT );.    if( (
1c5d0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1c5e0 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49   (WHERE_BTM_LIMI
1c5f0 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  T|WHERE_TOP_LIMI
1c600 54 29 29 21 3d 30 20 0a 20 20 20 20 20 26 26 20  T))!=0 .     && 
1c610 28 6a 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  (j = pIdx->aiCol
1c620 75 6d 6e 5b 6e 45 71 5d 29 3e 3d 30 20 0a 20 20  umn[nEq])>=0 .  
1c630 20 20 20 26 26 20 70 49 64 78 2d 3e 70 54 61 62     && pIdx->pTab
1c640 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e  le->aCol[j].notN
1c650 75 6c 6c 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20  ull==0 .    ){. 
1c660 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c670 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
1c680 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45  umn, iIdxCur, nE
1c690 71 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  q, r1);.      Vd
1c6a0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
1c6b0 73 22 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  s", pIdx->pTable
1c6c0 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  ->aCol[j].zName)
1c6d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c6e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1c6f0 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64  _IsNull, r1, add
1c700 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  rCont);.    }.  
1c710 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1c720 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1c730 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65  r1);..    /* See
1c740 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73  k the table curs
1c750 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20  or, if required 
1c760 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65  */.    disableTe
1c770 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67  rm(pLevel, pRang
1c780 65 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73  eStart);.    dis
1c790 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
1c7a0 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20   pRangeEnd);.   
1c7b0 20 69 66 28 20 6f 6d 69 74 54 61 62 6c 65 20 29   if( omitTable )
1c7c0 7b 0a 20 20 20 20 20 20 2f 2a 20 70 49 64 78 20  {.      /* pIdx 
1c7d0 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  is a covering in
1c7e0 64 65 78 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f  dex.  No need to
1c7f0 20 61 63 63 65 73 73 20 74 68 65 20 6d 61 69 6e   access the main
1c800 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 7d   table. */.    }
1c810 65 6c 73 65 20 69 66 28 20 48 61 73 52 6f 77 69  else if( HasRowi
1c820 64 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 20  d(pIdx->pTable) 
1c830 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52  ){.      iRowidR
1c840 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67  eg = iReleaseReg
1c850 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1c860 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
1c870 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c880 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52  ddOp2(v, OP_IdxR
1c890 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69  owid, iIdxCur, i
1c8a0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
1c8b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1c8c0 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
1c8d0 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
1c8e0 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
1c8f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1c900 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69  OP_Seek, iCur, i
1c910 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44  RowidReg);  /* D
1c920 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a  eferred seek */.
1c930 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c940 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71   Index *pPk = sq
1c950 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
1c960 6e 64 65 78 28 70 49 64 78 2d 3e 70 54 61 62 6c  ndex(pIdx->pTabl
1c970 65 29 3b 0a 20 20 20 20 20 20 69 52 6f 77 69 64  e);.      iRowid
1c980 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
1c990 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
1c9a0 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b  , pPk->nKeyCol);
1c9b0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
1c9c0 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  j<pPk->nKeyCol; 
1c9d0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20  j++){.        k 
1c9e0 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  = sqlite3ColumnO
1c9f0 66 49 6e 64 65 78 28 70 49 64 78 2c 20 70 50 6b  fIndex(pIdx, pPk
1ca00 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b 0a  ->aiColumn[j]);.
1ca10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ca20 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1ca30 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c  Column, iIdxCur,
1ca40 20 6b 2c 20 69 52 6f 77 69 64 52 65 67 2b 6a 29   k, iRowidReg+j)
1ca50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ca60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ca70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  4Int(v, OP_NotFo
1ca80 75 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72 43  und, iCur, addrC
1ca90 6f 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ont,.           
1caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cab0 69 52 6f 77 69 64 52 65 67 2c 20 70 50 6b 2d 3e  iRowidReg, pPk->
1cac0 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a  nKeyCol);.    }.
1cad0 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  .    /* Record t
1cae0 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75  he instruction u
1caf0 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  sed to terminate
1cb00 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62   the loop. Disab
1cb10 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52 45  le .    ** WHERE
1cb20 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61   clause terms ma
1cb30 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20  de redundant by 
1cb40 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20  the index range 
1cb50 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  scan..    */.   
1cb60 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1cb70 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
1cb80 4f 57 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  OW ){.      pLev
1cb90 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  el->op = OP_Noop
1cba0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1cbb0 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4c  bRev ){.      pL
1cbc0 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72  evel->op = OP_Pr
1cbd0 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ev;.    }else{. 
1cbe0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
1cbf0 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 7d  = OP_Next;.    }
1cc00 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
1cc10 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 69  = iIdxCur;.    i
1cc20 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
1cc30 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54  gs & WHERE_CONST
1cc40 52 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20  RAINT)==0 ){.   
1cc50 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20     pLevel->p5 = 
1cc60 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
1cc70 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b  S_FULLSCAN_STEP;
1cc80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cc90 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
1cca0 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  ->p5==0 );.    }
1ccb0 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
1ccc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  f SQLITE_OMIT_OR
1ccd0 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
1cce0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1ccf0 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
1cd00 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  _OR ){.    /* Ca
1cd10 73 65 20 35 3a 20 20 54 77 6f 20 6f 72 20 6d 6f  se 5:  Two or mo
1cd20 72 65 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e  re separately in
1cd30 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e  dexed terms conn
1cd40 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20 20  ected by OR.    
1cd50 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  **.    ** Exampl
1cd60 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
1cd70 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1cd80 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20  t1(a,b,c,d);.   
1cd90 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
1cda0 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a  EX i1 ON t1(a);.
1cdb0 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
1cdc0 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62  INDEX i2 ON t1(b
1cdd0 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
1cde0 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74  TE INDEX i3 ON t
1cdf0 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  1(c);.    **.   
1ce00 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46   **   SELECT * F
1ce10 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35  ROM t1 WHERE a=5
1ce20 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31 31   OR b=7 OR (c=11
1ce30 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20 2a   AND d=13).    *
1ce40 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65 20  *.    ** In the 
1ce50 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20 61  example, there a
1ce60 72 65 20 74 68 72 65 65 20 69 6e 64 65 78 65 64  re three indexed
1ce70 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64   terms connected
1ce80 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54   by OR..    ** T
1ce90 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f  he top of the lo
1cea0 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68  op looks like th
1ceb0 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  is:.    **.    *
1cec0 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20  *          Null 
1ced0 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
1cee0 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68         # Zero th
1cef0 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20  e rowset in reg 
1cf00 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  1.    **.    ** 
1cf10 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 69  Then, for each i
1cf20 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74 68 65  ndexed term, the
1cf30 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20   following. The 
1cf40 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20  arguments to.   
1cf50 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74 20 61   ** RowSetTest a
1cf60 72 65 20 73 75 63 68 20 74 68 61 74 20 74 68 65  re such that the
1cf70 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63 75   rowid of the cu
1cf80 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69 6e 73  rrent row is ins
1cf90 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74  erted.    ** int
1cfa0 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20 49 66  o the RowSet. If
1cfb0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 70   it is already p
1cfc0 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20  resent, control 
1cfd0 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20 2a 2a  skips the.    **
1cfe0 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20 61 6e   Gosub opcode an
1cff0 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67 68 74  d jumps straight
1d000 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
1d010 65 72 61 74 65 64 20 62 79 20 57 68 65 72 65 45  erated by WhereE
1d020 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  nd()..    **.   
1d030 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74   **        sqlit
1d040 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c 74 65  e3WhereBegin(<te
1d050 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20 20  rm>).    **     
1d060 20 20 20 20 20 52 6f 77 53 65 74 54 65 73 74 20       RowSetTest 
1d070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d080 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69 64 20   # Insert rowid 
1d090 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20 20 20  into rowset.    
1d0a0 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 73 75  **          Gosu
1d0b0 62 20 20 20 20 20 20 32 20 41 0a 20 20 20 20 2a  b      2 A.    *
1d0c0 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  *        sqlite3
1d0d0 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20 20 2a  WhereEnd().    *
1d0e0 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69  *.    ** Followi
1d0f0 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20 63 6f  ng the above, co
1d100 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  de to terminate 
1d110 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20  the loop. Label 
1d120 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a 20 20  A, the target.  
1d130 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73 75    ** of the Gosu
1d140 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74  b above, jumps t
1d150 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  o the instructio
1d160 6e 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  n right after th
1d170 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20  e Goto..    **. 
1d180 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e     **          N
1d190 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20  ull       1     
1d1a0 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72             # Zer
1d1b0 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20  o the rowset in 
1d1c0 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20 20 20  reg 1.    **    
1d1d0 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20        Goto      
1d1e0 20 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20   B              
1d1f0 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69 73 20    # The loop is 
1d200 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a  finished..    **
1d210 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 3a  .    **       A:
1d220 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20   <loop body>    
1d230 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 52               # R
1d240 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68 61 74  eturn data, what
1d250 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ever..    **.   
1d260 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 65 74   **          Ret
1d270 75 72 6e 20 20 20 20 20 32 20 20 20 20 20 20 20  urn     2       
1d280 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d 70 20           # Jump 
1d290 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f 73 75  back to the Gosu
1d2a0 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  b.    **.    ** 
1d2b0 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65 72 20        B: <after 
1d2c0 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a  the loop>.    **
1d2d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68 65 72  .    */.    Wher
1d2e0 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20  eClause *pOrWc; 
1d2f0 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61     /* The OR-cla
1d300 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69  use broken out i
1d310 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a  nto subterms */.
1d320 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4f 72      SrcList *pOr
1d330 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 53 68  Tab;       /* Sh
1d340 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20 6c 69  ortened table li
1d350 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73 65 20  st or OR-clause 
1d360 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  generation */.  
1d370 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 20 3d 20    Index *pCov = 
1d380 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
1d390 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f 76 65  * Potential cove
1d3a0 72 69 6e 67 20 69 6e 64 65 78 20 28 6f 72 20 4e  ring index (or N
1d3b0 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ULL) */.    int 
1d3c0 69 43 6f 76 43 75 72 20 3d 20 70 50 61 72 73 65  iCovCur = pParse
1d3d0 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20 43 75  ->nTab++;  /* Cu
1d3e0 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 69 6e  rsor used for in
1d3f0 64 65 78 20 73 63 61 6e 73 20 28 69 66 20 61 6e  dex scans (if an
1d400 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72  y) */..    int r
1d410 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
1d420 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20  rse->nMem;      
1d430 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
1d440 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f 47 6f   used with OP_Go
1d450 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  sub */.    int r
1d460 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20 20 20  egRowset = 0;   
1d470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d480 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
1d490 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a 65   for RowSet obje
1d4a0 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ct */.    int re
1d4b0 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20  gRowid = 0;     
1d4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4d0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
1d4e0 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f  holding rowid */
1d4f0 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f  .    int iLoopBo
1d500 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dy = sqlite3Vdbe
1d510 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f  MakeLabel(v);  /
1d520 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20  * Start of loop 
1d530 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  body */.    int 
1d540 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20 20 20  iRetInit;       
1d550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d560 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1d570 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20 69 6e   of regReturn in
1d580 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e  it */.    int un
1d590 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 30 3b  testedTerms = 0;
1d5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d5b0 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20 63  Some terms not c
1d5c0 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74 65 64  ompletely tested
1d5d0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20   */.    int ii; 
1d5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1d600 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1d610 20 20 45 78 70 72 20 2a 70 41 6e 64 45 78 70 72    Expr *pAndExpr
1d620 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1d630 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e 20 41       /* An ".. A
1d640 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73  ND (...)" expres
1d650 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a 20 20 20 20  sion */.   .    
1d660 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61  pTerm = pLoop->a
1d670 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73  LTerm[0];.    as
1d680 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
1d690 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
1d6a0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1d6b0 20 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73   WO_OR );.    as
1d6c0 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74  sert( (pTerm->wt
1d6d0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49  Flags & TERM_ORI
1d6e0 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20 70  NFO)!=0 );.    p
1d6f0 4f 72 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75  OrWc = &pTerm->u
1d700 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  .pOrInfo->wc;.  
1d710 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
1d720 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c  P_Return;.    pL
1d730 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65  evel->p1 = regRe
1d740 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  turn;..    /* Se
1d750 74 20 75 70 20 61 20 6e 65 77 20 53 72 63 4c 69  t up a new SrcLi
1d760 73 74 20 69 6e 20 70 4f 72 54 61 62 20 63 6f 6e  st in pOrTab con
1d770 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
1d780 65 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 0a  e being scanned.
1d790 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 6c      ** by this l
1d7a0 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b 30 5d 20  oop in the a[0] 
1d7b0 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f 74  slot and all not
1d7c0 52 65 61 64 79 20 74 61 62 6c 65 73 20 69 6e 20  Ready tables in 
1d7d0 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20  a[1..] slots..  
1d7e0 20 20 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d 65    ** This become
1d7f0 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69 6e  s the SrcList in
1d800 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63   the recursive c
1d810 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
1d820 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 20 20  ereBegin()..    
1d830 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  */.    if( pWInf
1d840 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a 20  o->nLevel>1 ){. 
1d850 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65 61       int nNotRea
1d860 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dy;             
1d870 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
1d880 72 20 6f 66 20 6e 6f 74 52 65 61 64 79 20 74 61  r of notReady ta
1d890 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 74  bles */.      st
1d8a0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1d8b0 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20 20 20 20  m *origSrc;     
1d8c0 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73 74  /* Original list
1d8d0 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
1d8e0 20 20 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d 20      nNotReady = 
1d8f0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d  pWInfo->nLevel -
1d900 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20   iLevel - 1;.   
1d910 20 20 20 70 4f 72 54 61 62 20 3d 20 73 71 6c 69     pOrTab = sqli
1d920 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77  te3StackAllocRaw
1d930 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  (db,.           
1d940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d950 20 73 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29   sizeof(*pOrTab)
1d960 2b 20 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65  + nNotReady*size
1d970 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29  of(pOrTab->a[0])
1d980 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
1d990 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
1d9a0 6e 6f 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20  notReady;.      
1d9b0 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d  pOrTab->nAlloc =
1d9c0 20 28 75 38 29 28 6e 4e 6f 74 52 65 61 64 79 20   (u8)(nNotReady 
1d9d0 2b 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54  + 1);.      pOrT
1d9e0 61 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61  ab->nSrc = pOrTa
1d9f0 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20  b->nAlloc;.     
1da00 20 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e   memcpy(pOrTab->
1da10 61 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a  a, pTabItem, siz
1da20 65 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b  eof(*pTabItem));
1da30 0a 20 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d  .      origSrc =
1da40 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
1da50 74 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28  t->a;.      for(
1da60 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64  k=1; k<=nNotRead
1da70 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; k++){.       
1da80 20 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d   memcpy(&pOrTab-
1da90 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b  >a[k], &origSrc[
1daa0 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d  pLevel[k].iFrom]
1dab0 2c 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d  , sizeof(pOrTab-
1dac0 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d  >a[k]));.      }
1dad0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1dae0 20 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66    pOrTab = pWInf
1daf0 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20  o->pTabList;.   
1db00 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69   }..    /* Initi
1db10 61 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74  alize the rowset
1db20 20 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e   register to con
1db30 74 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51  tain NULL. An SQ
1db40 4c 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a  L NULL is .    *
1db50 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  * equivalent to 
1db60 61 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e  an empty rowset.
1db70 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
1db80 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72  lso initialize r
1db90 65 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74  egReturn to cont
1dba0 61 69 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  ain the address 
1dbb0 6f 66 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  of the instructi
1dbc0 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64  on .    ** immed
1dbd0 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
1dbe0 20 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61   the OP_Return a
1dbf0 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  t the bottom of 
1dc00 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20  the loop. This. 
1dc10 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
1dc20 64 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75  d in a few obscu
1dc30 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73  re LEFT JOIN cas
1dc40 65 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c  es where control
1dc50 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76   jumps.    ** ov
1dc60 65 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  er the top of th
1dc70 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20  e loop into the 
1dc80 62 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74  body of it. In t
1dc90 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 20 20  his case the .  
1dca0 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73    ** correct res
1dcb0 70 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e  ponse for the en
1dcc0 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28  d-of-loop code (
1dcd0 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69  the OP_Return) i
1dce0 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c  s to .    ** fal
1dcf0 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
1dd00 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
1dd10 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50  n, just as an OP
1dd20 5f 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20  _Next does if.  
1dd30 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61    ** called on a
1dd40 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  n uninitialized 
1dd50 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  cursor..    */. 
1dd60 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
1dd70 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1dd80 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b  RE_DUPLICATES_OK
1dd90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
1dda0 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72  gRowset = ++pPar
1ddb0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1ddc0 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61  regRowid = ++pPa
1ddd0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
1dde0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ddf0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1de00 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a 20 20  , regRowset);.  
1de10 20 20 7d 0a 20 20 20 20 69 52 65 74 49 6e 69 74    }.    iRetInit
1de20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1de30 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1de40 65 72 2c 20 30 2c 20 72 65 67 52 65 74 75 72 6e  er, 0, regReturn
1de50 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
1de60 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45  e original WHERE
1de70 20 63 6c 61 75 73 65 20 69 73 20 7a 20 6f 66 20   clause is z of 
1de80 74 68 65 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f  the form:  (x1 O
1de90 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44  R x2 OR ...) AND
1dea0 20 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 66   y.    ** Then f
1deb0 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 78 4e  or every term xN
1dec0 2c 20 65 76 61 6c 75 61 74 65 20 61 73 20 74 68  , evaluate as th
1ded0 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 3a  e subexpression:
1dee0 20 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a   xN AND z.    **
1def0 20 54 68 61 74 20 77 61 79 2c 20 74 65 72 6d 73   That way, terms
1df00 20 69 6e 20 79 20 74 68 61 74 20 61 72 65 20 66   in y that are f
1df10 61 63 74 6f 72 65 64 20 69 6e 74 6f 20 74 68 65  actored into the
1df20 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c   disjunction wil
1df30 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 69 63 6b  l.    ** be pick
1df40 65 64 20 75 70 20 62 79 20 74 68 65 20 72 65 63  ed up by the rec
1df50 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20  ursive calls to 
1df60 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1df70 6e 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a  n() below..    *
1df80 2a 0a 20 20 20 20 2a 2a 20 41 63 74 75 61 6c 6c  *.    ** Actuall
1df90 79 2c 20 65 61 63 68 20 73 75 62 65 78 70 72 65  y, each subexpre
1dfa0 73 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65 72 74  ssion is convert
1dfb0 65 64 20 74 6f 20 22 78 4e 20 41 4e 44 20 77 22  ed to "xN AND w"
1dfc0 20 77 68 65 72 65 20 77 20 69 73 0a 20 20 20 20   where w is.    
1dfd0 2a 2a 20 74 68 65 20 22 69 6e 74 65 72 65 73 74  ** the "interest
1dfe0 69 6e 67 22 20 74 65 72 6d 73 20 6f 66 20 7a 20  ing" terms of z 
1dff0 2d 20 74 65 72 6d 73 20 74 68 61 74 20 64 69 64  - terms that did
1e000 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69   not originate i
1e010 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 4e 20  n the.    ** ON 
1e020 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
1e030 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20  of a LEFT JOIN, 
1e040 61 6e 64 20 74 65 72 6d 73 20 74 68 61 74 20 61  and terms that a
1e050 72 65 20 75 73 61 62 6c 65 20 61 73 20 0a 20 20  re usable as .  
1e060 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a 20 20    ** indices..  
1e070 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
1e080 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c   optimization al
1e090 73 6f 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20  so only applies 
1e0a0 69 66 20 74 68 65 20 28 78 31 20 4f 52 20 78 32  if the (x1 OR x2
1e0b0 20 4f 52 20 2e 2e 2e 29 20 74 65 72 6d 0a 20 20   OR ...) term.  
1e0c0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74    ** is not cont
1e0d0 61 69 6e 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  ained in the ON 
1e0e0 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54  clause of a LEFT
1e0f0 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20 53 65   JOIN..    ** Se
1e100 65 20 74 69 63 6b 65 74 20 68 74 74 70 3a 2f 2f  e ticket http://
1e110 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73  www.sqlite.org/s
1e120 72 63 2f 69 6e 66 6f 2f 66 32 33 36 39 33 30 34  rc/info/f2369304
1e130 65 34 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e4.    */.    if
1e140 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29  ( pWC->nTerm>1 )
1e150 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 65 72  {.      int iTer
1e160 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 54 65  m;.      for(iTe
1e170 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d  rm=0; iTerm<pWC-
1e180 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29  >nTerm; iTerm++)
1e190 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
1e1a0 70 45 78 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69  pExpr = pWC->a[i
1e1b0 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20  Term].pExpr;.   
1e1c0 20 20 20 20 20 69 66 28 20 26 70 57 43 2d 3e 61       if( &pWC->a
1e1d0 5b 69 54 65 72 6d 5d 20 3d 3d 20 70 54 65 72 6d  [iTerm] == pTerm
1e1e0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e1f0 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
1e200 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1e210 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63  EP_FromJoin) ) c
1e220 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1e230 20 69 66 28 20 70 57 43 2d 3e 61 5b 69 54 65 72   if( pWC->a[iTer
1e240 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m].wtFlags & (TE
1e250 52 4d 5f 4f 52 49 4e 46 4f 29 20 29 20 63 6f 6e  RM_ORINFO) ) con
1e260 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
1e270 66 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d  f( (pWC->a[iTerm
1e280 5d 2e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ].eOperator & WO
1e290 5f 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74 69  _ALL)==0 ) conti
1e2a0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45 78  nue;.        pEx
1e2b0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
1e2c0 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
1e2d0 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45  );.        pAndE
1e2e0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1e2f0 72 41 6e 64 28 64 62 2c 20 70 41 6e 64 45 78 70  rAnd(db, pAndExp
1e300 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  r, pExpr);.     
1e310 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e   }.      if( pAn
1e320 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  dExpr ){.       
1e330 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69   pAndExpr = sqli
1e340 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
1e350 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64   TK_AND, 0, pAnd
1e360 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
1e370 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  }.    }..    for
1e380 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d  (ii=0; ii<pOrWc-
1e390 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20  >nTerm; ii++){. 
1e3a0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
1e3b0 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63  pOrTerm = &pOrWc
1e3c0 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69  ->a[ii];.      i
1e3d0 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
1e3e0 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20  Cursor==iCur || 
1e3f0 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61  (pOrTerm->eOpera
1e400 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30  tor & WO_AND)!=0
1e410 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72   ){.        Wher
1e420 65 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f  eInfo *pSubWInfo
1e430 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
1e440 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52  fo for single OR
1e450 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20  -term scan */.  
1e460 20 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72 45        Expr *pOrE
1e470 78 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70  xpr = pOrTerm->p
1e480 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66  Expr;.        if
1e490 28 20 70 41 6e 64 45 78 70 72 20 26 26 20 21 45  ( pAndExpr && !E
1e4a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1e4b0 4f 72 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  OrExpr, EP_FromJ
1e4c0 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oin) ){.        
1e4d0 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66    pAndExpr->pLef
1e4e0 74 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20 20  t = pOrExpr;.   
1e4f0 20 20 20 20 20 20 20 70 4f 72 45 78 70 72 20 3d         pOrExpr =
1e500 20 70 41 6e 64 45 78 70 72 3b 0a 20 20 20 20 20   pAndExpr;.     
1e510 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
1e520 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62  Loop through tab
1e530 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  le entries that 
1e540 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65  match term pOrTe
1e550 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  rm. */.        p
1e560 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74  SubWInfo = sqlit
1e570 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
1e580 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72  rse, pOrTab, pOr
1e590 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20  Expr, 0, 0,.    
1e5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5b0 20 20 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f      WHERE_OMIT_O
1e5c0 50 45 4e 5f 43 4c 4f 53 45 20 7c 20 57 48 45 52  PEN_CLOSE | WHER
1e5d0 45 5f 41 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20  E_AND_ONLY |.   
1e5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5f0 20 20 20 20 20 57 48 45 52 45 5f 46 4f 52 43 45       WHERE_FORCE
1e600 5f 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f  _TABLE | WHERE_O
1e610 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 2c 20 69 43  NETABLE_ONLY, iC
1e620 6f 76 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20  ovCur);.        
1e630 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66  assert( pSubWInf
1e640 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  o || pParse->nEr
1e650 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
1e660 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
1e670 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29   if( pSubWInfo )
1e680 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72  {.          Wher
1e690 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f 70 3b  eLoop *pSubLoop;
1e6a0 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61  .          expla
1e6b0 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20  inOneScan(.     
1e6c0 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
1e6d0 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57 49   pOrTab, &pSubWI
1e6e0 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65  nfo->a[0], iLeve
1e6f0 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  l, pLevel->iFrom
1e700 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20 29 3b  , 0.          );
1e710 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
1e720 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
1e730 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49  gs & WHERE_DUPLI
1e740 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a  CATES_OK)==0 ){.
1e750 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1e760 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72  iSet = ((ii==pOr
1e770 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a  Wc->nTerm-1)?-1:
1e780 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ii);.           
1e790 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20   int r;.        
1e7a0 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 45      r = sqlite3E
1e7b0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1e7c0 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65  (pParse, pTabIte
1e7d0 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43 75  m->pTab, -1, iCu
1e7e0 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  r, .            
1e7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e800 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
1e810 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20 20  Rowid, 0);.     
1e820 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1e830 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
1e840 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72 65  P_RowSetTest, re
1e850 67 52 6f 77 73 65 74 2c 0a 20 20 20 20 20 20 20  gRowset,.       
1e860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e870 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e880 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1e890 28 76 29 2b 32 2c 20 72 2c 20 69 53 65 74 29 3b  (v)+2, r, iSet);
1e8a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1e8b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1e8c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1e8d0 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e 2c  osub, regReturn,
1e8e0 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20   iLoopBody);..  
1e8f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1e900 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  SubWInfo->untest
1e910 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65 61  edTerms flag mea
1e920 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f 52 20  ns that this OR 
1e930 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a  term.          *
1e940 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20  * contained one 
1e950 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d  or more AND term
1e960 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79   from a notReady
1e970 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20 20   table.  The.   
1e980 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 20         ** terms 
1e990 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61 64  from the notRead
1e9a0 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f  y table could no
1e9b0 74 20 62 65 20 74 65 73 74 65 64 20 61 6e 64 20  t be tested and 
1e9c0 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a  will.          *
1e9d0 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65 73  * need to be tes
1e9e0 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20 20  ted later..     
1e9f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1ea00 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 2d    if( pSubWInfo-
1ea10 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29  >untestedTerms )
1ea20 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d   untestedTerms =
1ea30 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f   1;..          /
1ea40 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
1ea50 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72  OR-connected ter
1ea60 6d 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65 64  ms are optimized
1ea70 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a   using the same.
1ea80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64            ** ind
1ea90 65 78 2c 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ex, and the inde
1eaa0 78 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e  x is opened usin
1eab0 67 20 74 68 65 20 73 61 6d 65 20 63 75 72 73 6f  g the same curso
1eac0 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20  r number.       
1ead0 20 20 20 2a 2a 20 62 79 20 65 61 63 68 20 63 61     ** by each ca
1eae0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ll to sqlite3Whe
1eaf0 72 65 42 65 67 69 6e 28 29 20 6d 61 64 65 20 62  reBegin() made b
1eb00 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74 20  y this loop, it 
1eb10 6d 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  may.          **
1eb20 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
1eb30 75 73 65 20 74 68 61 74 20 69 6e 64 65 78 20 61  use that index a
1eb40 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
1eb50 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ex..          **
1eb60 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
1eb70 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
1eb80 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
1eb90 20 61 62 6f 76 65 20 72 65 73 75 6c 74 65 64 20   above resulted 
1eba0 69 6e 20 61 20 73 63 61 6e 20 74 68 61 74 0a 20  in a scan that. 
1ebb0 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 73           ** uses
1ebc0 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20 74   an index, and t
1ebd0 68 69 73 20 69 73 20 65 69 74 68 65 72 20 74 68  his is either th
1ebe0 65 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e 65  e first OR-conne
1ebf0 63 74 65 64 20 74 65 72 6d 0a 20 20 20 20 20 20  cted term.      
1ec00 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64      ** processed
1ec10 20 6f 72 20 74 68 65 20 69 6e 64 65 78 20 69 73   or the index is
1ec20 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 61   the same as tha
1ec30 74 20 75 73 65 64 20 62 79 20 61 6c 6c 20 70 72  t used by all pr
1ec40 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20  evious.         
1ec50 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74 20 70   ** terms, set p
1ec60 43 6f 76 20 74 6f 20 74 68 65 20 63 61 6e 64 69  Cov to the candi
1ec70 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e  date covering in
1ec80 64 65 78 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  dex. Otherwise, 
1ec90 73 65 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a  set .          *
1eca0 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20 74  * pCov to NULL t
1ecb0 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
1ecc0 6e 6f 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76  no candidate cov
1ecd0 65 72 69 6e 67 20 69 6e 64 65 78 20 77 69 6c 6c  ering index will
1ece0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62   .          ** b
1ecf0 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20 20  e available..   
1ed00 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1ed10 20 20 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20 70      pSubLoop = p
1ed20 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70  SubWInfo->a[0].p
1ed30 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20  WLoop;.         
1ed40 20 61 73 73 65 72 74 28 20 28 70 53 75 62 4c 6f   assert( (pSubLo
1ed50 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1ed60 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d  ERE_AUTO_INDEX)=
1ed70 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
1ed80 69 66 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77  if( (pSubLoop->w
1ed90 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1eda0 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20  NDEXED)!=0.     
1edb0 20 20 20 20 20 20 26 26 20 28 69 69 3d 3d 30 20        && (ii==0 
1edc0 7c 7c 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62  || pSubLoop->u.b
1edd0 74 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70 43 6f  tree.pIndex==pCo
1ede0 76 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  v).          ){.
1edf0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1ee00 72 74 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61  rt( pSubWInfo->a
1ee10 5b 30 5d 2e 69 49 64 78 43 75 72 3d 3d 69 43 6f  [0].iIdxCur==iCo
1ee20 76 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20  vCur );.        
1ee30 20 20 20 20 70 43 6f 76 20 3d 20 70 53 75 62 4c      pCov = pSubL
1ee40 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
1ee50 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  dex;.          }
1ee60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1ee70 20 20 70 43 6f 76 20 3d 20 30 3b 0a 20 20 20 20    pCov = 0;.    
1ee80 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1ee90 20 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68 65     /* Finish the
1eea0 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61   loop through ta
1eeb0 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74  ble entries that
1eec0 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54   match term pOrT
1eed0 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  erm. */.        
1eee0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
1eef0 64 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20  d(pSubWInfo);.  
1ef00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1ef10 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
1ef20 2d 3e 75 2e 70 43 6f 76 69 64 78 20 3d 20 70 43  ->u.pCovidx = pC
1ef30 6f 76 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 76  ov;.    if( pCov
1ef40 20 29 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   ) pLevel->iIdxC
1ef50 75 72 20 3d 20 69 43 6f 76 43 75 72 3b 0a 20 20  ur = iCovCur;.  
1ef60 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29    if( pAndExpr )
1ef70 7b 0a 20 20 20 20 20 20 70 41 6e 64 45 78 70 72  {.      pAndExpr
1ef80 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20  ->pLeft = 0;.   
1ef90 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
1efa0 6c 65 74 65 28 64 62 2c 20 70 41 6e 64 45 78 70  lete(db, pAndExp
1efb0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
1efc0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1efd0 31 28 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73  1(v, iRetInit, s
1efe0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1eff0 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73  tAddr(v));.    s
1f000 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1f010 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1f020 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
1f030 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1f040 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1f050 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20   iLoopBody);..  
1f060 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c    if( pWInfo->nL
1f070 65 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33  evel>1 ) sqlite3
1f080 53 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70 4f  StackFree(db, pO
1f090 72 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20 21  rTab);.    if( !
1f0a0 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20  untestedTerms ) 
1f0b0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1f0c0 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65  el, pTerm);.  }e
1f0d0 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
1f0e0 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
1f0f0 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20  IMIZATION */..  
1f100 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 36 3a  {.    /* Case 6:
1f110 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73    There is no us
1f120 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20  able index.  We 
1f130 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65  must do a comple
1f140 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  te.    **       
1f150 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65     scan of the e
1f160 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20  ntire table..   
1f170 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
1f180 6f 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d 20  onst u8 aStep[] 
1f190 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f  = { OP_Next, OP_
1f1a0 50 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61 74  Prev };.    stat
1f1b0 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61  ic const u8 aSta
1f1c0 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69  rt[] = { OP_Rewi
1f1d0 6e 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20  nd, OP_Last };. 
1f1e0 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76 3d     assert( bRev=
1f1f0 3d 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b  =0 || bRev==1 );
1f200 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1f210 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20  = aStep[bRev];. 
1f220 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1f230 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
1f240 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74  ->p2 = 1 + sqlit
1f250 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1f260 61 53 74 61 72 74 5b 62 52 65 76 5d 2c 20 69 43  aStart[bRev], iC
1f270 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20  ur, addrBrk);.  
1f280 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53    pLevel->p5 = S
1f290 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
1f2a0 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a  _FULLSCAN_STEP;.
1f2b0 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74    }..  /* Insert
1f2c0 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76   code to test ev
1f2d0 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69 6f  ery subexpressio
1f2e0 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f  n that can be co
1f2f0 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f  mpletely.  ** co
1f300 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68 65  mputed using the
1f310 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20   current set of 
1f320 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66  tables..  */.  f
1f330 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
1f340 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a   j=pWC->nTerm; j
1f350 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b  >0; j--, pTerm++
1f360 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b  ){.    Expr *pE;
1f370 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1f380 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1f390 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
1f3a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1f3b0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
1f3c0 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20  ERM_CODED );.   
1f3d0 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
1f3e0 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
1f3f0 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
1f400 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1f410 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
1f420 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e  eqAll & pLevel->
1f430 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a  notReady)!=0 ){.
1f440 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f450 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
1f460 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20  Terms==0.       
1f470 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e          && (pWIn
1f480 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
1f490 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
1f4a0 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20 20  ONLY)!=0 );.    
1f4b0 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74    pWInfo->untest
1f4c0 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20  edTerms = 1;.   
1f4d0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1f4e0 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72   }.    pE = pTer
1f4f0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  m->pExpr;.    as
1f500 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20  sert( pE!=0 );. 
1f510 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
1f520 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70  LeftJoin && !Exp
1f530 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c  rHasProperty(pE,
1f540 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
1f550 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
1f560 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1f570 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1f580 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43 6f  arse, pE, addrCo
1f590 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nt, SQLITE_JUMPI
1f5a0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65 72  FNULL);.    pTer
1f5b0 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
1f5c0 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20  RM_CODED;.  }.. 
1f5d0 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20   /* Insert code 
1f5e0 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6d 70 6c  to test for impl
1f5f0 69 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ied constraints 
1f600 62 61 73 65 64 20 6f 6e 20 74 72 61 6e 73 69 74  based on transit
1f610 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74 68  ivity.  ** of th
1f620 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72 2e  e "==" operator.
1f630 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70  .  **.  ** Examp
1f640 6c 65 3a 20 49 66 20 74 68 65 20 57 48 45 52 45  le: If the WHERE
1f650 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
1f660 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e 64   "t1.a=t2.b" and
1f670 20 22 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a 2a   "t2.b=123".  **
1f680 20 61 6e 64 20 77 65 20 61 72 65 20 63 6f 64 69   and we are codi
1f690 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61  ng the t1 loop a
1f6a0 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 68  nd the t2 loop h
1f6b0 61 73 20 6e 6f 74 20 79 65 74 20 63 6f 64 65 64  as not yet coded
1f6c0 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65 20 63  ,.  ** then we c
1f6d0 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20 22 74  annot use the "t
1f6e0 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74 72  1.a=t2.b" constr
1f6f0 61 69 6e 74 2c 20 62 75 74 20 77 65 20 63 61 6e  aint, but we can
1f700 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20 69   code.  ** the i
1f710 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d 31 32 33  mplied "t1.a=123
1f720 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20  " constraint..  
1f730 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  */.  for(pTerm=p
1f740 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54  WC->a, j=pWC->nT
1f750 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  erm; j>0; j--, p
1f760 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Term++){.    Exp
1f770 72 20 2a 70 45 2c 20 2a 70 45 41 6c 74 3b 0a 20  r *pE, *pEAlt;. 
1f780 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41     WhereTerm *pA
1f790 6c 74 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  lt;.    if( pTer
1f7a0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
1f7b0 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
1f7c0 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
1f7d0 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
1f7e0 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28 57 4f  ->eOperator!=(WO
1f7f0 5f 45 51 55 49 56 7c 57 4f 5f 45 51 29 20 29 20  _EQUIV|WO_EQ) ) 
1f800 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
1f810 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
1f820 73 6f 72 21 3d 69 43 75 72 20 29 20 63 6f 6e 74  sor!=iCur ) cont
1f830 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4c  inue;.    if( pL
1f840 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
1f850 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1f860 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
1f870 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  r;.    assert( !
1f880 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1f890 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pE, EP_FromJoin)
1f8a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1f8b0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
1f8c0 67 68 74 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f  ght & pLevel->no
1f8d0 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a 20 20  tReady)!=0 );.  
1f8e0 20 20 70 41 6c 74 20 3d 20 66 69 6e 64 54 65 72    pAlt = findTer
1f8f0 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 54 65  m(pWC, iCur, pTe
1f900 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
1f910 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45  , notReady, WO_E
1f920 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20  Q|WO_IN, 0);.   
1f930 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29 20 63   if( pAlt==0 ) c
1f940 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
1f950 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20 26   pAlt->wtFlags &
1f960 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20   (TERM_CODED) ) 
1f970 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 74 65  continue;.    te
1f980 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f  stcase( pAlt->eO
1f990 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
1f9a0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1f9b0 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72   pAlt->eOperator
1f9c0 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
1f9d0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1f9e0 28 76 2c 20 22 62 65 67 69 6e 20 74 72 61 6e 73  (v, "begin trans
1f9f0 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74  itive constraint
1fa00 22 29 29 3b 0a 20 20 20 20 70 45 41 6c 74 20 3d  "));.    pEAlt =
1fa10 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c   sqlite3StackAll
1fa20 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
1fa30 28 2a 70 45 41 6c 74 29 29 3b 0a 20 20 20 20 69  (*pEAlt));.    i
1fa40 66 28 20 70 45 41 6c 74 20 29 7b 0a 20 20 20 20  f( pEAlt ){.    
1fa50 20 20 2a 70 45 41 6c 74 20 3d 20 2a 70 41 6c 74    *pEAlt = *pAlt
1fa60 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70  ->pExpr;.      p
1fa70 45 41 6c 74 2d 3e 70 4c 65 66 74 20 3d 20 70 45  EAlt->pLeft = pE
1fa80 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73  ->pLeft;.      s
1fa90 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1faa0 65 28 70 50 61 72 73 65 2c 20 70 45 41 6c 74 2c  e(pParse, pEAlt,
1fab0 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
1fac0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1fad0 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 63       sqlite3Stac
1fae0 6b 46 72 65 65 28 64 62 2c 20 70 45 41 6c 74 29  kFree(db, pEAlt)
1faf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1fb00 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54  * For a LEFT OUT
1fb10 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74  ER JOIN, generat
1fb20 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
1fb30 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
1fb40 20 74 68 61 74 0a 20 20 2a 2a 20 61 74 20 6c 65   that.  ** at le
1fb50 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74  ast one row of t
1fb60 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 68  he right table h
1fb70 61 73 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c  as matched the l
1fb80 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 2a  eft table.  .  *
1fb90 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  /.  if( pLevel->
1fba0 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
1fbb0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
1fbc0 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
1fbd0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1fbe0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1fbf0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1fc00 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e  ger, 1, pLevel->
1fc10 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
1fc20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1fc30 22 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49  "record LEFT JOI
1fc40 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20 73 71  N hit"));.    sq
1fc50 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
1fc60 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
1fc70 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
1fc80 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e  a, j=0; j<pWC->n
1fc90 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d  Term; j++, pTerm
1fca0 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ++){.      testc
1fcb0 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
1fcc0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1fcd0 41 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  AL );.      test
1fce0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
1fcf0 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
1fd00 44 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  D );.      if( p
1fd10 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1fd20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
1fd30 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
1fd40 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
1fd50 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
1fd60 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  l & pLevel->notR
1fd70 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20  eady)!=0 ){.    
1fd80 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e      assert( pWIn
1fd90 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
1fda0 73 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  s );.        con
1fdb0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
1fdc0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
1fdd0 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  rm->pExpr );.   
1fde0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1fdf0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54  False(pParse, pT
1fe00 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64 64 72  erm->pExpr, addr
1fe10 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
1fe20 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
1fe30 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
1fe40 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
1fe50 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1fe60 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1fe70 70 50 61 72 73 65 2c 20 69 52 65 6c 65 61 73 65  pParse, iRelease
1fe80 52 65 67 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Reg);..  return 
1fe90 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
1fea0 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
1feb0 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42  (WHERETRACE_ENAB
1fec0 4c 45 44 29 20 26 26 20 64 65 66 69 6e 65 64 28  LED) && defined(
1fed0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52  SQLITE_ENABLE_TR
1fee0 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a  EE_EXPLAIN)./*.*
1fef0 2a 20 47 65 6e 65 72 61 74 65 20 22 45 78 70 6c  * Generate "Expl
1ff00 61 6e 61 74 69 6f 6e 22 20 74 65 78 74 20 66 6f  anation" text fo
1ff10 72 20 61 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a  r a WhereTerm..*
1ff20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
1ff30 65 72 65 45 78 70 6c 61 69 6e 54 65 72 6d 28 56  ereExplainTerm(V
1ff40 64 62 65 20 2a 76 2c 20 57 68 65 72 65 54 65 72  dbe *v, WhereTer
1ff50 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 63 68 61  m *pTerm){.  cha
1ff60 72 20 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 6d 65  r zType[4];.  me
1ff70 6d 63 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e 2e  mcpy(zType, "...
1ff80 22 2c 20 34 29 3b 0a 20 20 69 66 28 20 70 54 65  ", 4);.  if( pTe
1ff90 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
1ffa0 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 7a 54 79  RM_VIRTUAL ) zTy
1ffb0 70 65 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20 69  pe[0] = 'V';.  i
1ffc0 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
1ffd0 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 20 20  tor & WO_EQUIV  
1ffe0 29 20 7a 54 79 70 65 5b 31 5d 20 3d 20 27 45 27  ) zType[1] = 'E'
1fff0 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
20000 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
20010 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
20020 6e 29 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20  n) ) zType[2] = 
20030 27 4c 27 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  'L';.  sqlite3Ex
20040 70 6c 61 69 6e 50 72 69 6e 74 66 28 76 2c 20 22  plainPrintf(v, "
20050 25 73 20 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20  %s ", zType);.  
20060 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
20070 70 72 28 76 2c 20 70 54 65 72 6d 2d 3e 70 45 78  pr(v, pTerm->pEx
20080 70 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  pr);.}.#endif /*
20090 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
200a0 4c 45 44 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  LED && SQLITE_EN
200b0 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49  ABLE_TREE_EXPLAI
200c0 4e 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48  N */...#ifdef WH
200d0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
200e0 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57  ./*.** Print a W
200f0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
20100 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70 75  for debugging pu
20110 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63  rposes.*/.static
20120 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50   void whereLoopP
20130 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a  rint(WhereLoop *
20140 70 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  p, WhereClause *
20150 70 57 43 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  pWC){.  WhereInf
20160 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d  o *pWInfo = pWC-
20170 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e  >pWInfo;.  int n
20180 62 20 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70  b = 1+(pWInfo->p
20190 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 37 29  TabList->nSrc+7)
201a0 2f 38 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  /8;.  struct Src
201b0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
201c0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
201d0 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62  ist->a + p->iTab
201e0 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  ;.  Table *pTab 
201f0 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
20200 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
20210 6e 74 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c  ntf("%c%2d.%0*ll
20220 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49  x.%0*llx", p->cI
20230 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
20240 20 20 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c          p->iTab,
20250 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66   nb, p->maskSelf
20260 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 29  , nb, p->prereq)
20270 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
20280 50 72 69 6e 74 66 28 22 20 25 31 32 73 22 2c 0a  Printf(" %12s",.
20290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202a0 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69       pItem->zAli
202b0 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  as ? pItem->zAli
202c0 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  as : pTab->zName
202d0 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46  );.  if( (p->wsF
202e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
202f0 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b  TUALTABLE)==0 ){
20300 0a 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  .     const char
20310 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69 66   *zName;.     if
20320 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  ( p->u.btree.pIn
20330 64 65 78 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20  dex && (zName = 
20340 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
20350 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  x->zName)!=0 ){.
20360 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d        if( strncm
20370 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
20380 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31 37  _autoindex_", 17
20390 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
203a0 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33 53  int i = sqlite3S
203b0 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2d  trlen30(zName) -
203c0 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   1;.        whil
203d0 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27  e( zName[i]!='_'
203e0 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20   ) i--;.        
203f0 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20  zName += i;.    
20400 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
20410 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2e 25  3DebugPrintf(".%
20420 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d 65  -16s %2d", zName
20430 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  , p->u.btree.nEq
20440 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
20450 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
20460 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c 22 22  Printf("%20s",""
20470 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
20480 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20  {.    char *z;. 
20490 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74 61 62     if( p->u.vtab
204a0 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20  .idxStr ){.     
204b0 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
204c0 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73 5c 22  intf("(%d,\"%s\"
204d0 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20 20 20  ,%x)",.         
204e0 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62         p->u.vtab
204f0 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74  .idxNum, p->u.vt
20500 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75 2e  ab.idxStr, p->u.
20510 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a  vtab.omitMask);.
20520 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20530 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
20540 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22 2c 20  intf("(%d,%x)", 
20550 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
20560 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  , p->u.vtab.omit
20570 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Mask);.    }.   
20580 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
20590 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20 7a 29  ntf(" %-19s", z)
205a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
205b0 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ee(z);.  }.  sql
205c0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
205d0 22 20 66 20 25 30 34 78 20 4e 20 25 64 22 2c 20  " f %04x N %d", 
205e0 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e  p->wsFlags, p->n
205f0 4c 54 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74 65  LTerm);.  sqlite
20600 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 63  3DebugPrintf(" c
20610 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c  ost %d,%d,%d\n",
20620 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72   p->rSetup, p->r
20630 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 23  Run, p->nOut);.#
20640 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
20650 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e  BLE_TREE_EXPLAIN
20660 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 30 78 31  .  /* If the 0x1
20670 30 30 20 62 69 74 20 6f 66 20 77 68 65 72 65 74  00 bit of wheret
20680 72 61 63 69 6e 67 20 69 73 20 73 65 74 2c 20 74  racing is set, t
20690 68 65 6e 20 73 68 6f 77 20 61 6c 6c 20 6f 66 20  hen show all of 
206a0 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20  the constraint. 
206b0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20   ** expressions 
206c0 69 6e 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  in the WhereLoop
206d0 2e 61 4c 54 65 72 6d 5b 5d 20 61 72 72 61 79 2e  .aLTerm[] array.
206e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e  .  */.  if( p->n
206f0 4c 54 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65  LTerm && (sqlite
20700 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
20710 31 30 30 29 21 3d 30 20 29 7b 20 20 2f 2a 20 57  100)!=0 ){  /* W
20720 48 45 52 45 54 52 41 43 45 20 30 78 31 30 30 20  HERETRACE 0x100 
20730 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  */.    int i;.  
20740 20 20 56 64 62 65 20 2a 76 20 3d 20 70 57 49 6e    Vdbe *v = pWIn
20750 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 70 56 64 62  fo->pParse->pVdb
20760 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e;.    sqlite3Ex
20770 70 6c 61 69 6e 42 65 67 69 6e 28 76 29 3b 0a 20  plainBegin(v);. 
20780 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
20790 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  >nLTerm; i++){. 
207a0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
207b0 70 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72  pTerm = p->aLTer
207c0 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  m[i];.      if( 
207d0 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69  pTerm==0 ) conti
207e0 6e 75 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nue;.      sqlit
207f0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
20800 76 2c 20 22 20 20 28 25 64 29 20 23 25 2d 32 64  v, "  (%d) #%-2d
20810 20 22 2c 20 69 2b 31 2c 20 28 69 6e 74 29 28 70   ", i+1, (int)(p
20820 54 65 72 6d 2d 70 57 43 2d 3e 61 29 29 3b 0a 20  Term-pWC->a));. 
20830 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
20840 61 69 6e 50 75 73 68 28 76 29 3b 0a 20 20 20 20  ainPush(v);.    
20850 20 20 77 68 65 72 65 45 78 70 6c 61 69 6e 54 65    whereExplainTe
20860 72 6d 28 76 2c 20 70 54 65 72 6d 29 3b 0a 20 20  rm(v, pTerm);.  
20870 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
20880 69 6e 50 6f 70 28 76 29 3b 0a 20 20 20 20 20 20  inPop(v);.      
20890 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
208a0 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (v);.    }.    s
208b0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 46 69 6e  qlite3ExplainFin
208c0 69 73 68 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ish(v);.    sqli
208d0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
208e0 25 73 22 2c 20 73 71 6c 69 74 65 33 56 64 62 65  %s", sqlite3Vdbe
208f0 45 78 70 6c 61 6e 61 74 69 6f 6e 28 76 29 29 3b  Explanation(v));
20900 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 23 65  .  }.#endif.}.#e
20910 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ndif../*.** Conv
20920 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20  ert bulk memory 
20930 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 57 68 65  into a valid Whe
20940 72 65 4c 6f 6f 70 20 74 68 61 74 20 63 61 6e 20  reLoop that can 
20950 62 65 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  be passed.** to 
20960 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 20 68  whereLoopClear h
20970 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74  armlessly..*/.st
20980 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
20990 6f 6f 70 49 6e 69 74 28 57 68 65 72 65 4c 6f 6f  oopInit(WhereLoo
209a0 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c 54 65  p *p){.  p->aLTe
209b0 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 53 70  rm = p->aLTermSp
209c0 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d  ace;.  p->nLTerm
209d0 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f   = 0;.  p->nLSlo
209e0 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70 2d  t = ArraySize(p-
209f0 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3b 0a 20  >aLTermSpace);. 
20a00 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b   p->wsFlags = 0;
20a10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
20a20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 75 20  the WhereLoop.u 
20a30 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20 57 68  union.  Leave Wh
20a40 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20 69  ereLoop.pLTerm i
20a50 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ntact..*/.static
20a60 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43   void whereLoopC
20a70 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69 74 65  learUnion(sqlite
20a80 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
20a90 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 77   *p){.  if( p->w
20aa0 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
20ab0 56 49 52 54 55 41 4c 54 41 42 4c 45 7c 57 48 45  VIRTUALTABLE|WHE
20ac0 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 29  RE_AUTO_INDEX) )
20ad0 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73  {.    if( (p->ws
20ae0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
20af0 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 26  RTUALTABLE)!=0 &
20b00 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  & p->u.vtab.need
20b10 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Free ){.      sq
20b20 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 75 2e  lite3_free(p->u.
20b30 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20  vtab.idxStr);.  
20b40 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65      p->u.vtab.ne
20b50 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  edFree = 0;.    
20b60 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53    p->u.vtab.idxS
20b70 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  tr = 0;.    }els
20b80 65 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67  e if( (p->wsFlag
20b90 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
20ba0 4e 44 45 58 29 21 3d 30 20 26 26 20 70 2d 3e 75  NDEX)!=0 && p->u
20bb0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30  .btree.pIndex!=0
20bc0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
20bd0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75  3DbFree(db, p->u
20be0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a  .btree.pIndex->z
20bf0 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20 20 73  ColAff);.      s
20c00 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
20c10 65 66 28 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  ef(p->u.btree.pI
20c20 6e 64 65 78 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b  ndex->pKeyInfo);
20c30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
20c40 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74  Free(db, p->u.bt
20c50 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20  ree.pIndex);.   
20c60 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49     p->u.btree.pI
20c70 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ndex = 0;.    }.
20c80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61    }.}../*.** Dea
20c90 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c  llocate internal
20ca0 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
20cb0 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
20cc0 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
20cd0 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  d whereLoopClear
20ce0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
20cf0 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69  ereLoop *p){.  i
20d00 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d  f( p->aLTerm!=p-
20d10 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73  >aLTermSpace ) s
20d20 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
20d30 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77   p->aLTerm);.  w
20d40 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
20d50 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77 68 65  on(db, p);.  whe
20d60 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d  reLoopInit(p);.}
20d70 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65  ../*.** Increase
20d80 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
20d90 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70  cation for pLoop
20da0 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65  ->aLTerm[] to be
20db0 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a   at least n..*/.
20dc0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
20dd0 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74  LoopResize(sqlit
20de0 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
20df0 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  p *p, int n){.  
20e00 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65  WhereTerm **paNe
20e10 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c  w;.  if( p->nLSl
20e20 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20 53  ot>=n ) return S
20e30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20  QLITE_OK;.  n = 
20e40 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65  (n+7)&~7;.  paNe
20e50 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
20e60 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
20e70 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a  f(p->aLTerm[0])*
20e80 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65 77 3d  n);.  if( paNew=
20e90 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
20ea0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63  TE_NOMEM;.  memc
20eb0 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54  py(paNew, p->aLT
20ec0 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61  erm, sizeof(p->a
20ed0 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53  LTerm[0])*p->nLS
20ee0 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  lot);.  if( p->a
20ef0 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d  LTerm!=p->aLTerm
20f00 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33 44  Space ) sqlite3D
20f10 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54  bFree(db, p->aLT
20f20 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72  erm);.  p->aLTer
20f30 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e  m = paNew;.  p->
20f40 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65  nLSlot = n;.  re
20f50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20f60 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  }../*.** Transfe
20f70 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  r content from t
20f80 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20  he second pLoop 
20f90 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74 2e 0a  into the first..
20fa0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
20fb0 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69  ereLoopXfer(sqli
20fc0 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
20fd0 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f  op *pTo, WhereLo
20fe0 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68  op *pFrom){.  wh
20ff0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f  ereLoopClearUnio
21000 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66  n(db, pTo);.  if
21010 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
21020 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d  e(db, pTo, pFrom
21030 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20  ->nLTerm) ){.   
21040 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c   memset(&pTo->u,
21050 20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e   0, sizeof(pTo->
21060 75 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  u));.    return 
21070 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
21080 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20  }.  memcpy(pTo, 
21090 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f  pFrom, WHERE_LOO
210a0 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65  P_XFER_SZ);.  me
210b0 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d  mcpy(pTo->aLTerm
210c0 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c  , pFrom->aLTerm,
210d0 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a   pTo->nLTerm*siz
210e0 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b  eof(pTo->aLTerm[
210f0 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46 72 6f  0]));.  if( pFro
21100 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  m->wsFlags & WHE
21110 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  RE_VIRTUALTABLE 
21120 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e  ){.    pFrom->u.
21130 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
21140 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  0;.  }else if( (
21150 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26  pFrom->wsFlags &
21160 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
21170 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 72  X)!=0 ){.    pFr
21180 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  om->u.btree.pInd
21190 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ex = 0;.  }.  re
211a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
211b0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
211c0 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
211d0 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
211e0 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74  d whereLoopDelet
211f0 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
21200 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
21210 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64  whereLoopClear(d
21220 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  b, p);.  sqlite3
21230 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
21240 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57  ../*.** Free a W
21250 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
21260 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  re.*/.static voi
21270 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28  d whereInfoFree(
21280 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
21290 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
212a0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 57  .  if( ALWAYS(pW
212b0 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 77 68 65  Info) ){.    whe
212c0 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70  reClauseClear(&p
212d0 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20  WInfo->sWC);.   
212e0 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e   while( pWInfo->
212f0 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20  pLoops ){.      
21300 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70  WhereLoop *p = p
21310 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20  WInfo->pLoops;. 
21320 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f       pWInfo->pLo
21330 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f  ops = p->pNextLo
21340 6f 70 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  op;.      whereL
21350 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29  oopDelete(db, p)
21360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
21370 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
21380 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Info);.  }.}../*
21390 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65  .** Insert or re
213a0 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f  place a WhereLoo
213b0 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68  p entry using th
213c0 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c  e template suppl
213d0 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  ied..**.** An ex
213e0 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
213f0 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20   entry might be 
21400 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74  overwritten if t
21410 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a  he new template.
21420 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e 64  ** is better and
21430 20 68 61 73 20 66 65 77 65 72 20 64 65 70 65 6e   has fewer depen
21440 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65  dencies.  Or the
21450 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62   template will b
21460 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64  e ignored.** and
21470 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20   no insert will 
21480 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78 69 73  occur if an exis
21490 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69  ting WhereLoop i
214a0 73 20 66 61 73 74 65 72 20 61 6e 64 20 68 61 73  s faster and has
214b0 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64  .** fewer depend
214c0 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20  encies than the 
214d0 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72  template.  Other
214e0 77 69 73 65 20 61 20 6e 65 77 20 57 68 65 72 65  wise a new Where
214f0 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64  Loop is.** added
21500 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65   based on the te
21510 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  mplate..**.** If
21520 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
21530 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  t is not NULL th
21540 65 6e 20 77 65 20 6f 6e 6c 79 20 63 61 72 65 20  en we only care 
21550 61 62 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a 2a  about only the.*
21560 2a 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20  * prerequisites 
21570 61 6e 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f 75  and rRun and nOu
21580 74 20 63 6f 73 74 73 20 6f 66 20 74 68 65 20 4e  t costs of the N
21590 20 62 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54 68   best loops.  Th
215a0 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  at.** informatio
215b0 6e 20 69 73 20 67 61 74 68 65 72 65 64 20 69 6e  n is gathered in
215c0 20 74 68 65 20 70 42 75 69 6c 64 65 72 2d 3e 70   the pBuilder->p
215d0 4f 72 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54  OrSet object.  T
215e0 68 69 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20 70  his special.** p
215f0 72 6f 63 65 73 73 69 6e 67 20 6d 6f 64 65 20 69  rocessing mode i
21600 73 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20  s used only for 
21610 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  OR clause proces
21620 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  sing..**.** When
21630 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75   accumulating mu
21640 6c 74 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68  ltiple loops (wh
21650 65 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  en pBuilder->pOr
21660 53 65 74 20 69 73 20 4e 55 4c 4c 29 20 77 65 0a  Set is NULL) we.
21670 2a 2a 20 73 74 69 6c 6c 20 6d 69 67 68 74 20 6f  ** still might o
21680 76 65 72 77 72 69 74 65 20 73 69 6d 69 6c 61 72  verwrite similar
21690 20 6c 6f 6f 70 73 20 77 69 74 68 20 74 68 65 20   loops with the 
216a0 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 66 20  new template if 
216b0 74 68 65 0a 2a 2a 20 74 65 6d 70 6c 61 74 65 20  the.** template 
216c0 69 73 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70  is better.  Loop
216d0 73 20 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69  s may be overwri
216e0 74 74 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c  tten if the foll
216f0 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74  owing .** condit
21700 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a  ions are met:.**
21710 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 79  .**    (1)  They
21720 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69   have the same i
21730 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20  Tab..**    (2)  
21740 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61  They have the sa
21750 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20  me iSortIdx..** 
21760 20 20 20 28 33 29 20 20 54 68 65 20 74 65 6d 70     (3)  The temp
21770 6c 61 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72  late has same or
21780 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
21790 69 65 73 20 74 68 61 6e 20 74 68 65 20 63 75 72  ies than the cur
217a0 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20  rent loop.**    
217b0 28 34 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74  (4)  The templat
217c0 65 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f  e has the same o
217d0 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61  r lower cost tha
217e0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  n the current lo
217f0 6f 70 0a 2a 2a 20 20 20 20 28 35 29 20 20 54 68  op.**    (5)  Th
21800 65 20 74 65 6d 70 6c 61 74 65 20 75 73 65 73 20  e template uses 
21810 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68  more terms of th
21820 65 20 73 61 6d 65 20 69 6e 64 65 78 20 62 75 74  e same index but
21830 20 68 61 73 20 6e 6f 20 61 64 64 69 74 69 6f 6e   has no addition
21840 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65  al.**         de
21850 70 65 6e 64 65 6e 63 69 65 73 20 20 20 20 20 20  pendencies      
21860 20 20 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69      .*/.static i
21870 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65  nt whereLoopInse
21880 72 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  rt(WhereLoopBuil
21890 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 57  der *pBuilder, W
218a0 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c  hereLoop *pTempl
218b0 61 74 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f  ate){.  WhereLoo
218c0 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a 70 2c 20  p **ppPrev, *p, 
218d0 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 57 68  *pNext = 0;.  Wh
218e0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
218f0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
21900 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  fo;.  sqlite3 *d
21910 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
21920 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66  se->db;..  /* If
21930 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
21940 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68  t is defined, th
21950 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61  en only keep tra
21960 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a  ck of the costs.
21970 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73    ** and prereqs
21980 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75  ..  */.  if( pBu
21990 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30  ilder->pOrSet!=0
219a0 20 29 7b 0a 23 69 66 20 57 48 45 52 45 54 52 41   ){.#if WHERETRA
219b0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 75  CE_ENABLED.    u
219c0 31 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d  16 n = pBuilder-
219d0 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20  >pOrSet->n;.    
219e0 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20  int x =.#endif. 
219f0 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74     whereOrInsert
21a00 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65  (pBuilder->pOrSe
21a10 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  t, pTemplate->pr
21a20 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d  ereq, pTemplate-
21a30 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20  >rRun,.         
21a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a50 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70             pTemp
21a60 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66  late->nOut);.#if
21a70 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
21a80 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20  LED /* 0x8 */.  
21a90 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
21aa0 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
21ab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
21ac0 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20  bugPrintf(x?"   
21ad0 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72  or-%d:  ":"   or
21ae0 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20  -X:  ", n);.    
21af0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
21b00 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
21b10 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
21b20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  }.#endif.    ret
21b30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
21b40 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
21b50 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
21b60 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 6f 76 65  WhereLoop to ove
21b70 72 77 72 69 74 65 2c 20 6f 72 20 77 68 69 63 68  rwrite, or which
21b80 20 74 61 6b 65 73 0a 20 20 2a 2a 20 70 72 69 6f   takes.  ** prio
21b90 72 69 74 79 20 6f 76 65 72 20 70 54 65 6d 70 6c  rity over pTempl
21ba0 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ate..  */.  for(
21bb0 70 70 50 72 65 76 3d 26 70 57 49 6e 66 6f 2d 3e  ppPrev=&pWInfo->
21bc0 70 4c 6f 6f 70 73 2c 20 70 3d 2a 70 70 50 72 65  pLoops, p=*ppPre
21bd0 76 3b 20 70 3b 20 70 70 50 72 65 76 3d 26 70 2d  v; p; ppPrev=&p-
21be0 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70  >pNextLoop, p=*p
21bf0 70 50 72 65 76 29 7b 0a 20 20 20 20 69 66 28 20  pPrev){.    if( 
21c00 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61  p->iTab!=pTempla
21c10 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69  te->iTab || p->i
21c20 53 6f 72 74 49 64 78 21 3d 70 54 65 6d 70 6c 61  SortIdx!=pTempla
21c30 74 65 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a  te->iSortIdx ){.
21c40 20 20 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68        /* If eith
21c50 65 72 20 74 68 65 20 69 54 61 62 20 6f 72 20 69  er the iTab or i
21c60 53 6f 72 74 49 64 78 20 76 61 6c 75 65 73 20 66  SortIdx values f
21c70 6f 72 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70  or two WhereLoop
21c80 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 0a 20   are different. 
21c90 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f       ** then tho
21ca0 73 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65  se WhereLoops ne
21cb0 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65  ed to be conside
21cc0 72 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20  red separately. 
21cd0 20 4e 65 69 74 68 65 72 20 69 73 0a 20 20 20 20   Neither is.    
21ce0 20 20 2a 2a 20 61 20 63 61 6e 64 69 64 61 74 65    ** a candidate
21cf0 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65 20   to replace the 
21d00 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  other. */.      
21d10 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
21d20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 63 75      /* In the cu
21d30 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
21d40 74 69 6f 6e 2c 20 74 68 65 20 72 53 65 74 75 70  tion, the rSetup
21d50 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72   value is either
21d60 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20   zero.    ** or 
21d70 74 68 65 20 63 6f 73 74 20 6f 66 20 62 75 69 6c  the cost of buil
21d80 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69  ding an automati
21d90 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20  c index (NlogN) 
21da0 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20  and the NlogN.  
21db0 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65    ** is the same
21dc0 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65 20   for compatible 
21dd0 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20  WhereLoops. */. 
21de0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
21df0 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70  etup==0 || pTemp
21e00 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20  late->rSetup==0 
21e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21e20 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d    || p->rSetup==
21e30 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
21e40 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65  p );..    /* whe
21e50 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 29  reLoopAddBtree()
21e60 20 61 6c 77 61 79 73 20 67 65 6e 65 72 61 74 65   always generate
21e70 73 20 61 6e 64 20 69 6e 73 65 72 74 73 20 74 68  s and inserts th
21e80 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
21e90 78 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 66 69  x.    ** case fi
21ea0 72 73 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70  rst.  Hence comp
21eb0 61 74 69 62 6c 65 20 63 61 6e 64 69 64 61 74 65  atible candidate
21ec0 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65   WhereLoops neve
21ed0 72 20 68 61 76 65 20 61 20 6c 61 72 67 65 72 0a  r have a larger.
21ee0 20 20 20 20 2a 2a 20 72 53 65 74 75 70 2e 20 43      ** rSetup. C
21ef0 61 6c 6c 20 74 68 69 73 20 53 45 54 55 50 2d 49  all this SETUP-I
21f00 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20  NVARIANT */.    
21f10 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
21f20 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p>=pTemplate->rS
21f30 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 69 66 28  etup );..    if(
21f40 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
21f50 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
21f60 3d 3d 70 2d 3e 70 72 65 72 65 71 0a 20 20 20 20  ==p->prereq.    
21f70 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70   && p->rSetup<=p
21f80 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
21f90 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e  .     && p->rRun
21fa0 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  <=pTemplate->rRu
21fb0 6e 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75  n.     && p->nOu
21fc0 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f  t<=pTemplate->nO
21fd0 75 74 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ut.    ){.      
21fe0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 74  /* This branch t
21ff0 61 6b 65 6e 20 77 68 65 6e 20 70 20 69 73 20 65  aken when p is e
22000 71 75 61 6c 20 6f 72 20 62 65 74 74 65 72 20 74  qual or better t
22010 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 20 69 6e  han pTemplate in
22020 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 6f   .      ** all o
22030 66 20 28 31 29 20 64 65 70 65 6e 64 65 6e 63 69  f (1) dependenci
22040 65 73 20 28 32 29 20 73 65 74 75 70 2d 63 6f 73  es (2) setup-cos
22050 74 2c 20 28 33 29 20 72 75 6e 2d 63 6f 73 74 2c  t, (3) run-cost,
22060 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 34   and.      ** (4
22070 29 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  ) number of outp
22080 75 74 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20  ut rows. */.    
22090 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65    assert( p->rSe
220a0 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup==pTemplate->
220b0 72 53 65 74 75 70 20 29 3b 0a 20 20 20 20 20 20  rSetup );.      
220c0 69 66 28 20 70 2d 3e 70 72 65 72 65 71 3d 3d 70  if( p->prereq==p
220d0 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
220e0 0a 20 20 20 20 20 20 20 26 26 20 70 2d 3e 6e 4c  .       && p->nL
220f0 54 65 72 6d 3c 70 54 65 6d 70 6c 61 74 65 2d 3e  Term<pTemplate->
22100 6e 4c 54 65 72 6d 0a 20 20 20 20 20 20 20 26 26  nLTerm.       &&
22110 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 70   (p->wsFlags & p
22120 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67  Template->wsFlag
22130 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
22140 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20  D)!=0.       && 
22150 28 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  (p->u.btree.pInd
22160 65 78 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 75  ex==pTemplate->u
22170 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 0a 20 20  .btree.pIndex.  
22180 20 20 20 20 20 20 20 20 7c 7c 20 70 54 65 6d 70          || pTemp
22190 6c 61 74 65 2d 3e 72 52 75 6e 2b 70 2d 3e 6e 4c  late->rRun+p->nL
221a0 54 65 72 6d 3c 3d 70 2d 3e 72 52 75 6e 2b 70 54  Term<=p->rRun+pT
221b0 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 29  emplate->nLTerm)
221c0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
221d0 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 61    /* Overwrite a
221e0 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  n existing Where
221f0 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 73 69 6d  Loop with an sim
22200 69 6c 61 72 20 6f 6e 65 20 74 68 61 74 20 75 73  ilar one that us
22210 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  es.        ** mo
22220 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  re terms of the 
22230 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
22240 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78   pNext = p->pNex
22250 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 62  tLoop;.        b
22260 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
22270 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 54  e{.        /* pT
22280 65 6d 70 6c 61 74 65 20 69 73 20 6e 6f 74 20 68  emplate is not h
22290 65 6c 70 66 75 6c 2e 0a 20 20 20 20 20 20 20 20  elpful..        
222a0 2a 2a 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  ** Return withou
222b0 74 20 63 68 61 6e 67 69 6e 67 20 6f 72 20 61 64  t changing or ad
222c0 64 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  ding anything */
222d0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68  .        goto wh
222e0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f  ereLoopInsert_no
222f0 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  op;.      }.    
22300 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  }.    if( (p->pr
22310 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
22320 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70  ->prereq)==pTemp
22330 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20  late->prereq.   
22340 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54    && p->rRun>=pT
22350 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 0a 20 20  emplate->rRun.  
22360 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70     && p->nOut>=p
22370 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 0a 20  Template->nOut. 
22380 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f     ){.      /* O
22390 76 65 72 77 72 69 74 65 20 61 6e 20 65 78 69 73  verwrite an exis
223a0 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 77  ting WhereLoop w
223b0 69 74 68 20 61 20 62 65 74 74 65 72 20 6f 6e 65  ith a better one
223c0 3a 20 6f 6e 65 20 74 68 61 74 20 69 73 0a 20 20  : one that is.  
223d0 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 61 74      ** better at
223e0 20 6f 6e 65 20 6f 66 20 28 31 29 20 64 65 70 65   one of (1) depe
223f0 6e 64 65 6e 63 69 65 73 2c 20 28 32 29 20 73 65  ndencies, (2) se
22400 74 75 70 2d 63 6f 73 74 2c 20 28 33 29 20 72 75  tup-cost, (3) ru
22410 6e 2d 63 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20  n-cost.      ** 
22420 6f 72 20 28 34 29 20 6e 75 6d 62 65 72 20 6f 66  or (4) number of
22430 20 6f 75 74 70 75 74 20 72 6f 77 73 2c 20 61 6e   output rows, an
22440 64 20 69 73 20 6e 6f 20 77 6f 72 73 65 20 69 6e  d is no worse in
22450 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 0a 20 20   any of those.  
22460 20 20 20 20 2a 2a 20 63 61 74 65 67 6f 72 69 65      ** categorie
22470 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  s. */.      asse
22480 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70  rt( p->rSetup>=p
22490 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
224a0 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56   ); /* SETUP-INV
224b0 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a  ARIANT above */.
224c0 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d        pNext = p-
224d0 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20  >pNextLoop;.    
224e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
224f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
22500 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20  each this point 
22510 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69  it means that ei
22520 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c 64 20  ther p[] should 
22530 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20  be overwritten. 
22540 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61   ** with pTempla
22550 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78 69 73  te[] if p[] exis
22560 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e 55 4c  ts, or if p==NUL
22570 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  L then allocate 
22580 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65 72 65  a new.  ** Where
22590 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72 74 20  Loop and insert 
225a0 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57 48 45  it..  */.#if WHE
225b0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
225c0 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69 66 28 20  /* 0x8 */.  if( 
225d0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
225e0 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 69  e & 0x8 ){.    i
225f0 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 20  f( p!=0 ){.     
22600 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
22610 6e 74 66 28 22 69 6e 73 2d 64 65 6c 3a 20 20 22  ntf("ins-del:  "
22620 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
22630 6f 70 50 72 69 6e 74 28 70 2c 20 70 42 75 69 6c  opPrint(p, pBuil
22640 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d  der->pWC);.    }
22650 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
22660 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 6e 65 77  gPrintf("ins-new
22670 3a 20 20 22 29 3b 0a 20 20 20 20 77 68 65 72 65  :  ");.    where
22680 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
22690 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
226a0 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  WC);.  }.#endif.
226b0 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
226c0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    p = sqlite3DbM
226d0 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
226e0 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b  eof(WhereLoop));
226f0 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
22700 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
22710 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f  MEM;.    whereLo
22720 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a 20  opInit(p);.  }. 
22730 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64   whereLoopXfer(d
22740 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29  b, p, pTemplate)
22750 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ;.  p->pNextLoop
22760 20 3d 20 70 4e 65 78 74 3b 0a 20 20 2a 70 70 50   = pNext;.  *ppP
22770 72 65 76 20 3d 20 70 3b 0a 20 20 69 66 28 20 28  rev = p;.  if( (
22780 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
22790 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
227a0 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ==0 ){.    Index
227b0 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e   *pIndex = p->u.
227c0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
227d0 20 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20    if( pIndex && 
227e0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20  pIndex->tnum==0 
227f0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74  ){.      p->u.bt
22800 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  ree.pIndex = 0;.
22810 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22820 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
22830 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
22840 20 74 68 65 20 69 6e 73 65 72 74 20 69 73 20 61   the insert is a
22850 20 6e 6f 2d 6f 70 20 2a 2f 0a 77 68 65 72 65 4c   no-op */.whereL
22860 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3a 0a  oopInsert_noop:.
22870 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
22880 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
22890 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
228a0 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
228b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
228c0 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 6e 6f  ugPrintf("ins-no
228d0 6f 70 3a 20 22 29 3b 0a 20 20 20 20 77 68 65 72  op: ");.    wher
228e0 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
228f0 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
22900 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  pWC);.  }.#endif
22910 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
22920 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _OK;  .}../*.** 
22930 41 64 6a 75 73 74 20 74 68 65 20 57 68 65 72 65  Adjust the Where
22940 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20  Loop.nOut value 
22950 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f  downward to acco
22960 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66  unt for terms of
22970 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
22980 61 75 73 65 20 74 68 61 74 20 72 65 66 65 72 65  ause that refere
22990 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74  nce the loop but
229a0 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75   which are not u
229b0 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64  sed by an.** ind
229c0 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ex..**.** In the
229d0 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
229e0 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 66 69 72  ntation, the fir
229f0 73 74 20 65 78 74 72 61 20 57 48 45 52 45 20 63  st extra WHERE c
22a00 6c 61 75 73 65 20 74 65 72 6d 20 72 65 64 75 63  lause term reduc
22a10 65 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  es.** the number
22a20 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
22a30 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 31  by a factor of 1
22a40 30 20 61 6e 64 20 65 61 63 68 20 61 64 64 69 74  0 and each addit
22a50 69 6f 6e 61 6c 20 74 65 72 6d 0a 2a 2a 20 72 65  ional term.** re
22a60 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
22a70 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
22a80 62 79 20 73 71 72 74 28 32 29 2e 0a 2a 2f 0a 73  by sqrt(2)..*/.s
22a90 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
22aa0 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
22ab0 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
22ac0 43 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  C, WhereLoop *pL
22ad0 6f 6f 70 29 7b 0a 20 20 57 68 65 72 65 54 65 72  oop){.  WhereTer
22ae0 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a 20  m *pTerm, *pX;. 
22af0 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f   Bitmask notAllo
22b00 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70  wed = ~(pLoop->p
22b10 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73  rereq|pLoop->mas
22b20 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69 2c  kSelf);.  int i,
22b30 20 6a 3b 0a 0a 20 20 69 66 28 20 21 4f 70 74 69   j;..  if( !Opti
22b40 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
22b50 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61  pWC->pWInfo->pPa
22b60 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
22b70 41 64 6a 75 73 74 4f 75 74 45 73 74 29 20 29 7b  AdjustOutEst) ){
22b80 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
22b90 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
22ba0 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  erm, pTerm=pWC->
22bb0 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65  a; i>0; i--, pTe
22bc0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
22bd0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
22be0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d   TERM_VIRTUAL)!=
22bf0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
22c00 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
22c10 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  qAll & pLoop->ma
22c20 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e  skSelf)==0 ) con
22c30 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
22c40 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
22c50 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d   & notAllowed)!=
22c60 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
22c70 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e    for(j=pLoop->n
22c80 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  LTerm-1; j>=0; j
22c90 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d 20  --){.      pX = 
22ca0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
22cb0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  ;.      if( pX==
22cc0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
22cd0 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65 72      if( pX==pTer
22ce0 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
22cf0 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e 74   if( pX->iParent
22d00 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61 5b  >=0 && (&pWC->a[
22d10 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70  pX->iParent])==p
22d20 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
22d30 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20    }.    if( j<0 
22d40 29 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d  ) pLoop->nOut +=
22d50 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
22d60 62 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b;.  }.}../*.** 
22d70 57 65 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d  We have so far m
22d80 61 74 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d  atched pBuilder-
22d90 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  >pNew->u.btree.n
22da0 45 71 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  Eq terms of the 
22db0 69 6e 64 65 78 20 70 49 6e 64 65 78 2e 0a 2a 2a  index pIndex..**
22dc0 20 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e   Try to match on
22dd0 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e more..**.** If
22de0 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30   pProbe->tnum==0
22df0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 70 49 6e  , that means pIn
22e00 64 65 78 20 69 73 20 61 20 66 61 6b 65 20 69 6e  dex is a fake in
22e10 64 65 78 20 75 73 65 64 20 66 6f 72 20 74 68 65  dex used for the
22e20 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d  .** INTEGER PRIM
22e30 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74  ARY KEY..*/.stat
22e40 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
22e50 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 0a 20  AddBtreeIndex(. 
22e60 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
22e70 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 20 20  r *pBuilder,    
22e80 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f   /* The WhereLoo
22e90 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73  p factory */.  s
22ea0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
22eb0 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f  em *pSrc,      /
22ec0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  * FROM clause te
22ed0 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  rm being analyze
22ee0 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  d */.  Index *pP
22ef0 72 6f 62 65 2c 20 20 20 20 20 20 20 20 20 20 20  robe,           
22f00 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
22f10 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20  ex on pSrc */.  
22f20 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20  LogEst nInMul   
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f40 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66  /* log(Number of
22f50 20 69 74 65 72 61 74 69 6f 6e 73 20 64 75 65 20   iterations due 
22f60 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57  to IN) */.){.  W
22f70 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
22f80 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
22f90 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20 61  nfo;  /* WHERE a
22fa0 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78 74 20 2a  nalyse context *
22fb0 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
22fc0 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
22fd0 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se;        /* Pa
22fe0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
22ff0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
23000 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
23010 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
23020 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63  onnection malloc
23030 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
23040 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
23050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23060 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c   Template WhereL
23070 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  oop under constr
23080 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  uction */.  Wher
23090 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
230a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
230b0 20 57 68 65 72 65 54 65 72 6d 20 75 6e 64 65 72   WhereTerm under
230c0 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a   consideration *
230d0 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20  /.  int opMask; 
230e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230f0 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65      /* Valid ope
23100 72 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74  rators for const
23110 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72  raints */.  Wher
23120 65 53 63 61 6e 20 73 63 61 6e 3b 20 20 20 20 20  eScan scan;     
23130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
23140 74 65 72 61 74 6f 72 20 66 6f 72 20 57 48 45 52  terator for WHER
23150 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74  E terms */.  Bit
23160 6d 61 73 6b 20 73 61 76 65 64 5f 70 72 65 72 65  mask saved_prere
23170 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  q;           /* 
23180 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
23190 66 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a  f pNew->prereq *
231a0 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 4c  /.  u16 saved_nL
231b0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
231c0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
231d0 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e  value of pNew->n
231e0 4c 54 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20 73  LTerm */.  u16 s
231f0 61 76 65 64 5f 6e 45 71 3b 20 20 20 20 20 20 20  aved_nEq;       
23200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
23210 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
23220 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
23230 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64  q */.  u16 saved
23240 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20  _nSkip;         
23250 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
23260 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
23270 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20  ->u.btree.nSkip 
23280 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77  */.  u32 saved_w
23290 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  sFlags;         
232a0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
232b0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
232c0 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67  wsFlags */.  Log
232d0 45 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20  Est saved_nOut; 
232e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
232f0 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
23300 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a  f pNew->nOut */.
23310 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
23320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23330 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
23340 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
23350 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  table */.  int r
23360 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
23370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
23380 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c  turn code */.  L
23390 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 3b 20 20  ogEst nRowEst;  
233a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
233b0 2a 20 45 73 74 69 6d 61 74 65 64 20 69 6e 64 65  * Estimated inde
233c0 78 20 73 65 6c 65 63 74 69 76 69 74 79 20 2a 2f  x selectivity */
233d0 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69  .  LogEst rLogSi
233e0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
233f0 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20     /* Logarithm 
23400 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f  of table size */
23410 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
23420 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20  op = 0, *pBtm = 
23430 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f  0; /* Top and bo
23440 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74  ttom range const
23450 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65  raints */..  pNe
23460 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
23470 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ew;.  if( db->ma
23480 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
23490 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
234a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e  ;..  assert( (pN
234b0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
234c0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
234d0 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
234e0 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
234f0 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
23500 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  IT)==0 );.  if( 
23510 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
23520 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
23530 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  ){.    opMask = 
23540 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d  WO_LT|WO_LE;.  }
23550 65 6c 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d  else if( pProbe-
23560 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70 53 72  >tnum<=0 || (pSr
23570 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  c->jointype & JT
23580 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20  _LEFT)!=0 ){.   
23590 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c   opMask = WO_EQ|
235a0 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_IN|WO_GT|WO_G
235b0 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  E|WO_LT|WO_LE;. 
235c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61   }else{.    opMa
235d0 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
235e0 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47 54  |WO_ISNULL|WO_GT
235f0 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f  |WO_GE|WO_LT|WO_
23600 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  LE;.  }.  if( pP
23610 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64  robe->bUnordered
23620 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57   ) opMask &= ~(W
23630 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54  O_GT|WO_GE|WO_LT
23640 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65  |WO_LE);..  asse
23650 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  rt( pNew->u.btre
23660 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e  e.nEq<=pProbe->n
23670 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 69 66 28 20  KeyCol );.  if( 
23680 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
23690 71 20 3c 20 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  q < pProbe->nKey
236a0 43 6f 6c 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20  Col ){.    iCol 
236b0 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  = pProbe->aiColu
236c0 6d 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  mn[pNew->u.btree
236d0 2e 6e 45 71 5d 3b 0a 20 20 20 20 6e 52 6f 77 45  .nEq];.    nRowE
236e0 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  st = sqlite3LogE
236f0 73 74 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77  st(pProbe->aiRow
23700 45 73 74 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65  Est[pNew->u.btre
23710 65 2e 6e 45 71 2b 31 5d 29 3b 0a 20 20 20 20 69  e.nEq+1]);.    i
23720 66 28 20 6e 52 6f 77 45 73 74 3d 3d 30 20 26 26  f( nRowEst==0 &&
23730 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72   pProbe->onError
23740 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 6e 52 6f 77  ==OE_None ) nRow
23750 45 73 74 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Est = 1;.  }else
23760 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 2d 31 3b  {.    iCol = -1;
23770 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 3d 20 30  .    nRowEst = 0
23780 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20  ;.  }.  pTerm = 
23790 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
237a0 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  can, pBuilder->p
237b0 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  WC, pSrc->iCurso
237c0 72 2c 20 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20  r, iCol,.       
237d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237e0 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29   opMask, pProbe)
237f0 3b 0a 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20  ;.  saved_nEq = 
23800 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
23810 71 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70  q;.  saved_nSkip
23820 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65   = pNew->u.btree
23830 2e 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65 64 5f  .nSkip;.  saved_
23840 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e  nLTerm = pNew->n
23850 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77  LTerm;.  saved_w
23860 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77  sFlags = pNew->w
23870 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64 5f  sFlags;.  saved_
23880 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70  prereq = pNew->p
23890 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e  rereq;.  saved_n
238a0 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74  Out = pNew->nOut
238b0 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70  ;.  pNew->rSetup
238c0 20 3d 20 30 3b 0a 20 20 72 4c 6f 67 53 69 7a 65   = 0;.  rLogSize
238d0 20 3d 20 65 73 74 4c 6f 67 28 73 71 6c 69 74 65   = estLog(sqlite
238e0 33 4c 6f 67 45 73 74 28 70 50 72 6f 62 65 2d 3e  3LogEst(pProbe->
238f0 61 69 52 6f 77 45 73 74 5b 30 5d 29 29 3b 0a 20  aiRowEst[0]));. 
23900 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 0a 20 20   if( pTerm==0.  
23910 20 26 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d 73   && saved_nEq==s
23920 61 76 65 64 5f 6e 53 6b 69 70 0a 20 20 20 26 26  aved_nSkip.   &&
23930 20 73 61 76 65 64 5f 6e 45 71 2b 31 3c 70 50 72   saved_nEq+1<pPr
23940 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20  obe->nKeyCol.   
23950 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77  && pProbe->aiRow
23960 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d  Est[saved_nEq+1]
23970 3e 35 30 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67  >50.  ){.    Log
23980 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70  Est nIter;.    p
23990 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
239a0 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ++;.    pNew->u.
239b0 62 74 72 65 65 2e 6e 53 6b 69 70 2b 2b 3b 0a 20  btree.nSkip++;. 
239c0 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
239d0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
239e0 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  = 0;.    pNew->w
239f0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
23a00 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49  SKIPSCAN;.    nI
23a10 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ter = sqlite3Log
23a20 45 73 74 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f  Est(pProbe->aiRo
23a30 77 45 73 74 5b 30 5d 2f 70 50 72 6f 62 65 2d 3e  wEst[0]/pProbe->
23a40 61 69 52 6f 77 45 73 74 5b 73 61 76 65 64 5f 6e  aiRowEst[saved_n
23a50 45 71 2b 31 5d 29 3b 0a 20 20 20 20 77 68 65 72  Eq+1]);.    wher
23a60 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
23a70 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72  ex(pBuilder, pSr
23a80 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72  c, pProbe, nIter
23a90 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 20 72  );.  }.  for(; r
23aa0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
23ab0 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20  pTerm!=0; pTerm 
23ac0 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28  = whereScanNext(
23ad0 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 69 6e 74  &scan)){.    int
23ae0 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66   nIn = 0;.#ifdef
23af0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
23b00 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
23b10 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20    int nRecValid 
23b20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  = pBuilder->nRec
23b30 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20  Valid;.#endif.  
23b40 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
23b50 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55  perator==WO_ISNU
23b60 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74  LL || (pTerm->wt
23b70 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c  Flags&TERM_VNULL
23b80 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 28 69  )!=0).     && (i
23b90 43 6f 6c 3c 30 20 7c 7c 20 70 53 72 63 2d 3e 70  Col<0 || pSrc->p
23ba0 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
23bb0 6e 6f 74 4e 75 6c 6c 29 0a 20 20 20 20 29 7b 0a  notNull).    ){.
23bc0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
23bd0 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f  /* ignore IS [NO
23be0 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  T] NULL constrai
23bf0 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20  nts on NOT NULL 
23c00 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d  columns */.    }
23c10 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
23c20 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e  prereqRight & pN
23c30 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63  ew->maskSelf ) c
23c40 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 61 73  ontinue;..    as
23c50 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74  sert( pNew->nOut
23c60 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a  ==saved_nOut );.
23c70 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  .    pNew->wsFla
23c80 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61  gs = saved_wsFla
23c90 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  gs;.    pNew->u.
23ca0 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65  btree.nEq = save
23cb0 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d  d_nEq;.    pNew-
23cc0 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f  >nLTerm = saved_
23cd0 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20  nLTerm;.    if( 
23ce0 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
23cf0 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e  db, pNew, pNew->
23d00 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61  nLTerm+1) ) brea
23d10 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20  k; /* OOM */.   
23d20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
23d30 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20  ew->nLTerm++] = 
23d40 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d  pTerm;.    pNew-
23d50 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76 65 64  >prereq = (saved
23d60 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d  _prereq | pTerm-
23d70 3e 70 72 65 72 65 71 52 69 67 68 74 29 20 26 20  >prereqRight) & 
23d80 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b  ~pNew->maskSelf;
23d90 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20  .    pNew->rRun 
23da0 3d 20 72 4c 6f 67 53 69 7a 65 3b 20 2f 2a 20 42  = rLogSize; /* B
23db0 61 73 65 6c 69 6e 65 20 63 6f 73 74 20 69 73 20  aseline cost is 
23dc0 6c 6f 67 32 28 4e 29 2e 20 20 41 64 6a 75 73 74  log2(N).  Adjust
23dd0 6d 65 6e 74 73 20 62 65 6c 6f 77 20 2a 2f 0a 20  ments below */. 
23de0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
23df0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
23e00 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
23e10 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
23e20 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  xpr;.      pNew-
23e30 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
23e40 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20  E_COLUMN_IN;.   
23e50 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
23e60 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
23e70 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
23e80 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20         /* "x IN 
23e90 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20  (SELECT ...)":  
23ea0 54 55 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45  TUNING: the SELE
23eb0 43 54 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f  CT returns 25 ro
23ec0 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49  ws */.        nI
23ed0 6e 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28  n = 46;  assert(
23ee0 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   46==sqlite3LogE
23ef0 73 74 28 32 35 29 20 29 3b 0a 20 20 20 20 20 20  st(25) );.      
23f00 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
23f10 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20  (pExpr->x.pList 
23f20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  && pExpr->x.pLis
23f30 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
23f40 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76       /* "x IN (v
23f50 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e  alue, value, ...
23f60 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49  )" */.        nI
23f70 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
23f80 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  t(pExpr->x.pList
23f90 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
23fa0 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52  }.      pNew->rR
23fb0 75 6e 20 2b 3d 20 6e 49 6e 3b 0a 20 20 20 20 20  un += nIn;.     
23fc0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
23fd0 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77  Eq++;.      pNew
23fe0 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74  ->nOut = nRowEst
23ff0 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b   + nInMul + nIn;
24000 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
24010 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
24020 26 20 28 57 4f 5f 45 51 29 20 29 7b 0a 20 20 20  & (WO_EQ) ){.   
24030 20 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20     assert(.     
24040 20 20 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67     (pNew->wsFlag
24050 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d  s & (WHERE_COLUM
24060 4e 5f 4e 55 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c  N_NULL|WHERE_COL
24070 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 53 4b 49  UMN_IN|WHERE_SKI
24080 50 53 43 41 4e 29 29 21 3d 30 0a 20 20 20 20 20  PSCAN))!=0.     
24090 20 20 20 7c 7c 20 6e 49 6e 4d 75 6c 3d 3d 30 0a     || nInMul==0.
240a0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70        );.      p
240b0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
240c0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b  WHERE_COLUMN_EQ;
240d0 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
240e0 30 20 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  0  .       || (p
240f0 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Probe->onError!=
24100 4f 45 5f 4e 6f 6e 65 20 26 26 20 6e 49 6e 4d 75  OE_None && nInMu
24110 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  l==0.           
24120 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  && pNew->u.btree
24130 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b  .nEq==pProbe->nK
24140 65 79 43 6f 6c 2d 31 29 0a 20 20 20 20 20 20 29  eyCol-1).      )
24150 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
24160 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
24170 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
24180 49 4e 29 3d 3d 30 20 7c 7c 20 69 43 6f 6c 3c 30  IN)==0 || iCol<0
24190 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   );.        pNew
241a0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
241b0 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20  RE_ONEROW;.     
241c0 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75   }.      pNew->u
241d0 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20  .btree.nEq++;.  
241e0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
241f0 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75   nRowEst + nInMu
24200 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
24210 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
24220 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20  r & (WO_ISNULL) 
24230 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  ){.      pNew->w
24240 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
24250 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20  COLUMN_NULL;.   
24260 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
24270 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 2f 2a  .nEq++;.      /*
24280 20 54 55 4e 49 4e 47 3a 20 49 53 20 4e 55 4c 4c   TUNING: IS NULL
24290 20 73 65 6c 65 63 74 73 20 32 20 72 6f 77 73 20   selects 2 rows 
242a0 2a 2f 0a 20 20 20 20 20 20 6e 49 6e 20 3d 20 31  */.      nIn = 1
242b0 30 3b 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d  0;  assert( 10==
242c0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29  sqlite3LogEst(2)
242d0 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
242e0 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b  nOut = nRowEst +
242f0 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20   nInMul + nIn;. 
24300 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65     }else if( pTe
24310 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
24320 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b  (WO_GT|WO_GE) ){
24330 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
24340 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
24350 72 20 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20  r & WO_GT );.   
24360 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
24370 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
24380 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 70  WO_GE );.      p
24390 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
243a0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
243b0 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  GE|WHERE_BTM_LIM
243c0 49 54 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d  IT;.      pBtm =
243d0 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54   pTerm;.      pT
243e0 6f 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  op = 0;.    }els
243f0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
24400 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
24410 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  r & (WO_LT|WO_LE
24420 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ) );.      testc
24430 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
24440 72 61 74 6f 72 20 26 20 57 4f 5f 4c 54 20 29 3b  rator & WO_LT );
24450 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
24460 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
24470 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20  r & WO_LE );.   
24480 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
24490 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
244a0 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50  _RANGE|WHERE_TOP
244b0 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 54  _LIMIT;.      pT
244c0 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  op = pTerm;.    
244d0 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e    pBtm = (pNew->
244e0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
244f0 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a  BTM_LIMIT)!=0 ?.
24500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24510 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
24520 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32  m[pNew->nLTerm-2
24530 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  ] : 0;.    }.   
24540 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61   if( pNew->wsFla
24550 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
24560 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20  N_RANGE ){.     
24570 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20   /* Adjust nOut 
24580 61 6e 64 20 72 52 75 6e 20 66 6f 72 20 53 54 41  and rRun for STA
24590 54 33 20 72 61 6e 67 65 20 76 61 6c 75 65 73 20  T3 range values 
245a0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
245b0 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76   pNew->nOut==sav
245c0 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20  ed_nOut );.     
245d0 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45   whereRangeScanE
245e0 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c  st(pParse, pBuil
245f0 64 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c  der, pBtm, pTop,
24600 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 23 69   pNew);.    }.#i
24610 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
24620 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
24630 34 0a 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c  4.    if( nInMul
24640 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 72  ==0 .     && pPr
24650 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20  obe->nSample .  
24660 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74     && pNew->u.bt
24670 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d  ree.nEq<=pProbe-
24680 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20  >nSampleCol.    
24690 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
246a0 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
246b0 54 45 5f 53 74 61 74 33 29 20 0a 20 20 20 20 29  TE_Stat3) .    )
246c0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
246d0 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
246e0 70 72 3b 0a 20 20 20 20 20 20 74 52 6f 77 63 6e  pr;.      tRowcn
246f0 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t nOut = 0;.    
24700 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
24710 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51  perator & (WO_EQ
24720 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 20  |WO_ISNULL))!=0 
24730 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
24740 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
24750 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b  rator & WO_EQ );
24760 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
24770 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
24780 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  tor & WO_ISNULL 
24790 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
247a0 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
247b0 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
247c0 65 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  er, pExpr->pRigh
247d0 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20  t, &nOut);.     
247e0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72   }else if( (pTer
247f0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
24800 4f 5f 49 4e 29 0a 20 20 20 20 20 20 20 20 20 20  O_IN).          
24810 20 20 20 26 26 20 20 21 45 78 70 72 48 61 73 50     &&  !ExprHasP
24820 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
24830 50 5f 78 49 73 53 65 6c 65 63 74 29 20 20 29 7b  P_xIsSelect)  ){
24840 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
24850 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61  ereInScanEst(pPa
24860 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70  rse, pBuilder, p
24870 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26  Expr->x.pList, &
24880 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  nOut);.      }. 
24890 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f 75       assert( nOu
248a0 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  t==0 || rc==SQLI
248b0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
248c0 66 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20  f( nOut ){.     
248d0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
248e0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f  sqlite3LogEst(nO
248f0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ut);.        if(
24900 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65   pNew->nOut>save
24910 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e  d_nOut ) pNew->n
24920 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
24930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24940 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
24950 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
24960 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c  (WHERE_IDX_ONLY|
24970 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29  WHERE_IPK))==0 )
24980 7b 0a 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20  {.      /* Each 
24990 72 6f 77 20 69 6e 76 6f 6c 76 65 73 20 61 20 73  row involves a s
249a0 74 65 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78  tep of the index
249b0 2c 20 74 68 65 6e 20 61 20 62 69 6e 61 72 79 20  , then a binary 
249c0 73 65 61 72 63 68 20 6f 66 0a 20 20 20 20 20 20  search of.      
249d0 2a 2a 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  ** the main tabl
249e0 65 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  e */.      pNew-
249f0 3e 72 52 75 6e 20 3d 20 20 73 71 6c 69 74 65 33  >rRun =  sqlite3
24a00 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e  LogEstAdd(pNew->
24a10 72 52 75 6e 2c 72 4c 6f 67 53 69 7a 65 3e 32 37  rRun,rLogSize>27
24a20 20 3f 20 72 4c 6f 67 53 69 7a 65 2d 31 37 20 3a   ? rLogSize-17 :
24a30 20 31 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   10);.    }.    
24a40 2f 2a 20 53 74 65 70 20 63 6f 73 74 20 66 6f 72  /* Step cost for
24a50 20 65 61 63 68 20 6f 75 74 70 75 74 20 72 6f 77   each output row
24a60 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52   */.    pNew->rR
24a70 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
24a80 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e  stAdd(pNew->rRun
24a90 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20  , pNew->nOut);. 
24aa0 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70     whereLoopOutp
24ab0 75 74 41 64 6a 75 73 74 28 70 42 75 69 6c 64 65  utAdjust(pBuilde
24ac0 72 2d 3e 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20  r->pWC, pNew);. 
24ad0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
24ae0 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
24af0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 69 66 28  , pNew);.    if(
24b00 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
24b10 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
24b20 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e  T)==0.     && pN
24b30 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
24b40 28 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c  (pProbe->nKeyCol
24b50 20 2b 20 28 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d   + (pProbe->zNam
24b60 65 21 3d 30 29 29 0a 20 20 20 20 29 7b 0a 20 20  e!=0)).    ){.  
24b70 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64      whereLoopAdd
24b80 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
24b90 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
24ba0 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a  e, nInMul+nIn);.
24bb0 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e      }.    pNew->
24bc0 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
24bd0 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  t;.#ifdef SQLITE
24be0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
24bf0 5f 53 54 41 54 34 0a 20 20 20 20 70 42 75 69 6c  _STAT4.    pBuil
24c00 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d  der->nRecValid =
24c10 20 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64   nRecValid;.#end
24c20 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70  if.  }.  pNew->p
24c30 72 65 72 65 71 20 3d 20 73 61 76 65 64 5f 70 72  rereq = saved_pr
24c40 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e  ereq;.  pNew->u.
24c50 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65  btree.nEq = save
24c60 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 75  d_nEq;.  pNew->u
24c70 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20 73  .btree.nSkip = s
24c80 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e  aved_nSkip;.  pN
24c90 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61  ew->wsFlags = sa
24ca0 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70  ved_wsFlags;.  p
24cb0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
24cc0 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e  d_nOut;.  pNew->
24cd0 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e  nLTerm = saved_n
24ce0 4c 54 65 72 6d 3b 0a 20 20 72 65 74 75 72 6e 20  LTerm;.  return 
24cf0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
24d00 75 72 6e 20 54 72 75 65 20 69 66 20 69 74 20 69  urn True if it i
24d10 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
24d20 70 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20  pIndex might be 
24d30 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70  useful in.** imp
24d40 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52  lementing the OR
24d50 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e  DER BY clause in
24d60 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a   pBuilder..**.**
24d70 20 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69 66   Return False if
24d80 20 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20 6e   pBuilder does n
24d90 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52  ot contain an OR
24da0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
24db0 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
24dc0 6e 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64 65  no way for pInde
24dd0 78 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20 69  x to be useful i
24de0 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  n implementing t
24df0 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  hat.** ORDER BY 
24e00 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  clause..*/.stati
24e10 63 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68 74  c int indexMight
24e20 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28  HelpWithOrderBy(
24e30 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
24e40 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
24e50 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a   Index *pIndex,.
24e60 20 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b    int iCursor.){
24e70 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 42  .  ExprList *pOB
24e80 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a  ;.  int ii, jj;.
24e90 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 62  .  if( pIndex->b
24ea0 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74 75  Unordered ) retu
24eb0 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42  rn 0;.  if( (pOB
24ec0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
24ed0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d  nfo->pOrderBy)==
24ee0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
24ef0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42  for(ii=0; ii<pOB
24f00 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a  ->nExpr; ii++){.
24f10 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
24f20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
24f30 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b  pCollate(pOB->a[
24f40 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  ii].pExpr);.    
24f50 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
24f60 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  K_COLUMN ) retur
24f70 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 45 78  n 0;.    if( pEx
24f80 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72  pr->iTable==iCur
24f90 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  sor ){.      for
24fa0 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78  (jj=0; jj<pIndex
24fb0 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29  ->nKeyCol; jj++)
24fc0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  {.        if( pE
24fd0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  xpr->iColumn==pI
24fe0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  ndex->aiColumn[j
24ff0 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  j] ) return 1;. 
25000 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
25010 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
25020 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62  /*.** Return a b
25030 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31 73 20  itmask where 1s 
25040 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
25050 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
25060 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
25070 20 74 61 62 6c 65 20 69 73 20 75 73 65 64 20 62   table is used b
25080 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c  y an index.  Onl
25090 79 20 74 68 65 20 66 69 72 73 74 20 36 33 20 63  y the first 63 c
250a0 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69  olumns are consi
250b0 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dered..*/.static
250c0 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73   Bitmask columns
250d0 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70  InIndex(Index *p
250e0 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20  Idx){.  Bitmask 
250f0 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a  m = 0;.  int j;.
25100 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43    for(j=pIdx->nC
25110 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  olumn-1; j>=0; j
25120 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d  --){.    int x =
25130 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
25140 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 30  j];.    if( x>=0
25150 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
25160 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a  se( x==BMS-1 );.
25170 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25180 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20  x==BMS-2 );.    
25190 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20    if( x<BMS-1 ) 
251a0 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b  m |= MASKBIT(x);
251b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
251c0 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68 65  urn m;.}../* Che
251d0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20 70  ck to see if a p
251e0 61 72 74 69 61 6c 20 69 6e 64 65 78 20 77 69 74  artial index wit
251f0 68 20 70 50 61 72 74 49 6e 64 65 78 57 68 65 72  h pPartIndexWher
25200 65 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a  e can be used.**
25210 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
25220 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74  query.  Return t
25230 72 75 65 20 69 66 20 69 74 20 63 61 6e 20 62 65  rue if it can be
25240 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f   and false if no
25250 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
25260 20 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74   whereUsablePart
25270 69 61 6c 49 6e 64 65 78 28 69 6e 74 20 69 54 61  ialIndex(int iTa
25280 62 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  b, WhereClause *
25290 70 57 43 2c 20 45 78 70 72 20 2a 70 57 68 65 72  pWC, Expr *pWher
252a0 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  e){.  int i;.  W
252b0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
252c0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72  .  for(i=0, pTer
252d0 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
252e0 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
252f0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73  rm++){.    if( s
25300 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
25310 73 45 78 70 72 28 70 54 65 72 6d 2d 3e 70 45 78  sExpr(pTerm->pEx
25320 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62  pr, pWhere, iTab
25330 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
25340 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
25350 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57  ./*.** Add all W
25360 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
25370 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 61   for a single ta
25380 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ble of the join 
25390 77 68 65 72 65 20 74 68 65 20 74 61 62 6c 65 0a  where the table.
253a0 2a 2a 20 69 73 20 69 64 65 6e 66 69 65 64 20 62  ** is idenfied b
253b0 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  y pBuilder->pNew
253c0 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61  ->iTab.  That ta
253d0 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  ble is guarantee
253e0 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74  d to be.** a b-t
253f0 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  ree table, not a
25400 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
25410 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
25420 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
25430 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
25440 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f  der *pBuilder, /
25450 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  * WHERE clause i
25460 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
25470 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 20  Bitmask mExtra  
25480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
25490 78 74 72 61 20 70 72 65 72 65 71 75 65 73 69 74  xtra prerequesit
254a0 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68 69  es for using thi
254b0 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  s table */.){.  
254c0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
254d0 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  o;          /* W
254e0 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f  HERE analysis co
254f0 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
25500 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20   *pProbe;       
25510 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
25520 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75 61  ex we are evalua
25530 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ting */.  Index 
25540 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  sPk;            
25550 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65 20        /* A fake 
25560 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72  index object for
25570 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
25580 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 69   */.  tRowcnt ai
25590 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20  RowEstPk[2];    
255a0 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 45 73    /* The aiRowEs
255b0 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68  t[] value for th
255c0 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20  e sPk index */. 
255d0 20 69 31 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20   i16 aiColumnPk 
255e0 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20  = -1;        /* 
255f0 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61  The aColumn[] va
25600 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20  lue for the sPk 
25610 69 6e 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69  index */.  SrcLi
25620 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
25630 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52         /* The FR
25640 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  OM clause */.  s
25650 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
25660 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68  em *pSrc;  /* Th
25670 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 74  e FROM clause bt
25680 72 65 65 20 74 65 72 6d 20 74 6f 20 61 64 64 20  ree term to add 
25690 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
256a0 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
256b0 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65   /* Template Whe
256c0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
256d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
256e0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f  TE_OK;         /
256f0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
25700 0a 20 20 69 6e 74 20 69 53 6f 72 74 49 64 78 20  .  int iSortIdx 
25710 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 1;           /
25720 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  * Index number *
25730 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20 20 20 20  /.  int b;      
25740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25750 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  /* A boolean val
25760 75 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  ue */.  LogEst r
25770 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
25780 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66      /* number of
25790 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
257a0 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  le */.  LogEst r
257b0 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20  LogSize;        
257c0 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d      /* Logarithm
257d0 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
257e0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
257f0 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ble */.  WhereCl
25800 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
25810 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
25820 65 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ed WHERE clause 
25830 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
25840 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25850 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20   /* Table being 
25860 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20  queried */.  .  
25870 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
25880 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20  >pNew;.  pWInfo 
25890 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
258a0 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  fo;.  pTabList =
258b0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
258c0 74 3b 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62  t;.  pSrc = pTab
258d0 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e  List->a + pNew->
258e0 69 54 61 62 3b 0a 20 20 70 54 61 62 20 3d 20 70  iTab;.  pTab = p
258f0 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43  Src->pTab;.  pWC
25900 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
25910 3b 0a 20 20 61 73 73 65 72 74 28 20 21 49 73 56  ;.  assert( !IsV
25920 69 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61  irtual(pSrc->pTa
25930 62 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72  b) );..  if( pSr
25940 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  c->pIndex ){.   
25950 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42   /* An INDEXED B
25960 59 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69  Y clause specifi
25970 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
25980 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a  index to use */.
25990 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72      pProbe = pSr
259a0 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c  c->pIndex;.  }el
259b0 73 65 20 69 66 28 20 21 48 61 73 52 6f 77 69 64  se if( !HasRowid
259c0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50  (pTab) ){.    pP
259d0 72 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e  robe = pTab->pIn
259e0 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dex;.  }else{.  
259f0 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
25a00 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
25a10 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61  se.  Create a fa
25a20 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke Index object 
25a30 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20  in local.    ** 
25a40 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20  variable sPk to 
25a50 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f  represent the ro
25a60 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20  wid primary key 
25a70 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69  index.  Make thi
25a80 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e  s.    ** fake in
25a90 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e  dex the first in
25aa0 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65   a chain of Inde
25ab0 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61  x objects with a
25ac0 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20  ll of the real. 
25ad0 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f     ** indices to
25ae0 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49   follow */.    I
25af0 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20  ndex *pFirst;   
25b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25b10 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20  * First of real 
25b20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
25b30 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  able */.    mems
25b40 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65  et(&sPk, 0, size
25b50 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20  of(Index));.    
25b60 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b  sPk.nKeyCol = 1;
25b70 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d  .    sPk.aiColum
25b80 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b  n = &aiColumnPk;
25b90 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45 73  .    sPk.aiRowEs
25ba0 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a  t = aiRowEstPk;.
25bb0 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20      sPk.onError 
25bc0 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20  = OE_Replace;.  
25bd0 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70    sPk.pTable = p
25be0 54 61 62 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Tab;.    aiRowEs
25bf0 74 50 6b 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e  tPk[0] = pTab->n
25c00 52 6f 77 45 73 74 3b 0a 20 20 20 20 61 69 52 6f  RowEst;.    aiRo
25c10 77 45 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20  wEstPk[1] = 1;. 
25c20 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72 63     pFirst = pSrc
25c30 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  ->pTab->pIndex;.
25c40 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f      if( pSrc->no
25c50 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20  tIndexed==0 ){. 
25c60 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c       /* The real
25c70 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20   indices of the 
25c80 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63  table are only c
25c90 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68 65  onsidered if the
25ca0 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e  .      ** NOT IN
25cb0 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72 20  DEXED qualifier 
25cc0 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  is omitted from 
25cd0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
25ce0 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65  */.      sPk.pNe
25cf0 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20  xt = pFirst;.   
25d00 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20   }.    pProbe = 
25d10 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a  &sPk;.  }.  rSiz
25d20 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  e = sqlite3LogEs
25d30 74 28 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 29  t(pTab->nRowEst)
25d40 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65  ;.  rLogSize = e
25d50 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23  stLog(rSize);..#
25d60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
25d70 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
25d80 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69  EX.  /* Automati
25d90 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69  c indexes */.  i
25da0 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f  f( !pBuilder->pO
25db0 72 53 65 74 0a 20 20 20 26 26 20 28 70 57 49 6e  rSet.   && (pWIn
25dc0 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e  fo->pParse->db->
25dd0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41  flags & SQLITE_A
25de0 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20 20  utoIndex)!=0.   
25df0 26 26 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d  && pSrc->pIndex=
25e00 3d 30 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  =0.   && !pSrc->
25e10 76 69 61 43 6f 72 6f 75 74 69 6e 65 0a 20 20 20  viaCoroutine.   
25e20 26 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  && !pSrc->notInd
25e30 65 78 65 64 0a 20 20 20 26 26 20 48 61 73 52 6f  exed.   && HasRo
25e40 77 69 64 28 70 54 61 62 29 0a 20 20 20 26 26 20  wid(pTab).   && 
25e50 21 70 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61  !pSrc->isCorrela
25e60 74 65 64 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  ted.  ){.    /* 
25e70 47 65 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e  Generate auto-in
25e80 64 65 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a  dex WhereLoops *
25e90 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
25ea0 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57 68 65 72  *pTerm;.    Wher
25eb0 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20  eTerm *pWCEnd = 
25ec0 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54  pWC->a + pWC->nT
25ed0 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54 65  erm;.    for(pTe
25ee0 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53  rm=pWC->a; rc==S
25ef0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72  QLITE_OK && pTer
25f00 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
25f10 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54  +){.      if( pT
25f20 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
25f30 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c   & pNew->maskSel
25f40 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  f ) continue;.  
25f50 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
25f60 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
25f70 20 70 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20   pSrc, 0) ){.   
25f80 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
25f90 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20  ee.nEq = 1;.    
25fa0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
25fb0 65 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20  e.nSkip = 0;.   
25fc0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
25fd0 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
25fe0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54         pNew->nLT
25ff0 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
26000 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d   pNew->aLTerm[0]
26010 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
26020 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65    /* TUNING: One
26030 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63  -time cost for c
26040 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75 74  omputing the aut
26050 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a  omatic index is.
26060 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 72 6f          ** appro
26070 78 69 6d 61 74 65 6c 79 20 37 2a 4e 2a 6c 6f 67  ximately 7*N*log
26080 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20  2(N) where N is 
26090 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
260a0 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ws in.        **
260b0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
260c0 20 69 6e 64 65 78 65 64 2e 20 2a 2f 0a 20 20 20   indexed. */.   
260d0 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
260e0 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72  p = rLogSize + r
260f0 53 69 7a 65 20 2b 20 32 38 3b 20 20 61 73 73 65  Size + 28;  asse
26100 72 74 28 20 32 38 3d 3d 73 71 6c 69 74 65 33 4c  rt( 28==sqlite3L
26110 6f 67 45 73 74 28 37 29 20 29 3b 0a 20 20 20 20  ogEst(7) );.    
26120 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45      /* TUNING: E
26130 61 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70  ach index lookup
26140 20 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20   yields 20 rows 
26150 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54  in the table.  T
26160 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  his.        ** i
26170 73 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20  s more than the 
26180 75 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31  usual guess of 1
26190 30 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65  0 rows, since we
261a0 20 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20   have no way.   
261b0 20 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 6e       ** of known
261c0 69 6e 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76  ing how selectiv
261d0 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c  e the index will
261e0 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20   ultimately be. 
261f0 20 49 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20   It would.      
26200 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65    ** not be unre
26210 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  asonable to make
26220 20 74 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68   this value much
26230 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20   larger. */.    
26240 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
26250 20 34 33 3b 20 20 61 73 73 65 72 74 28 20 34 33   43;  assert( 43
26260 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
26270 32 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  20) );.        p
26280 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
26290 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f  te3LogEstAdd(rLo
262a0 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74  gSize,pNew->nOut
262b0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
262c0 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
262d0 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20  _AUTO_INDEX;.   
262e0 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
262f0 71 20 3d 20 6d 45 78 74 72 61 20 7c 20 70 54 65  q = mExtra | pTe
26300 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  rm->prereqRight;
26310 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
26320 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
26330 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
26340 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
26350 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
26360 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
26370 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20  _INDEX */..  /* 
26380 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e  Loop over all in
26390 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72  dices.  */.  for
263a0 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  (; rc==SQLITE_OK
263b0 20 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f   && pProbe; pPro
263c0 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74  be=pProbe->pNext
263d0 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20  , iSortIdx++){. 
263e0 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70     if( pProbe->p
263f0 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a  PartIdxWhere!=0.
26400 20 20 20 20 20 26 26 20 21 77 68 65 72 65 55 73       && !whereUs
26410 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78  ablePartialIndex
26420 28 70 4e 65 77 2d 3e 69 54 61 62 2c 20 70 57 43  (pNew->iTab, pWC
26430 2c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49  , pProbe->pPartI
26440 64 78 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20  dxWhere) ){.    
26450 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
26460 50 61 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e  Partial index in
26470 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
26480 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20  this query */.  
26490 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e    }.    pNew->u.
264a0 62 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20  btree.nEq = 0;. 
264b0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
264c0 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  .nSkip = 0;.    
264d0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  pNew->nLTerm = 0
264e0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72  ;.    pNew->iSor
264f0 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e  tIdx = 0;.    pN
26500 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
26510 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
26520 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70   = mExtra;.    p
26530 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a  New->nOut = rSiz
26540 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  e;.    pNew->u.b
26550 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50  tree.pIndex = pP
26560 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e  robe;.    b = in
26570 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68  dexMightHelpWith
26580 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64 65 72  OrderBy(pBuilder
26590 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e  , pProbe, pSrc->
265a0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a  iCursor);.    /*
265b0 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53   The ONEPASS_DES
265c0 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72  IRED flags never
265d0 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65 72   occurs together
265e0 20 77 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a   with ORDER BY *
265f0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  /.    assert( (p
26600 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
26610 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
26620 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c  S_DESIRED)==0 ||
26630 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   b==0 );.    if(
26640 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30   pProbe->tnum<=0
26650 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74   ){.      /* Int
26660 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
26670 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
26680 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
26690 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20  WHERE_IPK;..    
266a0 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20    /* Full table 
266b0 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e  scan */.      pN
266c0 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62  ew->iSortIdx = b
266d0 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b   ? iSortIdx : 0;
266e0 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  .      /* TUNING
266f0 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74  : Cost of full t
26700 61 62 6c 65 20 73 63 61 6e 20 69 73 20 33 2a 28  able scan is 3*(
26710 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20 20  N + log2(N))..  
26720 20 20 20 20 2a 2a 20 20 2b 20 20 54 68 65 20 65      **  +  The e
26730 78 74 72 61 20 33 20 66 61 63 74 6f 72 20 69 73  xtra 3 factor is
26740 20 74 6f 20 65 6e 63 6f 75 72 61 67 65 20 74 68   to encourage th
26750 65 20 75 73 65 20 6f 66 20 69 6e 64 65 78 65 64  e use of indexed
26760 20 6c 6f 6f 6b 75 70 73 0a 20 20 20 20 20 20 2a   lookups.      *
26770 2a 20 20 20 20 20 6f 76 65 72 20 66 75 6c 6c 20  *     over full 
26780 73 63 61 6e 73 2e 20 20 46 49 58 4d 45 20 2a 2f  scans.  FIXME */
26790 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
267a0 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
267b0 74 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53  tAdd(rSize,rLogS
267c0 69 7a 65 29 20 2b 20 31 36 3b 0a 20 20 20 20 20  ize) + 16;.     
267d0 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74   whereLoopOutput
267e0 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77  Adjust(pWC, pNew
267f0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  );.      rc = wh
26800 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
26810 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
26820 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
26830 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  = rSize;.      i
26840 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
26850 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26860 42 69 74 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20  Bitmask m;.     
26870 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 69 73 43   if( pProbe->isC
26880 6f 76 65 72 69 6e 67 20 29 7b 0a 20 20 20 20 20  overing ){.     
26890 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
268a0 20 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   = WHERE_IDX_ONL
268b0 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45  Y | WHERE_INDEXE
268c0 44 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 30  D;.        m = 0
268d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
268e0 20 20 20 20 20 20 20 6d 20 3d 20 70 53 72 63 2d         m = pSrc-
268f0 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75  >colUsed & ~colu
26900 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50 72 6f 62  mnsInIndex(pProb
26910 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  e);.        pNew
26920 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d  ->wsFlags = (m==
26930 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f  0) ? (WHERE_IDX_
26940 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58  ONLY|WHERE_INDEX
26950 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45  ED) : WHERE_INDE
26960 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  XED;.      }..  
26970 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e      /* Full scan
26980 20 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20   via index */.  
26990 20 20 20 20 69 66 28 20 62 0a 20 20 20 20 20 20      if( b.      
269a0 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 54   || !HasRowid(pT
269b0 61 62 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20  ab).       || ( 
269c0 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  m==0.         &&
269d0 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65   pProbe->bUnorde
269e0 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  red==0.         
269f0 26 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a 49 64  && (pProbe->szId
26a00 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62  xRow<pTab->szTab
26a10 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 26 26  Row).         &&
26a20 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
26a30 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
26a40 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
26a50 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c  .         && sql
26a60 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
26a70 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20 20 20  .bUseCis.       
26a80 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
26a90 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d  nEnabled(pWInfo-
26aa0 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c  >pParse->db, SQL
26ab0 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e  ITE_CoverIdxScan
26ac0 29 0a 20 20 20 20 20 20 20 20 20 20 29 0a 20 20  ).          ).  
26ad0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
26ae0 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
26af0 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30  b ? iSortIdx : 0
26b00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 3d  ;.        if( m=
26b10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
26b20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
26b30 6f 66 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  of a covering in
26b40 64 65 78 20 73 63 61 6e 20 69 73 20 4b 2a 28 4e  dex scan is K*(N
26b50 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20 20 20   + log2(N))..   
26b60 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 20 54 68         **  +  Th
26b70 65 20 65 78 74 72 61 20 66 61 63 74 6f 72 20 4b  e extra factor K
26b80 20 6f 66 20 62 65 74 77 65 65 6e 20 31 2e 31 20   of between 1.1 
26b90 61 6e 64 20 33 2e 30 20 74 68 61 74 20 64 65 70  and 3.0 that dep
26ba0 65 6e 64 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ends.          *
26bb0 2a 20 20 20 20 20 6f 6e 20 74 68 65 20 72 65 6c  *     on the rel
26bc0 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74  ative sizes of t
26bd0 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  he table and the
26be0 20 69 6e 64 65 78 2e 20 20 4b 0a 20 20 20 20 20   index.  K.     
26bf0 20 20 20 20 20 2a 2a 20 20 20 20 20 69 73 20 73       **     is s
26c00 6d 61 6c 6c 65 72 20 66 6f 72 20 73 6d 61 6c 6c  maller for small
26c10 65 72 20 69 6e 64 69 63 65 73 2c 20 74 68 75 73  er indices, thus
26c20 20 66 61 76 6f 72 69 6e 67 20 74 68 65 6d 2e 0a   favoring them..
26c30 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
26c40 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
26c50 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
26c60 74 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53  tAdd(rSize,rLogS
26c70 69 7a 65 29 20 2b 20 31 20 2b 0a 20 20 20 20 20  ize) + 1 +.     
26c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c90 20 20 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73     (15*pProbe->s
26ca0 7a 49 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73  zIdxRow)/pTab->s
26cb0 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20  zTabRow;.       
26cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26cd0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
26ce0 74 20 6f 66 20 73 63 61 6e 6e 69 6e 67 20 61 20  t of scanning a 
26cf0 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
26d00 65 78 20 69 73 20 28 4e 2b 31 29 2a 6c 6f 67 32  ex is (N+1)*log2
26d10 28 4e 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  (N).          **
26d20 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c 20 73   which we will s
26d30 69 6d 70 6c 69 66 79 20 74 6f 20 6a 75 73 74 20  implify to just 
26d40 4e 2a 6c 6f 67 32 28 4e 29 20 2a 2f 0a 20 20 20  N*log2(N) */.   
26d50 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
26d60 6e 20 3d 20 72 53 69 7a 65 20 2b 20 72 4c 6f 67  n = rSize + rLog
26d70 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Size;.        }.
26d80 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
26d90 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 57  pOutputAdjust(pW
26da0 43 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  C, pNew);.      
26db0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
26dc0 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
26dd0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   pNew);.        
26de0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
26df0 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
26e00 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
26e10 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72    }.    }..    r
26e20 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
26e30 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
26e40 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
26e50 65 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51  e, 0);.#ifdef SQ
26e60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
26e70 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73  3_OR_STAT4.    s
26e80 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
26e90 46 72 65 65 28 70 42 75 69 6c 64 65 72 2d 3e 70  Free(pBuilder->p
26ea0 52 65 63 29 3b 0a 20 20 20 20 70 42 75 69 6c 64  Rec);.    pBuild
26eb0 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
26ec0 30 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d  0;.    pBuilder-
26ed0 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69  >pRec = 0;.#endi
26ee0 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  f..    /* If the
26ef0 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45  re was an INDEXE
26f00 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
26f10 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20  n only that one 
26f20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20  index is.    ** 
26f30 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20  considered. */. 
26f40 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e     if( pSrc->pIn
26f50 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  dex ) break;.  }
26f60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26f70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26f80 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
26f90 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  E./*.** Add all 
26fa0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
26fb0 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66  s for a table of
26fc0 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69   the join identi
26fd0 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c  fied by.** pBuil
26fe0 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e  der->pNew->iTab.
26ff0 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20    That table is 
27000 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
27010 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
27020 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27030 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
27040 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ual(.  WhereLoop
27050 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
27060 72 2c 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  r,  /* WHERE cla
27070 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  use information 
27080 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78  */.  Bitmask mEx
27090 74 72 61 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e  tra.){.  WhereIn
270a0 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
270b0 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61        /* WHERE a
270c0 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20  nalysis context 
270d0 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
270e0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
270f0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
27100 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
27110 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
27120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
27130 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
27140 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
27150 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20  st_item *pSrc;  
27160 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
27170 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
27180 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  ch */.  Table *p
27190 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Tab;.  sqlite3 *
271a0 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  db;.  sqlite3_in
271b0 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
271c0 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  fo;.  struct sql
271d0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
271e0 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
271f0 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
27200 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
27210 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65  nt_usage *pUsage
27220 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
27230 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Term;.  int i, j
27240 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d  ;.  int iTerm, m
27250 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f  xTerm;.  int nCo
27260 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20  nstraint;.  int 
27270 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20  seenIn = 0;     
27280 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
27290 20 69 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   if an IN operat
272a0 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20  or is seen */.  
272b0 69 6e 74 20 73 65 65 6e 56 61 72 20 3d 20 30 3b  int seenVar = 0;
272c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
272d0 54 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63 6f  True if a non-co
272e0 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72 61 69 6e  nstant constrain
272f0 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69  t is seen */.  i
27300 6e 74 20 69 50 68 61 73 65 3b 20 20 20 20 20 20  nt iPhase;      
27310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
27320 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c 20  : const w/o IN, 
27330 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20  1: const, 2: no 
27340 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20 20  IN,  2: IN */.  
27350 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
27360 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
27370 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e 66 6f  TE_OK;..  pWInfo
27380 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
27390 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20  nfo;.  pParse = 
273a0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
273b0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
273c0 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c  b;.  pWC = pBuil
273d0 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77  der->pWC;.  pNew
273e0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
273f0 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49  w;.  pSrc = &pWI
27400 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
27410 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20  [pNew->iTab];.  
27420 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61  pTab = pSrc->pTa
27430 62 3b 0a 20 20 61 73 73 65 72 74 28 20 49 73 56  b;.  assert( IsV
27440 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a  irtual(pTab) );.
27450 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c    pIdxInfo = all
27460 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70  ocateIndexInfo(p
27470 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63  Parse, pWC, pSrc
27480 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64  , pBuilder->pOrd
27490 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70 49 64  erBy);.  if( pId
274a0 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72  xInfo==0 ) retur
274b0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
274c0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
274d0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74   0;.  pNew->rSet
274e0 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  up = 0;.  pNew->
274f0 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
27500 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20  VIRTUALTABLE;.  
27510 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  pNew->nLTerm = 0
27520 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ;.  pNew->u.vtab
27530 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
27540 20 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e   pUsage = pIdxIn
27550 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
27560 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61  sage;.  nConstra
27570 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  int = pIdxInfo->
27580 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69  nConstraint;.  i
27590 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
275a0 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f  ze(db, pNew, nCo
275b0 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a 20 20 20  nstraint) ){.   
275c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
275d0 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20  b, pIdxInfo);.  
275e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
275f0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f  NOMEM;.  }..  fo
27600 72 28 69 50 68 61 73 65 3d 30 3b 20 69 50 68 61  r(iPhase=0; iPha
27610 73 65 3c 3d 33 3b 20 69 50 68 61 73 65 2b 2b 29  se<=3; iPhase++)
27620 7b 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 49  {.    if( !seenI
27630 6e 20 26 26 20 28 69 50 68 61 73 65 26 31 29 21  n && (iPhase&1)!
27640 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50 68 61  =0 ){.      iPha
27650 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  se++;.      if( 
27660 69 50 68 61 73 65 3e 33 20 29 20 62 72 65 61 6b  iPhase>3 ) break
27670 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
27680 21 73 65 65 6e 56 61 72 20 26 26 20 69 50 68 61  !seenVar && iPha
27690 73 65 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20 20  se>1 ) break;.  
276a0 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73    pIdxCons = *(s
276b0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
276c0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
276d0 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
276e0 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72  straint;.    for
276f0 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f  (i=0; i<pIdxInfo
27700 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
27710 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b  ++, pIdxCons++){
27720 0a 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43  .      j = pIdxC
27730 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74  ons->iTermOffset
27740 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
27750 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20  &pWC->a[j];.    
27760 20 20 73 77 69 74 63 68 28 20 69 50 68 61 73 65    switch( iPhase
27770 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
27780 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61   0:    /* Consta
27790 6e 74 73 20 77 69 74 68 6f 75 74 20 49 4e 20 6f  nts without IN o
277a0 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
277b0 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
277c0 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  sable = 0;.     
277d0 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
277e0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
277f0 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)!=0 ){.      
27800 20 20 20 20 20 20 73 65 65 6e 49 6e 20 3d 20 31        seenIn = 1
27810 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
27820 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
27830 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 21 3d  m->prereqRight!=
27840 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
27850 20 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20   seenVar = 1;.  
27860 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
27870 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
27880 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20  tor & WO_IN)==0 
27890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
278a0 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
278b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
278c0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
278d0 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 31  ;.        case 1
278e0 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74  :    /* Constant
278f0 73 20 77 69 74 68 20 49 4e 20 6f 70 65 72 61 74  s with IN operat
27900 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ors */.         
27910 20 61 73 73 65 72 74 28 20 73 65 65 6e 49 6e 20   assert( seenIn 
27920 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  );.          pId
27930 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
27940 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
27950 67 68 74 3d 3d 30 29 3b 0a 20 20 20 20 20 20 20  ght==0);.       
27960 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
27970 20 20 63 61 73 65 20 32 3a 20 20 20 20 2f 2a 20    case 2:    /* 
27980 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 6f 75  Variables withou
27990 74 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20  t IN */.        
279a0 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61    assert( seenVa
279b0 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  r );.          p
279c0 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
279d0 3d 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  = (pTerm->eOpera
279e0 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b  tor & WO_IN)==0;
279f0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
27a00 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  ;.        defaul
27a10 74 3a 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  t:   /* Variable
27a20 73 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20  s with IN */.   
27a30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
27a40 65 65 6e 56 61 72 20 26 26 20 73 65 65 6e 49 6e  eenVar && seenIn
27a50 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49   );.          pI
27a60 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
27a70 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
27a80 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
27a90 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 55   }.    memset(pU
27aa0 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sage, 0, sizeof(
27ab0 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49  pUsage[0])*pIdxI
27ac0 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
27ad0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49  );.    if( pIdxI
27ae0 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
27af0 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f  dxStr ) sqlite3_
27b00 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69  free(pIdxInfo->i
27b10 64 78 53 74 72 29 3b 0a 20 20 20 20 70 49 64 78  dxStr);.    pIdx
27b20 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30  Info->idxStr = 0
27b30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
27b40 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20  idxNum = 0;.    
27b50 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
27b60 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
27b70 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72      pIdxInfo->or
27b80 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
27b90 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
27ba0 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
27bb0 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20   SQLITE_BIG_DBL 
27bc0 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20  / (double)2;.   
27bd0 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
27be0 61 74 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20  atedRows = 25;. 
27bf0 20 20 20 72 63 20 3d 20 76 74 61 62 42 65 73 74     rc = vtabBest
27c00 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 54  Index(pParse, pT
27c10 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20  ab, pIdxInfo);. 
27c20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
27c30 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61   whereLoopAddVta
27c40 62 5f 65 78 69 74 3b 0a 20 20 20 20 70 49 64 78  b_exit;.    pIdx
27c50 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
27c60 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
27c70 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
27c80 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
27c90 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  t;.    pNew->pre
27ca0 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20  req = mExtra;.  
27cb0 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20    mxTerm = -1;. 
27cc0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
27cd0 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72  >nLSlot>=nConstr
27ce0 61 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72 28  aint );.    for(
27cf0 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69  i=0; i<nConstrai
27d00 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61  nt; i++) pNew->a
27d10 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20  LTerm[i] = 0;.  
27d20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f    pNew->u.vtab.o
27d30 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  mitMask = 0;.   
27d40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e   for(i=0; i<nCon
27d50 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
27d60 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20  dxCons++){.     
27d70 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55   if( (iTerm = pU
27d80 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
27d90 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20  x - 1)>=0 ){.   
27da0 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e       j = pIdxCon
27db0 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  s->iTermOffset;.
27dc0 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
27dd0 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20  m>=nConstraint. 
27de0 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20          || j<0. 
27df0 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57          || j>=pW
27e00 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  C->nTerm.       
27e10 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72    || pNew->aLTer
27e20 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20  m[iTerm]!=0.    
27e30 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
27e40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
27e50 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  OR;.          sq
27e60 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
27e70 61 72 73 65 2c 20 22 25 73 2e 78 42 65 73 74 49  arse, "%s.xBestI
27e80 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e 63 74 69  ndex() malfuncti
27e90 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  on", pTab->zName
27ea0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
27eb0 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74  o whereLoopAddVt
27ec0 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ab_exit;.       
27ed0 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63   }.        testc
27ee0 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e  ase( iTerm==nCon
27ef0 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20  straint-1 );.   
27f00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
27f10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
27f20 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d  estcase( j==pWC-
27f30 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20  >nTerm-1 );.    
27f40 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
27f50 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[j];.        
27f60 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20  pNew->prereq |= 
27f70 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
27f80 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
27f90 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e  rt( iTerm<pNew->
27fa0 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20  nLSlot );.      
27fb0 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69    pNew->aLTerm[i
27fc0 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  Term] = pTerm;. 
27fd0 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d         if( iTerm
27fe0 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d  >mxTerm ) mxTerm
27ff0 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20   = iTerm;.      
28000 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
28010 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20 20 20  m==15 );.       
28020 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d   testcase( iTerm
28030 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20 20 20  ==16 );.        
28040 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20  if( iTerm<16 && 
28050 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29  pUsage[i].omit )
28060 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
28070 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65  itMask |= 1<<iTe
28080 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rm;.        if( 
28090 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
280a0 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b  r & WO_IN)!=0 ){
280b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
280c0 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30  Usage[i].omit==0
280d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
280e0 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  /* Do not attemp
280f0 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e 20 63  t to use an IN c
28100 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74 68 65  onstraint if the
28110 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20   virtual table. 
28120 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61             ** sa
28130 79 73 20 74 68 61 74 20 74 68 65 20 65 71 75 69  ys that the equi
28140 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74 72  valent EQ constr
28150 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 73  aint cannot be s
28160 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20  afely omitted.. 
28170 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66             ** If
28180 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74 20 74   we do attempt t
28190 6f 20 75 73 65 20 73 75 63 68 20 61 20 63 6f 6e  o use such a con
281a0 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f  straint, some ro
281b0 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20 20 20  ws might be.    
281c0 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65 61          ** repea
281d0 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70 75  ted in the outpu
281e0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
281f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
28200 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f     }.          /
28210 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c  * A virtual tabl
28220 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72  e that is constr
28230 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63  ained by an IN c
28240 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20  lause may not.  
28250 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75          ** consu
28260 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  me the ORDER BY 
28270 63 6c 61 75 73 65 20 62 65 63 61 75 73 65 20 28  clause because (
28280 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  1) the order of 
28290 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20  IN terms.       
282a0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63     ** is not nec
282b0 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64  essarily related
282c0 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66   to the order of
282d0 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e   output terms an
282e0 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 28  d.          ** (
282f0 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70  2) Multiple outp
28300 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  uts from a singl
28310 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20  e IN value will 
28320 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20 20  not merge.      
28330 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e      ** together.
28340 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70    */.          p
28350 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
28360 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
28370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
28380 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e      }.    if( i>
28390 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a  =nConstraint ){.
283a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
283b0 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20  rm = mxTerm+1;. 
283c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
283d0 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d  w->nLTerm<=pNew-
283e0 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20  >nLSlot );.     
283f0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
28400 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xNum = pIdxInfo-
28410 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70  >idxNum;.      p
28420 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
28430 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  Free = pIdxInfo-
28440 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
28450 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  r;.      pIdxInf
28460 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
28470 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Str = 0;.      p
28480 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  New->u.vtab.idxS
28490 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69  tr = pIdxInfo->i
284a0 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 4e 65  dxStr;.      pNe
284b0 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65  w->u.vtab.isOrde
284c0 72 65 64 20 3d 20 28 75 38 29 28 28 70 49 64 78  red = (u8)((pIdx
284d0 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 21 3d  Info->nOrderBy!=
284e0 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
284f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28500 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78 49          && pIdxI
28510 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
28520 75 6d 65 64 29 3b 0a 20 20 20 20 20 20 70 4e 65  umed);.      pNe
28530 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
28540 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
28550 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46  = sqlite3LogEstF
28560 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e  romDouble(pIdxIn
28570 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
28580 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  t);.      pNew->
28590 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nOut = sqlite3Lo
285a0 67 45 73 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65  gEst(pIdxInfo->e
285b0 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 20  stimatedRows);. 
285c0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e       whereLoopIn
285d0 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
285e0 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20  New);.      if( 
285f0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
28600 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20  dFree ){.       
28610 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
28620 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  ew->u.vtab.idxSt
28630 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  r);.        pNew
28640 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
28650 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
28660 20 20 20 7d 0a 20 20 7d 20 20 0a 0a 77 68 65 72     }.  }  ..wher
28670 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69  eLoopAddVtab_exi
28680 74 3a 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66  t:.  if( pIdxInf
28690 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
286a0 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72  Str ) sqlite3_fr
286b0 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  ee(pIdxInfo->idx
286c0 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Str);.  sqlite3D
286d0 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e  bFree(db, pIdxIn
286e0 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  fo);.  return rc
286f0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
28700 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
28710 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LTABLE */../*.**
28720 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20 65   Add WhereLoop e
28730 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c 65  ntries to handle
28740 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69 73   OR terms.  This
28750 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68 65   works for eithe
28760 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20 76  r.** btrees or v
28770 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a  irtual tables..*
28780 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
28790 72 65 4c 6f 6f 70 41 64 64 4f 72 28 57 68 65 72  reLoopAddOr(Wher
287a0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
287b0 75 69 6c 64 65 72 2c 20 42 69 74 6d 61 73 6b 20  uilder, Bitmask 
287c0 6d 45 78 74 72 61 29 7b 0a 20 20 57 68 65 72 65  mExtra){.  Where
287d0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
287e0 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
287f0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
28800 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  pWC;.  WhereLoop
28810 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65 54   *pNew;.  WhereT
28820 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43  erm *pTerm, *pWC
28830 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  End;.  int rc = 
28840 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
28850 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c   iCur;.  WhereCl
28860 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 57  ause tempWC;.  W
28870 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
28880 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68 65  sSubBuild;.  Whe
28890 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73 43  reOrSet sSum, sC
288a0 75 72 2c 20 73 50 72 65 76 3b 0a 20 20 73 74 72  ur, sPrev;.  str
288b0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
288c0 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57   *pItem;.  .  pW
288d0 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
288e0 43 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  C;.  if( pWInfo-
288f0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
28900 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 29 20 72  ERE_AND_ONLY ) r
28910 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28920 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43 2d  .  pWCEnd = pWC-
28930 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b  >a + pWC->nTerm;
28940 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
28950 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73  er->pNew;.  mems
28960 65 74 28 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a  et(&sSum, 0, siz
28970 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20 70 49  eof(sSum));.  pI
28980 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  tem = pWInfo->pT
28990 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77  abList->a + pNew
289a0 2d 3e 69 54 61 62 3b 0a 20 20 69 66 28 20 21 48  ->iTab;.  if( !H
289b0 61 73 52 6f 77 69 64 28 70 49 74 65 6d 2d 3e 70  asRowid(pItem->p
289c0 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  Tab) ) return SQ
289d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 43 75 72 20  LITE_OK;.  iCur 
289e0 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
289f0 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  ;..  for(pTerm=p
28a00 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
28a10 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  End && rc==SQLIT
28a20 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  E_OK; pTerm++){.
28a30 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
28a40 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f  eOperator & WO_O
28a50 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  R)!=0.     && (p
28a60 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
28a70 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65  >indexable & pNe
28a80 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20  w->maskSelf)!=0 
28a90 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68  .    ){.      Wh
28aa0 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73  ereClause * cons
28ab0 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d  t pOrWC = &pTerm
28ac0 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b  ->u.pOrInfo->wc;
28ad0 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
28ae0 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e   * const pOrWCEn
28af0 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f  d = &pOrWC->a[pO
28b00 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20  rWC->nTerm];.   
28b10 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
28b20 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74  rTerm;.      int
28b30 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20   once = 1;.     
28b40 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a   int i, j;.    .
28b50 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 20        sSubBuild 
28b60 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20  = *pBuilder;.   
28b70 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72     sSubBuild.pOr
28b80 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
28b90 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 53 65   sSubBuild.pOrSe
28ba0 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20 20  t = &sCur;..    
28bb0 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f    for(pOrTerm=pO
28bc0 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c  rWC->a; pOrTerm<
28bd0 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72  pOrWCEnd; pOrTer
28be0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
28bf0 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  ( (pOrTerm->eOpe
28c00 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21  rator & WO_AND)!
28c10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
28c20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20  sSubBuild.pWC = 
28c30 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64  &pOrTerm->u.pAnd
28c40 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
28c50 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
28c60 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
28c70 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  =iCur ){.       
28c80 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f     tempWC.pWInfo
28c90 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a   = pWC->pWInfo;.
28ca0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
28cb0 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20  .pOuter = pWC;. 
28cc0 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
28cd0 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20  op = TK_AND;.   
28ce0 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54         tempWC.nT
28cf0 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
28d00 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f     tempWC.a = pO
28d10 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  rTerm;.         
28d20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d   sSubBuild.pWC =
28d30 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20   &tempWC;.      
28d40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28d50 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
28d60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
28d70 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 6e 64  Cur.n = 0;.#ifnd
28d80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
28d90 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
28da0 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
28db0 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29  l(pItem->pTab) )
28dc0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
28dd0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
28de0 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64 2c  tual(&sSubBuild,
28df0 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20   mExtra);.      
28e00 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
28e10 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
28e20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
28e30 70 41 64 64 42 74 72 65 65 28 26 73 53 75 62 42  pAddBtree(&sSubB
28e40 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20  uild, mExtra);. 
28e50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28e60 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
28e70 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e  ITE_OK || sCur.n
28e80 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
28e90 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a  f( sCur.n==0 ){.
28ea0 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e            sSum.n
28eb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
28ec0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
28ed0 65 6c 73 65 20 69 66 28 20 6f 6e 63 65 20 29 7b  else if( once ){
28ee0 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65  .          where
28ef0 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26 73  OrMove(&sSum, &s
28f00 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cur);.          
28f10 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  once = 0;.      
28f20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28f30 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26     whereOrMove(&
28f40 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20  sPrev, &sSum);. 
28f50 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20           sSum.n 
28f60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 0;.          f
28f70 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e  or(i=0; i<sPrev.
28f80 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
28f90 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
28fa0 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  sCur.n; j++){.  
28fb0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
28fc0 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c  eOrInsert(&sSum,
28fd0 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72   sPrev.a[i].prer
28fe0 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70  eq | sCur.a[j].p
28ff0 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20  rereq,.         
29000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29010 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74     sqlite3LogEst
29020 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72  Add(sPrev.a[i].r
29030 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72  Run, sCur.a[j].r
29040 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20  Run),.          
29050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29060 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41    sqlite3LogEstA
29070 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f  dd(sPrev.a[i].nO
29080 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f  ut, sCur.a[j].nO
29090 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ut));.          
290a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
290b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
290c0 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  }.      pNew->nL
290d0 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
290e0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  pNew->aLTerm[0] 
290f0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  = pTerm;.      p
29100 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
29110 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20  HERE_MULTI_OR;. 
29120 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
29130 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  p = 0;.      pNe
29140 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b  w->iSortIdx = 0;
29150 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
29160 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f  New->u, 0, sizeo
29170 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20  f(pNew->u));.   
29180 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
29190 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73  SQLITE_OK && i<s
291a0 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  Sum.n; i++){.   
291b0 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
291c0 4d 75 6c 74 69 70 6c 65 20 62 79 20 33 2e 35 20  Multiple by 3.5 
291d0 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 61 72  for the secondar
291e0 79 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 20 2a  y table lookup *
291f0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
29200 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  rRun = sSum.a[i]
29210 2e 72 52 75 6e 20 2b 20 31 38 3b 0a 20 20 20 20  .rRun + 18;.    
29220 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
29230 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b   sSum.a[i].nOut;
29240 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
29250 72 65 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69  rereq = sSum.a[i
29260 5d 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20  ].prereq;.      
29270 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
29280 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
29290 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a   pNew);.      }.
292a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
292b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
292c0 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
292d0 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c  p objects for al
292e0 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61  l tables .*/.sta
292f0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
29300 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f  pAddAll(WhereLoo
29310 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
29320 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  er){.  WhereInfo
29330 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
29340 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42  der->pWInfo;.  B
29350 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20  itmask mExtra = 
29360 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72  0;.  Bitmask mPr
29370 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ior = 0;.  int i
29380 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  Tab;.  SrcList *
29390 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
293a0 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  o->pTabList;.  s
293b0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
293c0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
293d0 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
293e0 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  o->pParse->db;. 
293f0 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 20 3d 20   int nTabList = 
29400 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a  pWInfo->nLevel;.
29410 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
29420 45 5f 4f 4b 3b 0a 20 20 75 38 20 70 72 69 6f 72  E_OK;.  u8 prior
29430 4a 6f 69 6e 54 79 70 65 20 3d 20 30 3b 0a 20 20  JoinType = 0;.  
29440 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
29450 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72  ..  /* Loop over
29460 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
29470 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65  he join, from le
29480 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20  ft to right */. 
29490 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
294a0 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c  ->pNew;.  whereL
294b0 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20  oopInit(pNew);. 
294c0 20 66 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74   for(iTab=0, pIt
294d0 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  em=pTabList->a; 
294e0 69 54 61 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69  iTab<nTabList; i
294f0 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  Tab++, pItem++){
29500 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20  .    pNew->iTab 
29510 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77  = iTab;.    pNew
29520 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74  ->maskSelf = get
29530 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
29540 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69  askSet, pItem->i
29550 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28  Cursor);.    if(
29560 20 28 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79   ((pItem->jointy
29570 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65  pe|priorJoinType
29580 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  ) & (JT_LEFT|JT_
29590 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20 20  CROSS))!=0 ){.  
295a0 20 20 20 20 6d 45 78 74 72 61 20 3d 20 6d 50 72      mExtra = mPr
295b0 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ior;.    }.    p
295c0 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70  riorJoinType = p
295d0 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  Item->jointype;.
295e0 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
295f0 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29  l(pItem->pTab) )
29600 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
29610 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
29620 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72  (pBuilder, mExtr
29630 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  a);.    }else{. 
29640 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
29650 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42 75 69  oopAddBtree(pBui
29660 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20  lder, mExtra);. 
29670 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
29680 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29690 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
296a0 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72  opAddOr(pBuilder
296b0 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d  , mExtra);.    }
296c0 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70  .    mPrior |= p
296d0 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  New->maskSelf;. 
296e0 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d     if( rc || db-
296f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
29700 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 65  break;.  }.  whe
29710 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20  reLoopClear(db, 
29720 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
29730 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61  rc;.}../*.** Exa
29740 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61 74 68  mine a WherePath
29750 20 28 77 69 74 68 20 74 68 65 20 61 64 64 69 74   (with the addit
29760 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61  ion of the extra
29770 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68   WhereLoop of th
29780 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74  e 5th.** paramet
29790 65 72 73 29 20 74 6f 20 73 65 65 20 69 66 20 69  ers) to see if i
297a0 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69  t outputs rows i
297b0 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
297c0 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20  ORDER BY.** (or 
297d0 47 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75  GROUP BY) withou
297e0 74 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65  t requiring a se
297f0 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72  parate sort oper
29800 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 3a 0a  ation.  Return:.
29810 2a 2a 20 0a 2a 2a 20 20 20 20 30 3a 20 20 4f 52  ** .**    0:  OR
29820 44 45 52 20 42 59 20 69 73 20 6e 6f 74 20 73 61  DER BY is not sa
29830 74 69 73 66 69 65 64 2e 20 20 53 6f 72 74 69 6e  tisfied.  Sortin
29840 67 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 20 20  g required.**   
29850 20 31 3a 20 20 4f 52 44 45 52 20 42 59 20 69 73   1:  ORDER BY is
29860 20 73 61 74 69 73 66 69 65 64 2e 20 20 20 20 20   satisfied.     
29870 20 4f 6d 69 74 20 73 6f 72 74 69 6e 67 0a 2a 2a   Omit sorting.**
29880 20 20 20 2d 31 3a 20 20 55 6e 6b 6e 6f 77 6e 20     -1:  Unknown 
29890 61 74 20 74 68 69 73 20 74 69 6d 65 0a 2a 2a 0a  at this time.**.
298a0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 72 6f  ** Note that pro
298b0 63 65 73 73 69 6e 67 20 66 6f 72 20 57 48 45 52  cessing for WHER
298c0 45 5f 47 52 4f 55 50 42 59 20 61 6e 64 20 57 48  E_GROUPBY and WH
298d0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 69  ERE_DISTINCTBY i
298e0 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72 69  s not as.** stri
298f0 63 74 2e 20 20 57 69 74 68 20 47 52 4f 55 50 20  ct.  With GROUP 
29900 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20  BY and DISTINCT 
29910 74 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65  the only require
29920 6d 65 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a 20  ment is that.** 
29930 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20  equivalent rows 
29940 61 70 70 65 61 72 20 69 6d 6d 65 64 69 61 74 65  appear immediate
29950 6c 79 20 61 64 6a 61 63 65 6e 74 20 74 6f 20 6f  ly adjacent to o
29960 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20 47 52 4f  ne another.  GRO
29970 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49 53  UP BY.** and DIS
29980 54 49 4e 54 20 64 6f 20 6e 6f 74 20 72 65 71 75  TINT do not requ
29990 69 72 65 20 72 6f 77 73 20 74 6f 20 61 70 70 65  ire rows to appe
299a0 61 72 20 69 6e 20 61 6e 79 20 70 61 72 74 69 63  ar in any partic
299b0 75 6c 61 72 20 6f 72 64 65 72 20 61 73 20 6c 6f  ular order as lo
299c0 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69 76 65 6c  ng.** as equivel
299d0 65 6e 74 20 72 6f 77 73 20 61 72 65 20 67 72 6f  ent rows are gro
299e0 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e 20 20  uped together.  
299f0 54 68 75 73 20 66 6f 72 20 47 52 4f 55 50 20 42  Thus for GROUP B
29a00 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a  Y and DISTINCT.*
29a10 2a 20 74 68 65 20 70 4f 72 64 65 72 42 79 20 74  * the pOrderBy t
29a20 65 72 6d 73 20 63 61 6e 20 62 65 20 6d 61 74 63  erms can be matc
29a30 68 65 64 20 69 6e 20 61 6e 79 20 6f 72 64 65 72  hed in any order
29a40 2e 20 20 57 69 74 68 20 4f 52 44 45 52 20 42 59  .  With ORDER BY
29a50 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72  , the .** pOrder
29a60 42 79 20 74 65 72 6d 73 20 6d 75 73 74 20 62 65  By terms must be
29a70 20 6d 61 74 63 68 65 64 20 69 6e 20 73 74 72 69   matched in stri
29a80 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74  ct left-to-right
29a90 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
29aa0 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68 53  c int wherePathS
29ab0 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
29ac0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
29ad0 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20  Info,    /* The 
29ae0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
29af0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
29b00 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45 52  erBy,   /* ORDER
29b10 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
29b20 6f 72 20 44 49 53 54 49 4e 43 54 20 63 6c 61 75  or DISTINCT clau
29b30 73 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  se to check */. 
29b40 20 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74   WherePath *pPat
29b50 68 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  h,     /* The Wh
29b60 65 72 65 50 61 74 68 20 74 6f 20 63 68 65 63 6b  erePath to check
29b70 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
29b80 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4d  lags,       /* M
29b90 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 57 48 45  ight contain WHE
29ba0 52 45 5f 47 52 4f 55 50 42 59 20 6f 72 20 57 48  RE_GROUPBY or WH
29bb0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 2a  ERE_DISTINCTBY *
29bc0 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20  /.  u16 nLoop,  
29bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
29be0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
29bf0 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d  n pPath->aLoop[]
29c00 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
29c10 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20 41  *pLast,     /* A
29c20 64 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f  dd this WhereLoo
29c30 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
29c40 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a  pPath->aLoop[] *
29c50 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70 52 65  /.  Bitmask *pRe
29c60 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54  vMask     /* OUT
29c70 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65 4c  : Mask of WhereL
29c80 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20 72  oops to run in r
29c90 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
29ca0 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b 20  ){.  u8 revSet; 
29cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
29cc0 75 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e 6f  ue if rev is kno
29cd0 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20  wn */.  u8 rev; 
29ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29cf0 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74 20   Composite sort 
29d00 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72 65  order */.  u8 re
29d10 76 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  vIdx;           
29d20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20 6f   /* Index sort o
29d30 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f  rder */.  u8 isO
29d40 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20 20 20  rderDistinct;   
29d50 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57 68 65  /* All prior Whe
29d60 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64 65  reLoops are orde
29d70 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  r-distinct */.  
29d80 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d  u8 distinctColum
29d90 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ns;   /* True if
29da0 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e   the loop has UN
29db0 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  IQUE NOT NULL co
29dc0 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73  lumns */.  u8 is
29dd0 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20  Match;          
29de0 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63   /* iColumn matc
29df0 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68  hes a term of th
29e00 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
29e10 65 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43  e */.  u16 nKeyC
29e20 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ol;          /* 
29e30 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20 63 6f  Number of key co
29e40 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78 20  lumns in pIndex 
29e50 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e  */.  u16 nColumn
29e60 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
29e70 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 72  tal number of or
29e80 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e  dered columns in
29e90 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
29ea0 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 20 20 20  u16 nOrderBy;   
29eb0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
29ec0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
29ed0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
29ee0 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20    int iLoop;    
29ef0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
29f00 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e   of WhereLoop in
29f10 20 70 50 61 74 68 20 62 65 69 6e 67 20 70 72 6f   pPath being pro
29f20 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20  cessed */.  int 
29f30 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
29f40 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
29f50 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  rs */.  int iCur
29f60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
29f70 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
29f80 6f 72 20 63 75 72 72 65 6e 74 20 57 68 65 72 65  or current Where
29f90 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43  Loop */.  int iC
29fa0 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
29fb0 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  /* A column numb
29fc0 65 72 20 77 69 74 68 69 6e 20 74 61 62 6c 65 20  er within table 
29fd0 69 43 75 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c  iCur */.  WhereL
29fe0 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20  oop *pLoop = 0; 
29ff0 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72 65  /* Current Where
2a000 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f 63 65  Loop being proce
2a010 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65  ssed. */.  Where
2a020 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
2a030 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
2a040 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
2a050 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20  lause */.  Expr 
2a060 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20  *pOBExpr;       
2a070 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f   /* An expressio
2a080 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52  n from the ORDER
2a090 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
2a0a0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
2a0b0 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45        /* COLLATE
2a0c0 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61   function from a
2a0d0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
2a0e0 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65  e term */.  Inde
2a0f0 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
2a100 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 61    /* The index a
2a110 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
2a120 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Loop */.  sqlite
2a130 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
2a140 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
2a150 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
2a160 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
2a170 20 6f 62 53 61 74 20 3d 20 30 3b 20 20 20 20 2f   obSat = 0;    /
2a180 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20  * Mask of ORDER 
2a190 42 59 20 74 65 72 6d 73 20 73 61 74 69 73 66 69  BY terms satisfi
2a1a0 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42  ed so far */.  B
2a1b0 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20  itmask obDone;  
2a1c0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
2a1d0 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72  all ORDER BY ter
2a1e0 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
2a1f0 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
2a200 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61  k;  /* Mask of a
2a210 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20  ll well-ordered 
2a220 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61  loops */.  Bitma
2a230 73 6b 20 72 65 61 64 79 3b 20 20 20 20 20 20 20  sk ready;       
2a240 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
2a250 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f  f inner loops */
2a260 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73  ..  /*.  ** We s
2a270 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ay the WhereLoop
2a280 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66   is "one-row" if
2a290 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 6e 6f   it generates no
2a2a0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20   more than one. 
2a2b0 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75   ** row of outpu
2a2c0 74 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20  t.  A WhereLoop 
2a2d0 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c  is one-row if al
2a2e0 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
2a2f0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a  ng are true:.  *
2a300 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e 64 65 78  *  (a) All index
2a310 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77   columns match w
2a320 69 74 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ith WHERE_COLUMN
2a330 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54  _EQ..  **  (b) T
2a340 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71  he index is uniq
2a350 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65 72  ue.  ** Any Wher
2a360 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 57 48  eLoop with an WH
2a370 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f  ERE_COLUMN_EQ co
2a380 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
2a390 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77  rowid is one-row
2a3a0 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65  ..  ** Every one
2a3b0 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 77  -row WhereLoop w
2a3c0 69 6c 6c 20 68 61 76 65 20 74 68 65 20 57 48 45  ill have the WHE
2a3d0 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73 65  RE_ONEROW bit se
2a3e0 74 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20  t in wsFlags..  
2a3f0 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74  **.  ** We say t
2a400 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  he WhereLoop is 
2a410 22 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 22  "order-distinct"
2a420 20 69 66 20 74 68 65 20 73 65 74 20 6f 66 20 63   if the set of c
2a430 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a  olumns from.  **
2a440 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20   that WhereLoop 
2a450 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 20  that are in the 
2a460 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2a470 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f  are different fo
2a480 72 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77  r every.  ** row
2a490 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
2a4a0 70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f  p.  Every one-ro
2a4b0 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 61  w WhereLoop is a
2a4c0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a  utomatically.  *
2a4d0 2a 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  * order-distinct
2a4e0 2e 20 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20  .   A WhereLoop 
2a4f0 74 68 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75  that has no colu
2a500 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  mns in the ORDER
2a510 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   BY clause.  ** 
2a520 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73  is not order-dis
2a530 74 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72 64  tinct. To be ord
2a540 65 72 2d 64 69 73 74 69 6e 63 74 20 69 73 20 6e  er-distinct is n
2a550 6f 74 20 71 75 69 74 65 20 74 68 65 20 73 61 6d  ot quite the sam
2a560 65 20 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20  e as being.  ** 
2a570 55 4e 49 51 55 45 20 73 69 6e 63 65 20 61 20 55  UNIQUE since a U
2a580 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20  NIQUE column or 
2a590 69 6e 64 65 78 20 63 61 6e 20 68 61 76 65 20 6d  index can have m
2a5a0 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74 68 61  ultiple rows tha
2a5b0 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c  t .  ** are NULL
2a5c0 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73   and NULL values
2a5d0 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 20   are equivalent 
2a5e0 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20  for the purpose 
2a5f0 6f 66 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  of order-distinc
2a600 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72  t..  ** To be or
2a610 64 65 72 2d 64 69 73 74 69 6e 63 74 2c 20 74 68  der-distinct, th
2a620 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62  e columns must b
2a630 65 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54  e UNIQUE and NOT
2a640 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   NULL..  **.  **
2a650 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 61   The rowid for a
2a660 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73   table is always
2a670 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20   UNIQUE and NOT 
2a680 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65 72  NULL so whenever
2a690 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20   the.  ** rowid 
2a6a0 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 4f  appears in the O
2a6b0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
2a6c0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2a6d0 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20  g WhereLoop is. 
2a6e0 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
2a6f0 79 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  y order-distinct
2a700 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ..  */..  assert
2a710 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b  ( pOrderBy!=0 );
2a720 0a 0a 20 20 2f 2a 20 53 6f 72 74 61 62 69 6c 69  ..  /* Sortabili
2a730 74 79 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61  ty of virtual ta
2a740 62 6c 65 73 20 69 73 20 64 65 74 65 72 6d 69 6e  bles is determin
2a750 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49  ed by the xBestI
2a760 6e 64 65 78 20 6d 65 74 68 6f 64 0a 20 20 2a 2a  ndex method.  **
2a770 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   of the virtual 
2a780 74 61 62 6c 65 20 69 74 73 65 6c 66 20 2a 2f 0a  table itself */.
2a790 20 20 69 66 28 20 70 4c 61 73 74 2d 3e 77 73 46    if( pLast->wsF
2a7a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
2a7b0 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20  TUALTABLE ){.   
2a7c0 20 74 65 73 74 63 61 73 65 28 20 6e 4c 6f 6f 70   testcase( nLoop
2a7d0 3e 30 20 29 3b 20 20 2f 2a 20 54 72 75 65 20 77  >0 );  /* True w
2a7e0 68 65 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20  hen outer loops 
2a7f0 61 72 65 20 6f 6e 65 2d 72 6f 77 20 61 6e 64 20  are one-row and 
2a800 6d 61 74 63 68 20 0a 20 20 20 20 20 20 20 20 20  match .         
2a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a820 20 2a 2a 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   ** no ORDER BY 
2a830 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 72 65 74  terms */.    ret
2a840 75 72 6e 20 70 4c 61 73 74 2d 3e 75 2e 76 74 61  urn pLast->u.vta
2a850 62 2e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 7d  b.isOrdered;.  }
2a860 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20  .  if( nLoop && 
2a870 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
2a880 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
2a890 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 29 20  OrderByIdxJoin) 
2a8a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e  ) return 0;..  n
2a8b0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
2a8c0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73  By->nExpr;.  tes
2a8d0 74 63 61 73 65 28 20 6e 4f 72 64 65 72 42 79 3d  tcase( nOrderBy=
2a8e0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20  =BMS-1 );.  if( 
2a8f0 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31 20 29  nOrderBy>BMS-1 )
2a900 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
2a910 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f  annot optimize o
2a920 76 65 72 6c 79 20 6c 61 72 67 65 20 4f 52 44 45  verly large ORDE
2a930 52 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64  R BYs */.  isOrd
2a940 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a  erDistinct = 1;.
2a950 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42    obDone = MASKB
2a960 49 54 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a  IT(nOrderBy)-1;.
2a970 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d    orderDistinctM
2a980 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64 79  ask = 0;.  ready
2a990 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f   = 0;.  for(iLoo
2a9a0 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73 74  p=0; isOrderDist
2a9b0 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f 62  inct && obSat<ob
2a9c0 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e  Done && iLoop<=n
2a9d0 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
2a9e0 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20      if( iLoop>0 
2a9f0 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70  ) ready |= pLoop
2aa00 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
2aa10 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c  pLoop = iLoop<nL
2aa20 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61 4c 6f  oop ? pPath->aLo
2aa30 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73  op[iLoop] : pLas
2aa40 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  t;.    assert( (
2aa50 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2aa60 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
2aa70 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69  BLE)==0 );.    i
2aa80 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Cur = pWInfo->pT
2aa90 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d  abList->a[pLoop-
2aaa0 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a  >iTab].iCursor;.
2aab0 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66  .    /* Mark off
2aac0 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74 65   any ORDER BY te
2aad0 72 6d 20 58 20 74 68 61 74 20 69 73 20 61 20 63  rm X that is a c
2aae0 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62  olumn in the tab
2aaf0 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  le of.    ** the
2ab00 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f   current loop fo
2ab10 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69 73  r which there is
2ab20 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
2ab30 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  RE.    ** clause
2ab40 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49   of the form X I
2ab50 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68  S NULL or X=? th
2ab60 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  at reference onl
2ab70 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c  y outer.    ** l
2ab80 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  oops..    */.   
2ab90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
2aba0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
2abb0 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29    if( MASKBIT(i)
2abc0 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69   & obSat ) conti
2abd0 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45 78  nue;.      pOBEx
2abe0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
2abf0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64  SkipCollate(pOrd
2ac00 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2ac10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42  );.      if( pOB
2ac20 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
2ac30 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UMN ) continue;.
2ac40 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
2ac50 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20  r->iTable!=iCur 
2ac60 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2ac70 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
2ac80 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  rm(&pWInfo->sWC,
2ac90 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e   iCur, pOBExpr->
2aca0 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
2acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acc0 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f  ~ready, WO_EQ|WO
2acd0 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20  _ISNULL, 0);.   
2ace0 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
2acf0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2ad00 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
2ad10 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d  perator&WO_EQ)!=
2ad20 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43  0 && pOBExpr->iC
2ad30 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
2ad40 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2ad50 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20  z1, *z2;.       
2ad60 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
2ad70 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e  ExprCollSeq(pWIn
2ad80 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64  fo->pParse, pOrd
2ad90 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2ada0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
2adb0 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
2adc0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
2add0 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c         z1 = pCol
2ade0 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l->zName;.      
2adf0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2ae00 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49  3ExprCollSeq(pWI
2ae10 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54 65  nfo->pParse, pTe
2ae20 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  rm->pExpr);.    
2ae30 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
2ae40 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
2ae50 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
2ae60 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  z2 = pColl->zNam
2ae70 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  e;.        if( s
2ae80 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31  qlite3StrICmp(z1
2ae90 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74 69  , z2)!=0 ) conti
2aea0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
2aeb0 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
2aec0 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20  BIT(i);.    }.. 
2aed0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
2aee0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
2aef0 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20  NEROW)==0 ){.   
2af00 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
2af10 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  Flags & WHERE_IP
2af20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  K ){.        pIn
2af30 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dex = 0;.       
2af40 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20   nKeyCol = 0;.  
2af50 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20        nColumn = 
2af60 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
2af70 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f  f( (pIndex = pLo
2af80 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
2af90 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78  ex)==0 || pIndex
2afa0 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a  ->bUnordered ){.
2afb0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
2afc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2afd0 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d         nKeyCol =
2afe0 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c   pIndex->nKeyCol
2aff0 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d  ;.        nColum
2b000 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  n = pIndex->nCol
2b010 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73  umn;.        ass
2b020 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b  ert( nColumn==nK
2b030 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73 52  eyCol+1 || !HasR
2b040 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61  owid(pIndex->pTa
2b050 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ble) );.        
2b060 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e  assert( pIndex->
2b070 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e  aiColumn[nColumn
2b080 2d 31 5d 3d 3d 28 2d 31 29 20 7c 7c 20 21 48 61  -1]==(-1) || !Ha
2b090 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70  sRowid(pIndex->p
2b0a0 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 20  Table));.       
2b0b0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2b0c0 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72   = pIndex->onErr
2b0d0 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 20  or!=OE_None;.   
2b0e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c     }..      /* L
2b0f0 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
2b100 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
2b110 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69  ndex and deal wi
2b120 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20  th the ones.    
2b130 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f    ** that are no
2b140 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  t constrained by
2b150 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20   == or IN..     
2b160 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20   */.      rev = 
2b170 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20  revSet = 0;.    
2b180 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e    distinctColumn
2b190 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  s = 0;.      for
2b1a0 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b  (j=0; j<nColumn;
2b1b0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   j++){.        u
2b1c0 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72  8 bOnce;   /* Tr
2b1d0 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52  ue to run the OR
2b1e0 44 45 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f  DER BY search lo
2b1f0 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  op */..        /
2b200 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61  * Skip over == a
2b210 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d 73  nd IS NULL terms
2b220 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2b230 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  j<pLoop->u.btree
2b240 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26  .nEq.         &&
2b250 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2b260 6e 53 6b 69 70 3d 3d 30 0a 20 20 20 20 20 20 20  nSkip==0.       
2b270 20 20 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70    && ((i = pLoop
2b280 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70  ->aLTerm[j]->eOp
2b290 65 72 61 74 6f 72 29 20 26 20 28 57 4f 5f 45 51  erator) & (WO_EQ
2b2a0 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 0a  |WO_ISNULL))!=0.
2b2b0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2b2c0 20 20 20 20 20 69 66 28 20 69 20 26 20 57 4f 5f       if( i & WO_
2b2d0 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ISNULL ){.      
2b2e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b2f0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2b300 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2b310 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
2b320 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
2b330 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2b340 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20 7d 0a  ue;  .        }.
2b350 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20  .        /* Get 
2b360 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
2b370 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 28  r in the table (
2b380 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72  iColumn) and sor
2b390 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  t order.        
2b3a0 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72 20  ** (revIdx) for 
2b3b0 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20  the j-th column 
2b3c0 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  of the index..  
2b3d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2b3e0 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
2b3f0 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e           iColumn
2b400 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c   = pIndex->aiCol
2b410 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  umn[j];.        
2b420 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65    revIdx = pInde
2b430 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  x->aSortOrder[j]
2b440 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2b450 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d  iColumn==pIndex-
2b460 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29  >pTable->iPKey )
2b470 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20   iColumn = -1;. 
2b480 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2b490 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20          iColumn 
2b4a0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
2b4b0 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  revIdx = 0;.    
2b4c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
2b4d0 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e  * An unconstrain
2b4e0 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d  ed column that m
2b4f0 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61  ight be NULL mea
2b500 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20 20 20  ns that this.   
2b510 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f       ** WhereLoo
2b520 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72  p is not well-or
2b530 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2f  dered.        */
2b540 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
2b550 72 64 65 72 44 69 73 74 69 6e 63 74 0a 20 20 20  rderDistinct.   
2b560 20 20 20 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e        && iColumn
2b570 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  >=0.         && 
2b580 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  j>=pLoop->u.btre
2b590 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26  e.nEq.         &
2b5a0 26 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  & pIndex->pTable
2b5b0 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e  ->aCol[iColumn].
2b5c0 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20  notNull==0.     
2b5d0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2b5e0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2b5f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
2b600 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20          /* Find 
2b610 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72  the ORDER BY ter
2b620 6d 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  m that correspon
2b630 64 73 20 74 6f 20 74 68 65 20 6a 2d 74 68 20 63  ds to the j-th c
2b640 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a  olumn.        **
2b650 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e   of the index an
2b660 64 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20  d and mark that 
2b670 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66  ORDER BY term of
2b680 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  f .        */.  
2b690 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 31 3b        bOnce = 1;
2b6a0 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68  .        isMatch
2b6b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
2b6c0 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20  r(i=0; bOnce && 
2b6d0 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
2b6e0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2b6f0 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53  MASKBIT(i) & obS
2b700 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  at ) continue;. 
2b710 20 20 20 20 20 20 20 20 20 70 4f 42 45 78 70 72           pOBExpr
2b720 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
2b730 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72  ipCollate(pOrder
2b740 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
2b750 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2b760 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20  ase( wctrlFlags 
2b770 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  & WHERE_GROUPBY 
2b780 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
2b790 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67  tcase( wctrlFlag
2b7a0 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e  s & WHERE_DISTIN
2b7b0 43 54 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20  CTBY );.        
2b7c0 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
2b7d0 73 20 26 20 28 57 48 45 52 45 5f 47 52 4f 55 50  s & (WHERE_GROUP
2b7e0 42 59 7c 57 48 45 52 45 5f 44 49 53 54 49 4e 43  BY|WHERE_DISTINC
2b7f0 54 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65  TBY))==0 ) bOnce
2b800 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2b810 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21  if( pOBExpr->op!
2b820 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e  =TK_COLUMN ) con
2b830 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2b840 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54   if( pOBExpr->iT
2b850 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e  able!=iCur ) con
2b860 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2b870 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43   if( pOBExpr->iC
2b880 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29  olumn!=iColumn )
2b890 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2b8a0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
2b8b0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
2b8c0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2b8d0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
2b8e0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f  Info->pParse, pO
2b8f0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2b900 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
2b910 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
2b920 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
2b930 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
2b940 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
2b950 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
2b960 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  , pIndex->azColl
2b970 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  [j])!=0 ) contin
2b980 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
2b990 20 20 20 20 20 20 20 20 20 20 69 73 4d 61 74 63            isMatc
2b9a0 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  h = 1;.         
2b9b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2b9c0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  }.        if( is
2b9d0 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20  Match ){.       
2b9e0 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30     if( iColumn<0
2b9f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ba00 74 65 73 74 63 61 73 65 28 20 64 69 73 74 69 6e  testcase( distin
2ba10 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a  ctColumns==0 );.
2ba20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
2ba30 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b  inctColumns = 1;
2ba40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ba50 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20         obSat |= 
2ba60 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
2ba70 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66        if( (pWInf
2ba80 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
2ba90 57 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d  WHERE_GROUPBY)==
2baa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2bab0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
2bac0 65 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73 20  e sort order is 
2bad0 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61 6e  compatible in an
2bae0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2baf0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
2bb00 20 53 6f 72 74 20 6f 72 64 65 72 20 69 73 20 69   Sort order is i
2bb10 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 61 20  rrelevant for a 
2bb20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
2bb30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2bb40 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a 20 20  if( revSet ){.  
2bb50 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2bb60 28 72 65 76 20 5e 20 72 65 76 49 64 78 29 21 3d  (rev ^ revIdx)!=
2bb70 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
2bb80 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74 75 72  ortOrder ) retur
2bb90 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n 0;.           
2bba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2bbb0 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 49        rev = revI
2bbc0 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61  dx ^ pOrderBy->a
2bbd0 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
2bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2bbf0 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73 6b   rev ) *pRevMask
2bc00 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f   |= MASKBIT(iLoo
2bc10 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
2bc20 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a 20 20    revSet = 1;.  
2bc30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2bc40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bc50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2bc60 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75   /* No match fou
2bc70 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
2bc80 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b  if( j==0 || j<nK
2bc90 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  eyCol ){.       
2bca0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2bcb0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21 3d  sOrderDistinct!=
2bcc0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
2bcd0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2bce0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2bcf0 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
2bd00 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
2bd10 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70     } /* end Loop
2bd20 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20   over all index 
2bd30 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
2bd40 20 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c   if( distinctCol
2bd50 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20 20  umns ){.        
2bd60 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65  testcase( isOrde
2bd70 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a  rDistinct==0 );.
2bd80 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
2bd90 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20  istinct = 1;.   
2bda0 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e     }.    } /* en
2bdb0 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77  d-if not one-row
2bdc0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b   */..    /* Mark
2bdd0 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f   off any other O
2bde0 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68  RDER BY terms th
2bdf0 61 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f  at reference pLo
2be00 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73  op */.    if( is
2be10 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b  OrderDistinct ){
2be20 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69 73 74  .      orderDist
2be30 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f  inctMask |= pLoo
2be40 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
2be50 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
2be60 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
2be70 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20        Expr *p;. 
2be80 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42         if( MASKB
2be90 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20  IT(i) & obSat ) 
2bea0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2beb0 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e    p = pOrderBy->
2bec0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
2bed0 20 20 20 20 69 66 28 20 28 65 78 70 72 54 61 62      if( (exprTab
2bee0 6c 65 55 73 61 67 65 28 26 70 57 49 6e 66 6f 2d  leUsage(&pWInfo-
2bef0 3e 73 4d 61 73 6b 53 65 74 2c 20 70 29 26 7e 6f  >sMaskSet, p)&~o
2bf00 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
2bf10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2bf20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42    obSat |= MASKB
2bf30 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  IT(i);.        }
2bf40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2bf50 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f   } /* End the lo
2bf60 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72  op over all Wher
2bf70 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65  eLoops from oute
2bf80 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69  r-most down to i
2bf90 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69  nner-most */.  i
2bfa0 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65  f( obSat==obDone
2bfb0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
2bfc0 66 28 20 21 69 73 4f 72 64 65 72 44 69 73 74 69  f( !isOrderDisti
2bfd0 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  nct ) return 0;.
2bfe0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
2bff0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
2c000 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72  E_ENABLED./* For
2c010 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f   debugging use o
2c020 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63  nly: */.static c
2c030 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65 72 65  onst char *where
2c040 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61  PathName(WherePa
2c050 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e  th *pPath, int n
2c060 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20  Loop, WhereLoop 
2c070 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69  *pLast){.  stati
2c080 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d  c char zName[65]
2c090 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
2c0a0 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69  (i=0; i<nLoop; i
2c0b0 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20  ++){ zName[i] = 
2c0c0 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d  pPath->aLoop[i]-
2c0d0 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c  >cId; }.  if( pL
2c0e0 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d  ast ) zName[i++]
2c0f0 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20   = pLast->cId;. 
2c100 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20   zName[i] = 0;. 
2c110 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
2c120 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
2c130 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74 20 6f  Given the list o
2c140 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  f WhereLoop obje
2c150 63 74 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70  cts at pWInfo->p
2c160 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f 75 74  Loops, this rout
2c170 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ine.** attempts 
2c180 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f 77 65  to find the lowe
2c190 73 74 20 63 6f 73 74 20 70 61 74 68 20 74 68 61  st cost path tha
2c1a0 74 20 76 69 73 69 74 73 20 65 61 63 68 20 57 68  t visits each Wh
2c1b0 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e  ereLoop.** once.
2c1c0 20 20 54 68 69 73 20 70 61 74 68 20 69 73 20 74    This path is t
2c1d0 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20  hen loaded into 
2c1e0 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  the pWInfo->a[].
2c1f0 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a  pWLoop fields..*
2c200 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68 61 74  *.** Assume that
2c210 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
2c220 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
2c230 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64 20   that will need 
2c240 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20  to be sorted.** 
2c250 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74 20  will be nRowEst 
2c260 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32 20  (in the 10*log2 
2c270 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e  representation).
2c280 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72    Or, ignore sor
2c290 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66  ting.** costs if
2c2a0 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a   nRowEst==0..**.
2c2b0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
2c2c0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
2c2d0 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  r SQLITE_NOMEM o
2c2e0 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
2c2f0 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f  ation.** error o
2c300 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
2c310 20 69 6e 74 20 77 68 65 72 65 50 61 74 68 53 6f   int wherePathSo
2c320 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f 20 2a  lver(WhereInfo *
2c330 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e  pWInfo, LogEst n
2c340 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d  RowEst){.  int m
2c350 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20  xChoice;        
2c360 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
2c370 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74  number of simult
2c380 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72 61  aneous paths tra
2c390 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  cked */.  int nL
2c3a0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
2c3b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2c3c0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f   terms in the jo
2c3d0 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  in */.  Parse *p
2c3e0 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
2c3f0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
2c400 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
2c410 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
2c420 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
2c430 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
2c440 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20  /.  int iLoop;  
2c450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c460 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76   Loop counter ov
2c470 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  er the terms of 
2c480 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e  the join */.  in
2c490 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20  t ii, jj;       
2c4a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2c4b0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
2c4c0 74 20 6d 78 49 20 3d 20 30 3b 20 20 20 20 20 20  t mxI = 0;      
2c4d0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2c4e0 20 6f 66 20 6e 65 78 74 20 65 6e 74 72 79 20 74   of next entry t
2c4f0 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 4c  o replace */.  L
2c500 6f 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20 20  ogEst rCost;    
2c510 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74           /* Cost
2c520 20 6f 66 20 61 20 70 61 74 68 20 2a 2f 0a 20 20   of a path */.  
2c530 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20 20  LogEst nOut;    
2c540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2c550 62 65 72 20 6f 66 20 6f 75 74 70 75 74 73 20 2a  ber of outputs *
2c560 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73  /.  LogEst mxCos
2c570 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
2c580 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66   Maximum cost of
2c590 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 73 20   a set of paths 
2c5a0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 4f 75  */.  LogEst mxOu
2c5b0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  t = 0;         /
2c5c0 2a 20 4d 61 78 69 6d 75 6d 20 6e 4f 75 74 20 76  * Maximum nOut v
2c5d0 61 6c 75 65 20 6f 6e 20 74 68 65 20 73 65 74 20  alue on the set 
2c5e0 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f  of paths */.  Lo
2c5f0 67 45 73 74 20 72 53 6f 72 74 43 6f 73 74 3b 20  gEst rSortCost; 
2c600 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
2c610 74 6f 20 64 6f 20 61 20 73 6f 72 74 20 2a 2f 0a  to do a sort */.
2c620 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d    int nTo, nFrom
2c630 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
2c640 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65  umber of valid e
2c650 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20  ntries in aTo[] 
2c660 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20  and aFrom[] */. 
2c670 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f   WherePath *aFro
2c680 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  m;         /* Al
2c690 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74  l nFrom paths at
2c6a0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65   the previous le
2c6b0 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
2c6c0 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20  th *aTo;        
2c6d0 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65     /* The nTo be
2c6e0 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65 20  st paths at the 
2c6f0 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f  current level */
2c700 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 46  .  WherePath *pF
2c710 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rom;         /* 
2c720 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46  An element of aF
2c730 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72  rom[] that we ar
2c740 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
2c750 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f    WherePath *pTo
2c760 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
2c770 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f  n element of aTo
2c780 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
2c790 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
2c7a0 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70  hereLoop *pWLoop
2c7b0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ;        /* One 
2c7c0 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
2c7d0 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68   objects */.  Wh
2c7e0 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20  ereLoop **pX;   
2c7f0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2c800 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20 70  to divy up the p
2c810 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a  Space memory */.
2c820 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20    char *pSpace; 
2c830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2c840 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20  emporary memory 
2c850 75 73 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  used by this rou
2c860 74 69 6e 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73  tine */..  pPars
2c870 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
2c880 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
2c890 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d  e->db;.  nLoop =
2c8a0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b   pWInfo->nLevel;
2c8b0 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f  .  /* TUNING: Fo
2c8c0 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73  r simple queries
2c8d0 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20  , only the best 
2c8e0 70 61 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e  path is tracked.
2c8f0 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20  .  ** For 2-way 
2c900 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73  joins, the 5 bes
2c910 74 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c  t paths are foll
2c920 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a  owed..  ** For j
2c930 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72  oins of 3 or mor
2c940 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20  e tables, track 
2c950 74 68 65 20 31 30 20 62 65 73 74 20 70 61 74 68  the 10 best path
2c960 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20  s */.  mxChoice 
2c970 3d 20 28 6e 4c 6f 6f 70 3d 3d 31 29 20 3f 20 31  = (nLoop==1) ? 1
2c980 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35   : (nLoop==2 ? 5
2c990 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74   : 10);.  assert
2c9a0 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d  ( nLoop<=pWInfo-
2c9b0 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  >pTabList->nSrc 
2c9c0 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  );.  WHERETRACE(
2c9d0 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65  0x002, ("---- be
2c9e0 67 69 6e 20 73 6f 6c 76 65 72 5c 6e 22 29 29 3b  gin solver\n"));
2c9f0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
2ca00 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73  and initialize s
2ca10 70 61 63 65 20 66 6f 72 20 61 54 6f 20 61 6e 64  pace for aTo and
2ca20 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 69 69 20 3d   aFrom */.  ii =
2ca30 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61   (sizeof(WherePa
2ca40 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65  th)+sizeof(Where
2ca50 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78  Loop*)*nLoop)*mx
2ca60 43 68 6f 69 63 65 2a 32 3b 0a 20 20 70 53 70 61  Choice*2;.  pSpa
2ca70 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ce = sqlite3DbMa
2ca80 6c 6c 6f 63 52 61 77 28 64 62 2c 20 69 69 29 3b  llocRaw(db, ii);
2ca90 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30  .  if( pSpace==0
2caa0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2cab0 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20  _NOMEM;.  aTo = 
2cac0 28 57 68 65 72 65 50 61 74 68 2a 29 70 53 70 61  (WherePath*)pSpa
2cad0 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54  ce;.  aFrom = aT
2cae0 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65  o+mxChoice;.  me
2caf0 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73  mset(aFrom, 0, s
2cb00 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29  izeof(aFrom[0]))
2cb10 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c  ;.  pX = (WhereL
2cb20 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43  oop**)(aFrom+mxC
2cb30 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69  hoice);.  for(ii
2cb40 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72  =mxChoice*2, pFr
2cb50 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69  om=aTo; ii>0; ii
2cb60 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20  --, pFrom++, pX 
2cb70 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70  += nLoop){.    p
2cb80 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58  From->aLoop = pX
2cb90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 64  ;.  }..  /* Seed
2cba0 20 74 68 65 20 73 65 61 72 63 68 20 77 69 74 68   the search with
2cbb0 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 50   a single WhereP
2cbc0 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a  ath containing z
2cbd0 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a  ero WhereLoops..
2cbe0 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47    **.  ** TUNING
2cbf0 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65  : Do not let the
2cc00 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61   number of itera
2cc10 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20 32  tions go above 2
2cc20 35 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74 0a  5.  If the cost.
2cc30 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e    ** of computin
2cc40 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  g an automatic i
2cc50 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69 64  ndex is not paid
2cc60 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68 65   back within the
2cc70 20 66 69 72 73 74 20 32 35 0a 20 20 2a 2a 20 72   first 25.  ** r
2cc80 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ows, then do not
2cc90 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61 74   use the automat
2cca0 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61  ic index. */.  a
2ccb0 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d  From[0].nRow = M
2ccc0 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  IN(pParse->nQuer
2ccd0 79 4c 6f 6f 70 2c 20 34 36 29 3b 20 20 61 73 73  yLoop, 46);  ass
2cce0 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33  ert( 46==sqlite3
2ccf0 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 20 20  LogEst(25) );.  
2cd00 6e 46 72 6f 6d 20 3d 20 31 3b 0a 0a 20 20 2f 2a  nFrom = 1;..  /*
2cd10 20 50 72 65 63 6f 6d 70 75 74 65 20 74 68 65 20   Precompute the 
2cd20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
2cd30 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c 74  the final result
2cd40 20 73 65 74 2c 20 69 66 20 74 68 65 20 63 61 6c   set, if the cal
2cd50 6c 65 72 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69  ler.  ** to sqli
2cd60 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
2cd70 77 61 73 20 63 6f 6e 63 65 72 6e 65 64 20 61 62  was concerned ab
2cd80 6f 75 74 20 73 6f 72 74 69 6e 67 20 2a 2f 0a 20  out sorting */. 
2cd90 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b 0a   rSortCost = 0;.
2cda0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
2cdb0 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f  rderBy==0 || nRo
2cdc0 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  wEst==0 ){.    a
2cdd0 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65  From[0].isOrdere
2cde0 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 7d 65  dValid = 1;.  }e
2cdf0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 55 4e 49  lse{.    /* TUNI
2ce00 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63 6f  NG: Estimated co
2ce10 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 69 73  st of sorting is
2ce20 20 34 38 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68   48*N*log2(N) wh
2ce30 65 72 65 20 4e 20 69 73 20 74 68 65 0a 20 20 20  ere N is the.   
2ce40 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75   ** number of ou
2ce50 74 70 75 74 20 72 6f 77 73 2e 20 54 68 65 20 34  tput rows. The 4
2ce60 38 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65  8 is the expecte
2ce70 64 20 73 69 7a 65 20 6f 66 20 61 20 72 6f 77 20  d size of a row 
2ce80 74 6f 20 73 6f 72 74 2e 20 0a 20 20 20 20 2a 2a  to sort. .    **
2ce90 20 46 49 58 4d 45 3a 20 20 63 6f 6d 70 75 74 65   FIXME:  compute
2cea0 20 61 20 62 65 74 74 65 72 20 65 73 74 69 6d 61   a better estima
2ceb0 74 65 20 6f 66 20 74 68 65 20 34 38 20 6d 75 6c  te of the 48 mul
2cec0 74 69 70 6c 69 65 72 20 62 61 73 65 64 20 6f 6e  tiplier based on
2ced0 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75   the.    ** resu
2cee0 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt set expressio
2cef0 6e 73 2e 20 2a 2f 0a 20 20 20 20 72 53 6f 72 74  ns. */.    rSort
2cf00 43 6f 73 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b  Cost = nRowEst +
2cf10 20 65 73 74 4c 6f 67 28 6e 52 6f 77 45 73 74 29   estLog(nRowEst)
2cf20 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ;.    WHERETRACE
2cf30 28 30 78 30 30 32 2c 28 22 2d 2d 2d 2d 20 73 6f  (0x002,("---- so
2cf40 72 74 20 63 6f 73 74 3d 25 2d 33 64 5c 6e 22 2c  rt cost=%-3d\n",
2cf50 20 72 53 6f 72 74 43 6f 73 74 29 29 3b 0a 20 20   rSortCost));.  
2cf60 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
2cf70 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e  successively lon
2cf80 67 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75  ger WherePaths u
2cf90 73 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75  sing the previou
2cfa0 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a  s generation.  *
2cfb0 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20  * of WherePaths 
2cfc0 61 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72  as the basis for
2cfd0 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70   the next.  Keep
2cfe0 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78   track of the mx
2cff0 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74  Choice.  ** best
2d000 20 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67   paths at each g
2d010 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66  eneration */.  f
2d020 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
2d030 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
2d040 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a  ){.    nTo = 0;.
2d050 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46      for(ii=0, pF
2d060 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46  rom=aFrom; ii<nF
2d070 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d  rom; ii++, pFrom
2d080 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  ++){.      for(p
2d090 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c  WLoop=pWInfo->pL
2d0a0 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57  oops; pWLoop; pW
2d0b0 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65  Loop=pWLoop->pNe
2d0c0 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20  xtLoop){.       
2d0d0 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77   Bitmask maskNew
2d0e0 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  ;.        Bitmas
2d0f0 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20  k revMask = 0;. 
2d100 20 20 20 20 20 20 20 75 38 20 69 73 4f 72 64 65         u8 isOrde
2d110 72 65 64 56 61 6c 69 64 20 3d 20 70 46 72 6f 6d  redValid = pFrom
2d120 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
2d130 3b 0a 20 20 20 20 20 20 20 20 75 38 20 69 73 4f  ;.        u8 isO
2d140 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e  rdered = pFrom->
2d150 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
2d160 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e     if( (pWLoop->
2d170 70 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d  prereq & ~pFrom-
2d180 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20  >maskLoop)!=0 ) 
2d190 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2d1a0 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d    if( (pWLoop->m
2d1b0 61 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d  askSelf & pFrom-
2d1c0 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20  >maskLoop)!=0 ) 
2d1d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2d1e0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
2d1f0 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20  nt, pWLoop is a 
2d200 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20  candidate to be 
2d210 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a  the next loop. .
2d220 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75          ** Compu
2d230 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20  te its cost */. 
2d240 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73         rCost = s
2d250 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
2d260 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70  pWLoop->rSetup,p
2d270 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46  WLoop->rRun + pF
2d280 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20  rom->nRow);.    
2d290 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69      rCost = sqli
2d2a0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 43 6f  te3LogEstAdd(rCo
2d2b0 73 74 2c 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74  st, pFrom->rCost
2d2c0 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20  );.        nOut 
2d2d0 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20  = pFrom->nRow + 
2d2e0 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20  pWLoop->nOut;.  
2d2f0 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20        maskNew = 
2d300 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20  pFrom->maskLoop 
2d310 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  | pWLoop->maskSe
2d320 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  lf;.        if( 
2d330 21 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20  !isOrderedValid 
2d340 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 77 69  ){.          swi
2d350 74 63 68 28 20 77 68 65 72 65 50 61 74 68 53 61  tch( wherePathSa
2d360 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70  tisfiesOrderBy(p
2d370 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20  WInfo,.         
2d380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
2d390 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20  Info->pOrderBy, 
2d3a0 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77  pFrom, pWInfo->w
2d3b0 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20  ctrlFlags,.     
2d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3d0 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c    iLoop, pWLoop,
2d3e0 20 26 72 65 76 4d 61 73 6b 29 20 29 7b 0a 20 20   &revMask) ){.  
2d3f0 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 31            case 1
2d400 3a 20 20 2f 2a 20 59 65 73 2e 20 20 70 46 72 6f  :  /* Yes.  pFro
2d410 6d 2b 70 57 4c 6f 6f 70 20 64 6f 65 73 20 73 61  m+pWLoop does sa
2d420 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20  tisfy the ORDER 
2d430 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  BY clause */.   
2d440 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
2d450 65 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ered = 1;.      
2d460 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
2d470 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20  dValid = 1;.    
2d480 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2d490 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73  .            cas
2d4a0 65 20 30 3a 20 20 2f 2a 20 4e 6f 2e 20 20 70 46  e 0:  /* No.  pF
2d4b0 72 6f 6d 2b 70 57 4c 6f 6f 70 20 77 69 6c 6c 20  rom+pWLoop will 
2d4c0 72 65 71 75 69 72 65 20 61 20 73 65 70 61 72 61  require a separa
2d4d0 74 65 20 73 6f 72 74 20 2a 2f 0a 20 20 20 20 20  te sort */.     
2d4e0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
2d4f0 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
2d500 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56        isOrderedV
2d510 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  alid = 1;.      
2d520 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20          rCost = 
2d530 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
2d540 28 72 43 6f 73 74 2c 20 72 53 6f 72 74 43 6f 73  (rCost, rSortCos
2d550 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
2d560 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2d570 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a       default: /*
2d580 20 43 61 6e 6e 6f 74 20 74 65 6c 6c 20 79 65 74   Cannot tell yet
2d590 2e 20 20 54 72 79 20 61 67 61 69 6e 20 6f 6e 20  .  Try again on 
2d5a0 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
2d5b0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  on */.          
2d5c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2d5d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2d5e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2d5f0 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d  revMask = pFrom-
2d600 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  >revLoop;.      
2d610 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 43    }.        /* C
2d620 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
2d630 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20  WLoop should be 
2d640 61 64 64 65 64 20 74 6f 20 74 68 65 20 6d 78 43  added to the mxC
2d650 68 6f 69 63 65 20 62 65 73 74 20 73 6f 20 66 61  hoice best so fa
2d660 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  r */.        for
2d670 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20  (jj=0, pTo=aTo; 
2d680 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54  jj<nTo; jj++, pT
2d690 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o++){.          
2d6a0 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f  if( pTo->maskLoo
2d6b0 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20 20  p==maskNew.     
2d6c0 20 20 20 20 20 20 26 26 20 70 54 6f 2d 3e 69 73        && pTo->is
2d6d0 4f 72 64 65 72 65 64 56 61 6c 69 64 3d 3d 69 73  OrderedValid==is
2d6e0 4f 72 64 65 72 65 64 56 61 6c 69 64 0a 20 20 20  OrderedValid.   
2d6f0 20 20 20 20 20 20 20 20 26 26 20 28 28 70 54 6f          && ((pTo
2d700 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73 74 20 26  ->rCost<=rCost &
2d710 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75  & pTo->nRow<=nOu
2d720 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  t) ||.          
2d730 20 20 20 20 20 20 28 70 54 6f 2d 3e 72 43 6f 73        (pTo->rCos
2d740 74 3e 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d  t>=rCost && pTo-
2d750 3e 6e 52 6f 77 3e 3d 6e 4f 75 74 29 29 0a 20 20  >nRow>=nOut)).  
2d760 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2d770 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2d780 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20   jj==nTo-1 );.  
2d790 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2d7a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2d7b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2d7c0 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20  f( jj>=nTo ){.  
2d7d0 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e          if( nTo>
2d7e0 3d 6d 78 43 68 6f 69 63 65 20 26 26 20 72 43 6f  =mxChoice && rCo
2d7f0 73 74 3e 3d 6d 78 43 6f 73 74 20 29 7b 0a 23 69  st>=mxCost ){.#i
2d800 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
2d810 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a  ENABLED /* 0x4 *
2d820 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
2d830 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
2d840 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
2d850 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2d860 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69  DebugPrintf("Ski
2d870 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  p   %s cost=%-3d
2d880 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  ,%3d order=%c\n"
2d890 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d8a0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
2d8b0 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
2d8c0 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
2d8d0 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  nOut,.          
2d8e0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
2d8f0 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65  dValid ? (isOrde
2d900 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29  red ? 'Y' : 'N')
2d910 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
2d920 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2d930 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2d940 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
2d950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
2d960 20 61 20 6e 65 77 20 50 61 74 68 20 74 6f 20 74   a new Path to t
2d970 68 65 20 61 54 6f 5b 5d 20 73 65 74 20 2a 2f 0a  he aTo[] set */.
2d980 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54            if( nT
2d990 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20  o<mxChoice ){.  
2d9a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63            /* Inc
2d9b0 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f  rease the size o
2d9c0 66 20 74 68 65 20 61 54 6f 20 73 65 74 20 62 79  f the aTo set by
2d9d0 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20   one */.        
2d9e0 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a      jj = nTo++;.
2d9f0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2da00 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
2da10 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61 63 65  New path replace
2da20 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f 72 73  s the prior wors
2da30 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20  t to keep count 
2da40 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a  below mxChoice *
2da50 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  /.            jj
2da60 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20 20 20   = mxI;.        
2da70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54    }.          pT
2da80 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69  o = &aTo[jj];.#i
2da90 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
2daa0 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a  ENABLED /* 0x4 *
2dab0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2dac0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
2dad0 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
2dae0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2daf0 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20  gPrintf("New    
2db00 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
2db10 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
2db20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
2db30 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
2db40 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
2db50 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a  ), rCost, nOut,.
2db60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db70 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f  isOrderedValid ?
2db80 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59   (isOrdered ? 'Y
2db90 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b  ' : 'N') : '?');
2dba0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
2dbb0 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  dif.        }els
2dbc0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
2dbd0 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f   pTo->rCost<=rCo
2dbe0 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c  st && pTo->nRow<
2dbf0 3d 6e 4f 75 74 20 29 7b 0a 23 69 66 64 65 66 20  =nOut ){.#ifdef 
2dc00 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
2dc10 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20  ED /* 0x4 */.   
2dc20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2dc30 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
2dc40 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
2dc50 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2dc60 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
2dc70 20 20 20 20 20 20 20 20 20 20 22 53 6b 69 70 20            "Skip 
2dc80 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
2dc90 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20  3d order=%c",.  
2dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dcb0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
2dcc0 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
2dcd0 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
2dce0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2dcf0 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c      isOrderedVal
2dd00 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20  id ? (isOrdered 
2dd10 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27  ? 'Y' : 'N') : '
2dd20 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
2dd30 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2dd40 72 69 6e 74 66 28 22 20 20 20 76 73 20 25 73 20  rintf("   vs %s 
2dd50 63 6f 73 74 3d 25 2d 33 64 2c 25 64 20 6f 72 64  cost=%-3d,%d ord
2dd60 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
2dd70 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
2dd80 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
2dd90 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
2dda0 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
2ddb0 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
2ddc0 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
2ddd0 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d  redValid ? (pTo-
2dde0 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27  >isOrdered ? 'Y'
2ddf0 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a   : 'N') : '?');.
2de00 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65              }.#e
2de10 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
2de20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e   testcase( pTo->
2de30 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a  rCost==rCost );.
2de40 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
2de50 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2de60 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  }.          test
2de70 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74  case( pTo->rCost
2de80 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20  ==rCost+1 );.   
2de90 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20         /* A new 
2dea0 61 6e 64 20 62 65 74 74 65 72 20 73 63 6f 72 65  and better score
2deb0 20 66 6f 72 20 61 20 70 72 65 76 69 6f 75 73 6c   for a previousl
2dec0 79 20 63 72 65 61 74 65 64 20 65 71 75 69 76 61  y created equiva
2ded0 6c 65 6e 74 20 70 61 74 68 20 2a 2f 0a 23 69 66  lent path */.#if
2dee0 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
2def0 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f  NABLED /* 0x4 */
2df00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
2df10 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
2df20 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
2df30 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2df40 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
2df50 20 20 20 20 20 20 20 20 22 55 70 64 61 74 65 20          "Update 
2df60 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
2df70 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
2df80 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
2df90 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
2dfa0 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
2dfb0 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20   rCost, nOut,.  
2dfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2dfd0 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28  OrderedValid ? (
2dfe0 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20  isOrdered ? 'Y' 
2dff0 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20  : 'N') : '?');. 
2e000 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2e010 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
2e020 20 77 61 73 20 25 73 20 63 6f 73 74 3d 25 2d 33   was %s cost=%-3
2e030 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  d,%3d order=%c\n
2e040 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2e050 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
2e060 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
2e070 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70  ), pTo->rCost, p
2e080 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  To->nRow,.      
2e090 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
2e0a0 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20  sOrderedValid ? 
2e0b0 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20  (pTo->isOrdered 
2e0c0 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27  ? 'Y' : 'N') : '
2e0d0 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ?');.          }
2e0e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
2e0f0 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c  }.        /* pWL
2e100 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e  oop is a winner.
2e110 20 20 41 64 64 20 69 74 20 74 6f 20 74 68 65 20    Add it to the 
2e120 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66  set of best so f
2e130 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54  ar */.        pT
2e140 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46  o->maskLoop = pF
2e150 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
2e160 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
2e170 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72  ;.        pTo->r
2e180 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b  evLoop = revMask
2e190 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e  ;.        pTo->n
2e1a0 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20  Row = nOut;.    
2e1b0 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d      pTo->rCost =
2e1c0 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20   rCost;.        
2e1d0 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61  pTo->isOrderedVa
2e1e0 6c 69 64 20 3d 20 69 73 4f 72 64 65 72 65 64 56  lid = isOrderedV
2e1f0 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20 70 54  alid;.        pT
2e200 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 69  o->isOrdered = i
2e210 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20  sOrdered;.      
2e220 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c    memcpy(pTo->aL
2e230 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  oop, pFrom->aLoo
2e240 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  p, sizeof(WhereL
2e250 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20  oop*)*iLoop);.  
2e260 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70        pTo->aLoop
2e270 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70  [iLoop] = pWLoop
2e280 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54  ;.        if( nT
2e290 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20  o>=mxChoice ){. 
2e2a0 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20 30           mxI = 0
2e2b0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f  ;.          mxCo
2e2c0 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73  st = aTo[0].rCos
2e2d0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 4f  t;.          mxO
2e2e0 75 74 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77  ut = aTo[0].nRow
2e2f0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
2e300 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31  jj=1, pTo=&aTo[1
2e310 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20  ]; jj<mxChoice; 
2e320 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  jj++, pTo++){.  
2e330 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
2e340 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20  o->rCost>mxCost 
2e350 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  || (pTo->rCost==
2e360 6d 78 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e  mxCost && pTo->n
2e370 52 6f 77 3e 6d 78 4f 75 74 29 20 29 7b 0a 20 20  Row>mxOut) ){.  
2e380 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f              mxCo
2e390 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b  st = pTo->rCost;
2e3a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
2e3b0 78 4f 75 74 20 3d 20 70 54 6f 2d 3e 6e 52 6f 77  xOut = pTo->nRow
2e3c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2e3d0 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20  mxI = jj;.      
2e3e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e3f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2e400 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66      }.    }..#if
2e410 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
2e420 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20 2a  NABLED  /* >=2 *
2e430 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
2e440 33 57 68 65 72 65 54 72 61 63 65 3e 3d 32 20 29  3WhereTrace>=2 )
2e450 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
2e460 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d  ebugPrintf("----
2e470 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20   after round %d 
2e480 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b  ----\n", iLoop);
2e490 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c  .      for(ii=0,
2e4a0 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f   pTo=aTo; ii<nTo
2e4b0 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; ii++, pTo++){.
2e4c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2e4d0 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 73 20  ebugPrintf(" %s 
2e4e0 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25  cost=%-3d nrow=%
2e4f0 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  -3d order=%c",. 
2e500 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
2e510 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
2e520 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
2e530 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
2e540 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d  .           pTo-
2e550 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20  >isOrderedValid 
2e560 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  ? (pTo->isOrdere
2e570 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a  d ? 'Y' : 'N') :
2e580 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69   '?');.        i
2e590 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  f( pTo->isOrdere
2e5a0 64 56 61 6c 69 64 20 26 26 20 70 54 6f 2d 3e 69  dValid && pTo->i
2e5b0 73 4f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20  sOrdered ){.    
2e5c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2e5d0 75 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d 30  ugPrintf(" rev=0
2e5e0 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72  x%llx\n", pTo->r
2e5f0 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  evLoop);.       
2e600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2e610 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2e620 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
2e630 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2e640 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
2e650 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c 65  /* Swap the role
2e660 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20 61  s of aFrom and a
2e670 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  To for the next 
2e680 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  generation */.  
2e690 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20    pFrom = aTo;. 
2e6a0 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a     aTo = aFrom;.
2e6b0 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f      aFrom = pFro
2e6c0 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e  m;.    nFrom = n
2e6d0 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e  To;.  }..  if( n
2e6e0 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  From==0 ){.    s
2e6f0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2e700 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79  Parse, "no query
2e710 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20   solution");.   
2e720 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2e730 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20  b, pSpace);.    
2e740 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2e750 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ROR;.  }.  .  /*
2e760 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74   Find the lowest
2e770 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72   cost path.  pFr
2e780 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20  om will be left 
2e790 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74  pointing to that
2e7a0 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d   path */.  pFrom
2e7b0 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28   = aFrom;.  for(
2e7c0 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20  ii=1; ii<nFrom; 
2e7d0 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  ii++){.    if( p
2e7e0 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f  From->rCost>aFro
2e7f0 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20 70 46  m[ii].rCost ) pF
2e800 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d  rom = &aFrom[ii]
2e810 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2e820 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
2e830 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f  nLoop );.  /* Lo
2e840 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  ad the lowest co
2e850 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49  st path into pWI
2e860 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f  nfo */.  for(iLo
2e870 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f  op=0; iLoop<nLoo
2e880 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
2e890 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
2e8a0 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20  vel = pWInfo->a 
2e8b0 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65  + iLoop;.    pLe
2e8c0 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57  vel->pWLoop = pW
2e8d0 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c  Loop = pFrom->aL
2e8e0 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20  oop[iLoop];.    
2e8f0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20  pLevel->iFrom = 
2e900 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20  pWLoop->iTab;.  
2e910 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75    pLevel->iTabCu
2e920 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  r = pWInfo->pTab
2e930 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
2e940 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a  iFrom].iCursor;.
2e950 20 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66    }.  if( (pWInf
2e960 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
2e970 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
2e980 4e 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70  NCT)!=0.   && (p
2e990 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2e9a0 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e  s & WHERE_DISTIN
2e9b0 43 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70  CTBY)==0.   && p
2e9c0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
2e9d0 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  ==WHERE_DISTINCT
2e9e0 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77  _NOOP.   && nRow
2e9f0 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74  Est.  ){.    Bit
2ea00 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20  mask notUsed;.  
2ea10 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65    int rc = where
2ea20 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
2ea30 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49  erBy(pWInfo, pWI
2ea40 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c  nfo->pResultSet,
2ea50 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20   pFrom,.        
2ea60 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 44           WHERE_D
2ea70 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70  ISTINCTBY, nLoop
2ea80 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  -1, pFrom->aLoop
2ea90 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55  [nLoop-1], &notU
2eaa0 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sed);.    if( rc
2eab0 3d 3d 31 20 29 20 70 57 49 6e 66 6f 2d 3e 65 44  ==1 ) pWInfo->eD
2eac0 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
2ead0 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
2eae0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72 6f  ;.  }.  if( pFro
2eaf0 6d 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a  m->isOrdered ){.
2eb00 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
2eb10 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2eb20 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b  RE_DISTINCTBY ){
2eb30 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
2eb40 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
2eb50 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
2eb60 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  D;.    }else{.  
2eb70 20 20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53      pWInfo->bOBS
2eb80 61 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 57  at = 1;.      pW
2eb90 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
2eba0 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a  pFrom->revLoop;.
2ebb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e      }.  }.  pWIn
2ebc0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46  fo->nRowOut = pF
2ebd0 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a  rom->nRow;..  /*
2ebe0 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20   Free temporary 
2ebf0 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72  memory and retur
2ec00 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73  n success */.  s
2ec10 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2ec20 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75   pSpace);.  retu
2ec30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2ec40 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72  ./*.** Most quer
2ec50 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20 73  ies use only a s
2ec60 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68 65  ingle table (the
2ec70 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29  y are not joins)
2ec80 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d   and have.** sim
2ec90 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ple == constrain
2eca0 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65 78  ts against index
2ecb0 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69 73  ed fields.  This
2ecc0 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
2ecd0 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f  s.** to plan tho
2ece0 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20  se simple cases 
2ecf0 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73 20  using much less 
2ed00 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68  ceremony than th
2ed10 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72  e.** general-pur
2ed20 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e  pose query plann
2ed30 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79 20  er, and thereby 
2ed40 79 69 65 6c 64 20 66 61 73 74 65 72 20 73 71 6c  yield faster sql
2ed50 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a 2a  ite3_prepare().*
2ed60 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65 20  * times for the 
2ed70 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a  common case..**.
2ed80 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
2ed90 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 69  ro on success, i
2eda0 66 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e  f this query can
2edb0 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74   be handled by t
2edc0 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73  his.** no-frills
2edd0 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20   query planner. 
2ede0 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20   Return zero if 
2edf0 74 68 69 73 20 71 75 65 72 79 20 6e 65 65 64 73  this query needs
2ee00 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c   the .** general
2ee10 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70  -purpose query p
2ee20 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  lanner..*/.stati
2ee30 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72 74  c int whereShort
2ee40 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  Cut(WhereLoopBui
2ee50 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b  lder *pBuilder){
2ee60 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
2ee70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 53  Info;.  struct S
2ee80 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2ee90 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  em;.  WhereClaus
2eea0 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 54  e *pWC;.  WhereT
2eeb0 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68  erm *pTerm;.  Wh
2eec0 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a  ereLoop *pLoop;.
2eed0 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e    int iCur;.  in
2eee0 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  t j;.  Table *pT
2eef0 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  ab;.  Index *pId
2ef00 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20 3d  x;.  .  pWInfo =
2ef10 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
2ef20 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  o;.  if( pWInfo-
2ef30 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
2ef40 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20  ERE_FORCE_TABLE 
2ef50 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73  ) return 0;.  as
2ef60 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54  sert( pWInfo->pT
2ef70 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20  abList->nSrc>=1 
2ef80 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49  );.  pItem = pWI
2ef90 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
2efa0 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d  ;.  pTab = pItem
2efb0 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49 73  ->pTab;.  if( Is
2efc0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
2efd0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
2efe0 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 29 20  pItem->zIndex ) 
2eff0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72  return 0;.  iCur
2f000 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
2f010 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e  r;.  pWC = &pWIn
2f020 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70  fo->sWC;.  pLoop
2f030 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
2f040 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  w;.  pLoop->wsFl
2f050 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70  ags = 0;.  pLoop
2f060 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20  ->u.btree.nSkip 
2f070 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20 66  = 0;.  pTerm = f
2f080 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
2f090 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 2c  r, -1, 0, WO_EQ,
2f0a0 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d   0);.  if( pTerm
2f0b0 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77   ){.    pLoop->w
2f0c0 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
2f0d0 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49  OLUMN_EQ|WHERE_I
2f0e0 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b  PK|WHERE_ONEROW;
2f0f0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  .    pLoop->aLTe
2f100 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  rm[0] = pTerm;. 
2f110 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d     pLoop->nLTerm
2f120 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d   = 1;.    pLoop-
2f130 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31  >u.btree.nEq = 1
2f140 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  ;.    /* TUNING:
2f150 20 43 6f 73 74 20 6f 66 20 61 20 72 6f 77 69 64   Cost of a rowid
2f160 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f   lookup is 10 */
2f170 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e  .    pLoop->rRun
2f180 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 73   = 33;  /* 33==s
2f190 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29  qlite3LogEst(10)
2f1a0 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
2f1b0 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
2f1c0 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
2f1d0 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
2f1e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2f1f0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  Loop->aLTermSpac
2f200 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  e==pLoop->aLTerm
2f210 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2f220 28 20 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f  ( ArraySize(pLoo
2f230 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3d  p->aLTermSpace)=
2f240 3d 34 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =4 );.      if( 
2f250 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
2f260 45 5f 4e 6f 6e 65 20 0a 20 20 20 20 20 20 20 7c  E_None .       |
2f270 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78  | pIdx->pPartIdx
2f280 57 68 65 72 65 21 3d 30 20 0a 20 20 20 20 20 20  Where!=0 .      
2f290 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   || pIdx->nKeyCo
2f2a0 6c 3e 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f  l>ArraySize(pLoo
2f2b0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 20  p->aLTermSpace) 
2f2c0 0a 20 20 20 20 20 20 29 20 63 6f 6e 74 69 6e 75  .      ) continu
2f2d0 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  e;.      for(j=0
2f2e0 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; j<pIdx->nKeyCo
2f2f0 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
2f300 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
2f310 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 49 64  m(pWC, iCur, pId
2f320 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20  x->aiColumn[j], 
2f330 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 3b  0, WO_EQ, pIdx);
2f340 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
2f350 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rm==0 ) break;. 
2f360 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c         pLoop->aL
2f370 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b  Term[j] = pTerm;
2f380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2f390 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79  f( j!=pIdx->nKey
2f3a0 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Col ) continue;.
2f3b0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46        pLoop->wsF
2f3c0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
2f3d0 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45  UMN_EQ|WHERE_ONE
2f3e0 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45 58 45  ROW|WHERE_INDEXE
2f3f0 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  D;.      if( pId
2f400 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c  x->isCovering ||
2f410 20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64   (pItem->colUsed
2f420 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64   & ~columnsInInd
2f430 65 78 28 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a  ex(pIdx))==0 ){.
2f440 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77          pLoop->w
2f450 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
2f460 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  IDX_ONLY;.      
2f470 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e  }.      pLoop->n
2f480 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20  LTerm = j;.     
2f490 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2f4a0 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70  nEq = j;.      p
2f4b0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
2f4c0 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 20  ndex = pIdx;.   
2f4d0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
2f4e0 73 74 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69  st of a unique i
2f4f0 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31  ndex lookup is 1
2f500 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70  5 */.      pLoop
2f510 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a  ->rRun = 39;  /*
2f520 20 33 39 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   39==sqlite3LogE
2f530 73 74 28 31 35 29 20 2a 2f 0a 20 20 20 20 20 20  st(15) */.      
2f540 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
2f550 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  .  if( pLoop->ws
2f560 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f  Flags ){.    pLo
2f570 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45  op->nOut = (LogE
2f580 73 74 29 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f  st)1;.    pWInfo
2f590 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20  ->a[0].pWLoop = 
2f5a0 70 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70  pLoop;.    pLoop
2f5b0 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74  ->maskSelf = get
2f5c0 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
2f5d0 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20  askSet, iCur);. 
2f5e0 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e     pWInfo->a[0].
2f5f0 69 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b 0a  iTabCur = iCur;.
2f600 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77      pWInfo->nRow
2f610 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Out = 1;.    if(
2f620 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
2f630 79 20 29 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53  y ) pWInfo->bOBS
2f640 61 74 20 3d 20 20 31 3b 0a 20 20 20 20 69 66 28  at =  1;.    if(
2f650 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
2f660 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
2f670 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20  _DISTINCT ){.   
2f680 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
2f690 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
2f6a0 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20  TINCT_UNIQUE;.  
2f6b0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2f6c0 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f  E_DEBUG.    pLoo
2f6d0 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23 65  p->cId = '0';.#e
2f6e0 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
2f6f0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
2f700 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
2f710 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69  rate the beginni
2f720 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75  ng of the loop u
2f730 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c  sed for WHERE cl
2f740 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
2f750 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
2f760 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65  alue is a pointe
2f770 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73  r to an opaque s
2f780 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
2f790 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d  ntains.** inform
2f7a0 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20  ation needed to 
2f7b0 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
2f7c0 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20  op.  Later, the 
2f7d0 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a  calling routine.
2f7e0 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65  ** should invoke
2f7f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2f800 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75  () with the retu
2f810 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
2f820 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
2f830 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
2f840 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
2f850 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
2f860 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
2f870 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f   occurs, this ro
2f880 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55  utine returns NU
2f890 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61  LL..**.** The ba
2f8a0 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64  sic idea is to d
2f8b0 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c  o a nested loop,
2f8c0 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61   one loop for ea
2f8d0 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  ch table in.** t
2f8e0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
2f8f0 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e  f a select.  (IN
2f900 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
2f910 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
2f920 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20  he.** same as a 
2f930 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79  SELECT with only
2f940 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
2f950 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2f960 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61  se.)  For.** exa
2f970 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c  mple, if the SQL
2f980 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   is this:.**.** 
2f990 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
2f9a0 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57  ROM t1, t2, t3 W
2f9b0 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20  HERE ...;.**.** 
2f9c0 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65  Then the code ge
2f9d0 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65  nerated is conce
2f9e0 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65  ptually like the
2f9f0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
2fa00 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
2fa10 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20  ow1 in t1 do    
2fa20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
2fa30 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
2fa40 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
2fa50 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20   t2 do      |-- 
2fa60 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
2fa70 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20  egin().**       
2fa80 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20     foreach row3 
2fa90 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20  in t3 do   /.** 
2faa0 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a             ....*
2fab0 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20  *          end  
2fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fad0 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
2fae0 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
2faf0 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
2fb00 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20              |-- 
2fb10 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  by sqlite3WhereE
2fb20 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64  nd().**      end
2fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb40 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a           /.**.**
2fb50 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c   Note that the l
2fb60 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62  oops might not b
2fb70 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20  e nested in the 
2fb80 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74  order in which t
2fb90 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e  hey.** appear in
2fba0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2fbb0 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20   if a different 
2fbc0 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20  order is better 
2fbd0 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  able to make.** 
2fbe0 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20  use of indices. 
2fbf0 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
2fc00 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72  when the IN oper
2fc10 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a  ator appears in.
2fc20 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
2fc30 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65  use, it might re
2fc40 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e  sult in addition
2fc50 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  al nested loops 
2fc60 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20  for.** scanning 
2fc70 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75  through all valu
2fc80 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  es on the right-
2fc90 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
2fca0 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65   IN..**.** There
2fcb0 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f   are Btree curso
2fcc0 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
2fcd0 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20  th each table.  
2fce0 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a  t1 uses cursor.*
2fcf0 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73  * number pTabLis
2fd00 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e  t->a[0].iCursor.
2fd10 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75    t2 uses the cu
2fd20 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  rsor pTabList->a
2fd30 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20  [1].iCursor..** 
2fd40 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54  And so forth.  T
2fd50 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
2fd60 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70  rates code to op
2fd70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75  en those VDBE cu
2fd80 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c  rsors.** and sql
2fd90 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67  ite3WhereEnd() g
2fda0 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
2fdb0 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e  e to close them.
2fdc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
2fdd0 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72  that sqlite3Wher
2fde0 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74  eBegin() generat
2fdf0 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  es leaves the cu
2fe00 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69  rsors named.** i
2fe10 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74  n pTabList point
2fe20 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70  ing at their app
2fe30 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73  ropriate entries
2fe40 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64  .  The [...] cod
2fe50 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f  e.** can use OP_
2fe60 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f  Column and OP_Ro
2fe70 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74  wid opcodes on t
2fe80 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20  hese cursors to 
2fe90 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20  extract.** data 
2fea0 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73  from the various
2feb0 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c   tables of the l
2fec0 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  oop..**.** If th
2fed0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
2fee0 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72  s empty, the for
2fef0 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20  each loops must 
2ff00 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a  each scan their.
2ff10 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73  ** entire tables
2ff20 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d  .  Thus a three-
2ff30 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f  way join is an O
2ff40 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e  (N^3) operation.
2ff50 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20    But if.** the 
2ff60 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69  tables have indi
2ff70 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72  ces and there ar
2ff80 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57  e terms in the W
2ff90 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
2ffa0 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f  .** refer to tho
2ffb0 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f  se indices, a co
2ffc0 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61  mplete table sca
2ffd0 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64  n can be avoided
2ffe0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65   and the.** code
2fff0 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66   will run much f
30000 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20  aster.  Most of 
30010 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73  the work of this
30020 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63   routine is chec
30030 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69  king.** to see i
30040 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69  f there are indi
30050 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  ces that can be 
30060 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70  used to speed up
30070 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
30080 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   Terms of the WH
30090 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61  ERE clause are a
300a0 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69  lso used to limi
300b0 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74  t which rows act
300c0 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74  ually.** make it
300d0 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e   to the "..." in
300e0 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74   the middle of t
300f0 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20  he loop.  After 
30100 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a  each "foreach",.
30110 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ** terms of the 
30120 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
30130 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73  t use only terms
30140 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e   in that loop an
30150 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73  d outer.** loops
30160 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61   are evaluated a
30170 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75  nd if false a ju
30180 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e  mp is made aroun
30190 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  d all subsequent
301a0 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20  .** inner loops 
301b0 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22  (or around the "
301c0 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74  ..." if the test
301d0 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
301e0 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73  he inner-.** mos
301f0 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55  t loop).**.** OU
30200 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20  TER JOINS.**.** 
30210 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66  An outer join of
30220 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74   tables t1 and t
30230 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79  2 is conceptally
30240 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77   coded as follow
30250 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65  s:.**.**    fore
30260 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
30270 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d  o.**      flag =
30280 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61   0.**      forea
30290 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
302a0 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74  .**        start
302b0 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e  :.**          ..
302c0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c  ..**          fl
302d0 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65  ag = 1.**      e
302e0 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c  nd.**      if fl
302f0 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20  ag==0 then.**   
30300 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f       move the ro
30310 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e  w2 cursor to a n
30320 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20  ull row.**      
30330 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20    goto start.** 
30340 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e       fi.**    en
30350 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59  d.**.** ORDER BY
30360 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49   CLAUSE PROCESSI
30370 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42  NG.**.** pOrderB
30380 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
30390 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
303a0 6c 61 75 73 65 20 28 6f 72 20 74 68 65 20 47 52  lause (or the GR
303b0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a  OUP BY clause.**
303c0 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 47 52   if the WHERE_GR
303d0 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65  OUPBY flag is se
303e0 74 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29  t in wctrlFlags)
303f0 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
30400 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65  tement.** if the
30410 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74  re is one.  If t
30420 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
30430 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66   BY clause or if
30440 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
30450 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
30460 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
30470 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ETE statement, t
30480 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20  hen pOrderBy is 
30490 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
304a0 69 49 64 78 43 75 72 20 70 61 72 61 6d 65 74 65  iIdxCur paramete
304b0 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  r is the cursor 
304c0 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64  number of an ind
304d0 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45 52  ex.  If .** WHER
304e0 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
304f0 69 73 20 73 65 74 2c 20 69 49 64 78 43 75 72 20  is set, iIdxCur 
30500 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  is the cursor nu
30510 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78  mber of an index
30520 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20 4f  .** to use for O
30530 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  R clause process
30540 69 6e 67 2e 20 20 54 68 65 20 57 48 45 52 45 20  ing.  The WHERE 
30550 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 75 73  clause should us
30560 65 20 74 68 69 73 0a 2a 2a 20 73 70 65 63 69 66  e this.** specif
30570 69 63 20 63 75 72 73 6f 72 2e 20 20 49 66 20 57  ic cursor.  If W
30580 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
30590 49 52 45 44 20 69 73 20 73 65 74 2c 20 74 68 65  IRED is set, the
305a0 6e 20 69 49 64 78 43 75 72 20 69 73 0a 2a 2a 20  n iIdxCur is.** 
305b0 74 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72  the first cursor
305c0 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
305d0 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20  cursors for all 
305e0 69 6e 64 69 63 65 73 2e 20 20 69 49 64 78 43 75  indices.  iIdxCu
305f0 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75  r should.** be u
30600 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  sed to compute t
30610 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
30620 75 72 73 6f 72 20 64 65 70 65 6e 64 69 6e 67 20  ursor depending 
30630 6f 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 69  on which index i
30640 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68  s.** used..*/.Wh
30650 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  ereInfo *sqlite3
30660 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61  WhereBegin(.  Pa
30670 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
30680 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
30690 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
306a0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
306b0 2c 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61  ,    /* FROM cla
306c0 75 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20 61  use: A list of a
306d0 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  ll tables to be 
306e0 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70  scanned */.  Exp
306f0 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
30700 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
30710 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
30720 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
30730 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59    /* An ORDER BY
30740 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c   clause, or NULL
30750 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
30760 70 52 65 73 75 6c 74 53 65 74 2c 20 2f 2a 20 52  pResultSet, /* R
30770 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
30780 20 71 75 65 72 79 20 2a 2f 0a 20 20 75 31 36 20   query */.  u16 
30790 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20  wctrlFlags,     
307a0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
307b0 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65  WHERE_* flags de
307c0 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49  fined in sqliteI
307d0 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49  nt.h */.  int iI
307e0 64 78 43 75 72 20 20 20 20 20 20 20 20 20 20 20  dxCur           
307f0 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 54  /* If WHERE_ONET
30800 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74  ABLE_ONLY is set
30810 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e  , index cursor n
30820 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  umber */.){.  in
30830 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20  t nByteWInfo;   
30840 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e           /* Num.
30850 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
30860 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73   for WhereInfo s
30870 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  truct */.  int n
30880 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20  TabList;        
30890 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
308a0 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70  of elements in p
308b0 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65  TabList */.  Whe
308c0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
308d0 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20          /* Will 
308e0 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72  become the retur
308f0 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
30900 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  function */.  Vd
30910 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
30920 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20  pVdbe;   /* The 
30930 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65  virtual database
30940 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74   engine */.  Bit
30950 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20  mask notReady;  
30960 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
30970 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
30980 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a  yet positioned *
30990 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
309a0 6c 64 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f  lder sWLB;     /
309b0 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
309c0 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65  builder */.  Whe
309d0 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
309e0 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65  Set;    /* The e
309f0 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73  xpression mask s
30a00 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  et */.  WhereLev
30a10 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20  el *pLevel;     
30a20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c     /* A single l
30a30 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e  evel in pWInfo->
30a40 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  a[] */.  WhereLo
30a50 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
30a60 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
30a70 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65  o a single Where
30a80 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Loop object */. 
30a90 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
30aa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
30ab0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
30ac0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
30ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
30ae0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
30af0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  on */.  int rc; 
30b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b10 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
30b20 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69  e */...  /* Vari
30b30 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74  able initializat
30b40 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  ion */.  db = pP
30b50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73  arse->db;.  mems
30b60 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a  et(&sWLB, 0, siz
30b70 65 6f 66 28 73 57 4c 42 29 29 3b 0a 20 20 73 57  eof(sWLB));.  sW
30b80 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  LB.pOrderBy = pO
30b90 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69  rderBy;..  /* Di
30ba0 73 61 62 6c 65 20 74 68 65 20 44 49 53 54 49 4e  sable the DISTIN
30bb0 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  CT optimization 
30bc0 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e  if SQLITE_Distin
30bd0 63 74 4f 70 74 20 69 73 20 73 65 74 20 76 69 61  ctOpt is set via
30be0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65  .  ** sqlite3_te
30bf0 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f 54  st_ctrl(SQLITE_T
30c00 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
30c10 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20  TIONS,...) */.  
30c20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
30c30 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
30c40 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 29  ITE_DistinctOpt)
30c50 20 29 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61   ){.    wctrlFla
30c60 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e  gs &= ~WHERE_WAN
30c70 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a  T_DISTINCT;.  }.
30c80 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72  .  /* The number
30c90 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
30ca0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
30cb0 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20   limited by the 
30cc0 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62  number of.  ** b
30cd0 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  its in a Bitmask
30ce0 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73   .  */.  testcas
30cf0 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  e( pTabList->nSr
30d00 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20  c==BMS );.  if( 
30d10 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42  pTabList->nSrc>B
30d20 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  MS ){.    sqlite
30d30 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
30d40 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61  , "at most %d ta
30d50 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c  bles in a join",
30d60 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72   BMS);.    retur
30d70 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  n 0;.  }..  /* T
30d80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72  his function nor
30d90 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20  mally generates 
30da0 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f  a nested loop fo
30db0 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  r all tables in 
30dc0 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20  .  ** pTabList. 
30dd0 20 42 75 74 20 69 66 20 74 68 65 20 57 48 45 52   But if the WHER
30de0 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
30df0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
30e00 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a  n we should.  **
30e10 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63   only generate c
30e20 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73  ode for the firs
30e30 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c  t table in pTabL
30e40 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74  ist and assume t
30e50 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72  hat.  ** any cur
30e60 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
30e70 77 69 74 68 20 73 75 62 73 65 71 75 65 6e 74 20  with subsequent 
30e80 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69  tables are unini
30e90 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
30ea0 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74   nTabList = (wct
30eb0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
30ec0 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f  ONETABLE_ONLY) ?
30ed0 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e   1 : pTabList->n
30ee0 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  Src;..  /* Alloc
30ef0 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
30f00 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  ze the WhereInfo
30f10 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
30f20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a  will become the.
30f30 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75    ** return valu
30f40 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f  e. A single allo
30f50 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  cation is used t
30f60 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65 72  o store the Wher
30f70 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63  eInfo.  ** struc
30f80 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  t, the contents 
30f90 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d  of WhereInfo.a[]
30fa0 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  , the WhereClaus
30fb0 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  e structure.  **
30fc0 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61   and the WhereMa
30fd0 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 2e  skSet structure.
30fe0 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75   Since WhereClau
30ff0 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38  se contains an 8
31000 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64  -byte.  ** field
31010 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20   (type Bitmask) 
31020 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e  it must be align
31030 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20  ed on an 8-byte 
31040 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a  boundary on.  **
31050 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75   some architectu
31060 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52  res. Hence the R
31070 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20  OUND8() below.. 
31080 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f   */.  nByteWInfo
31090 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
310a0 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61  (WhereInfo)+(nTa
310b0 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28  bList-1)*sizeof(
310c0 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20  WhereLevel));.  
310d0 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
310e0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
310f0 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 73 69   nByteWInfo + si
31100 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
31110 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
31120 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
31130 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
31140 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70  , pWInfo);.    p
31150 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67  WInfo = 0;.    g
31160 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
31170 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  ror;.  }.  pWInf
31180 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
31190 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 69 43  0] = pWInfo->aiC
311a0 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 2d  urOnePass[1] = -
311b0 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  1;.  pWInfo->nLe
311c0 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a  vel = nTabList;.
311d0 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65    pWInfo->pParse
311e0 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49   = pParse;.  pWI
311f0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20  nfo->pTabList = 
31200 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  pTabList;.  pWIn
31210 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  fo->pOrderBy = p
31220 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49 6e 66  OrderBy;.  pWInf
31230 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  o->pResultSet = 
31240 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 70 57  pResultSet;.  pW
31250 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73  Info->iBreak = s
31260 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
31270 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f  bel(v);.  pWInfo
31280 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77  ->wctrlFlags = w
31290 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49  ctrlFlags;.  pWI
312a0 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79  nfo->savedNQuery
312b0 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Loop = pParse->n
312c0 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61  QueryLoop;.  pMa
312d0 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d  skSet = &pWInfo-
312e0 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c  >sMaskSet;.  sWL
312f0 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66  B.pWInfo = pWInf
31300 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d 20  o;.  sWLB.pWC = 
31310 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20  &pWInfo->sWC;.  
31320 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68 65  sWLB.pNew = (Whe
31330 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a  reLoop*)(((char*
31340 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49  )pWInfo)+nByteWI
31350 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
31360 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
31370 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77 29 20  MENT(sWLB.pNew) 
31380 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e  );.  whereLoopIn
31390 69 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23  it(sWLB.pNew);.#
313a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
313b0 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e  UG.  sWLB.pNew->
313c0 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69  cId = '*';.#endi
313d0 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68  f..  /* Split th
313e0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
313f0 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62  nto separate sub
31400 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72  expressions wher
31410 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65  e each.  ** sube
31420 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
31430 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44  arated by an AND
31440 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a   operator..  */.
31450 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d    initMaskSet(pM
31460 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65  askSet);.  where
31470 43 6c 61 75 73 65 49 6e 69 74 28 26 70 57 49 6e  ClauseInit(&pWIn
31480 66 6f 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29  fo->sWC, pWInfo)
31490 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
314a0 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 70 50 61  odeConstants(pPa
314b0 72 73 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20  rse, pWhere);.  
314c0 77 68 65 72 65 53 70 6c 69 74 28 26 70 57 49 6e  whereSplit(&pWIn
314d0 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72 65 2c  fo->sWC, pWhere,
314e0 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 73 71 6c 69   TK_AND);.  sqli
314f0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
31500 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b  ema(pParse, -1);
31510 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63   /* Insert the c
31520 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20 47  ookie verifier G
31530 6f 74 6f 20 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a  oto */.    .  /*
31540 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61   Special case: a
31550 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
31560 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20  at is constant. 
31570 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20   Evaluate the.  
31580 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ** expression an
31590 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76  d either jump ov
315a0 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f  er all of the co
315b0 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e  de or fall thru.
315c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65  .  */.  if( pWhe
315d0 72 65 20 26 26 20 28 6e 54 61 62 4c 69 73 74 3d  re && (nTabList=
315e0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70  =0 || sqlite3Exp
315f0 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
31600 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20  in(pWhere)) ){. 
31610 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
31620 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57  False(pParse, pW
31630 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  here, pWInfo->iB
31640 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  reak, SQLITE_JUM
31650 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57  PIFNULL);.    pW
31660 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  here = 0;.  }.. 
31670 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
31680 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65  : No FROM clause
31690 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62  .  */.  if( nTab
316a0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  List==0 ){.    i
316b0 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 57  f( pOrderBy ) pW
316c0 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 31  Info->bOBSat = 1
316d0 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c 46  ;.    if( wctrlF
316e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
316f0 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
31700 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
31710 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
31720 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
31730 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
31740 73 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d  ssign a bit from
31750 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20   the bitmask to 
31760 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
31770 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20  e FROM clause.. 
31780 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73   **.  ** When as
31790 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20  signing bitmask 
317a0 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20 63  values to FROM c
317b0 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c 20 69  lause cursors, i
317c0 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 74  t must be.  ** t
317d0 68 65 20 63 61 73 65 20 74 68 61 74 20 69 66 20  he case that if 
317e0 58 20 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b  X is the bitmask
317f0 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 46 52   for the N-th FR
31800 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
31810 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69 74  hen.  ** the bit
31820 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f  mask for all FRO
31830 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  M clause terms t
31840 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68  o the left of th
31850 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a  e N-th term.  **
31860 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41 6e 20   is (X-1).   An 
31870 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
31880 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  the ON clause of
31890 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e   a LEFT JOIN can
318a0 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20 45 78   use.  ** its Ex
318b0 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
318c0 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69 6e 64  le value to find
318d0 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f 66 20   the bitmask of 
318e0 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a  the right table.
318f0 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e    ** of the join
31900 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67 20 6f  .  Subtracting o
31910 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69 67 68  ne from the righ
31920 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73 6b 20  t table bitmask 
31930 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62 69 74  gives a.  ** bit
31940 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62  mask for all tab
31950 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
31960 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e  of the join.  Kn
31970 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73  owing the bitmas
31980 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74  k.  ** for all t
31990 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
319a0 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e  t of a left join
319b0 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20   is important.  
319c0 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20  Ticket #3015..  
319d0 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
319e0 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63  t bitmasks are c
319f0 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70  reated for all p
31a00 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61  TabList->nSrc ta
31a10 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61  bles in.  ** pTa
31a20 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20  bList, not just 
31a30 74 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69  the first nTabLi
31a40 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62  st tables.  nTab
31a50 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  List is normally
31a60 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70  .  ** equal to p
31a70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75  TabList->nSrc bu
31a80 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  t might be short
31a90 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74 68 65  ened to 1 if the
31aa0 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54  .  ** WHERE_ONET
31ab0 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69  ABLE_ONLY flag i
31ac0 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f  s set..  */.  fo
31ad0 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c  r(ii=0; ii<pTabL
31ae0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29  ist->nSrc; ii++)
31af0 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b  {.    createMask
31b00 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c  (pMaskSet, pTabL
31b10 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73  ist->a[ii].iCurs
31b20 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  or);.  }.#ifndef
31b30 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20   NDEBUG.  {.    
31b40 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66  Bitmask toTheLef
31b50 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  t = 0;.    for(i
31b60 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74  i=0; ii<pTabList
31b70 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20  ->nSrc; ii++){. 
31b80 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
31b90 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
31ba0 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
31bb0 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
31bc0 20 20 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29     assert( (m-1)
31bd0 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20  ==toTheLeft );. 
31be0 20 20 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c       toTheLeft |
31bf0 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = m;.    }.  }.#
31c00 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c  endif..  /* Anal
31c10 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  yze all of the s
31c20 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  ubexpressions.  
31c30 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72 41 6e  Note that exprAn
31c40 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20  alyze() might.  
31c50 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74 75  ** add new virtu
31c60 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68  al terms onto th
31c70 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
31c80 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64  RE clause.  We d
31c90 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20  o not.  ** want 
31ca0 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65  to analyze these
31cb0 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20   virtual terms, 
31cc0 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69  so start analyzi
31cd0 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20  ng at the end.  
31ce0 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77  ** and work forw
31cf0 61 72 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  ard so that the 
31d00 61 64 64 65 64 20 76 69 72 74 75 61 6c 20 74 65  added virtual te
31d10 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70 72  rms are never pr
31d20 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  ocessed..  */.  
31d30 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
31d40 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f  TabList, &pWInfo
31d50 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28 20 64 62  ->sWC);.  if( db
31d60 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
31d70 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  {.    goto where
31d80 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
31d90 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44  .  /* If the ORD
31da0 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20  ER BY (or GROUP 
31db0 42 59 29 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  BY) clause conta
31dc0 69 6e 73 20 72 65 66 65 72 65 6e 63 65 73 20 74  ins references t
31dd0 6f 20 67 65 6e 65 72 61 6c 0a 20 20 2a 2a 20 65  o general.  ** e
31de0 78 70 72 65 73 73 69 6f 6e 73 2c 20 74 68 65 6e  xpressions, then
31df0 20 77 65 20 77 6f 6e 27 74 20 62 65 20 61 62 6c   we won't be abl
31e00 65 20 74 6f 20 73 61 74 69 73 66 79 20 69 74 20  e to satisfy it 
31e10 75 73 69 6e 67 20 69 6e 64 69 63 65 73 2c 20 73  using indices, s
31e20 6f 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61 64 20  o.  ** go ahead 
31e30 61 6e 64 20 64 69 73 61 62 6c 65 20 69 74 20 6e  and disable it n
31e40 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ow..  */.  if( p
31e50 4f 72 64 65 72 42 79 20 26 26 20 28 77 63 74 72  OrderBy && (wctr
31e60 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
31e70 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d 30  ANT_DISTINCT)!=0
31e80 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   ){.    for(ii=0
31e90 3b 20 69 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  ; ii<pOrderBy->n
31ea0 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
31eb0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
31ec0 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
31ed0 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79  Collate(pOrderBy
31ee0 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a  ->a[ii].pExpr);.
31ef0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
31f00 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
31f10 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  {.        pWInfo
31f20 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
31f30 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
31f40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
31f50 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d  }else if( pExpr-
31f60 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
31f70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
31f80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
31f90 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
31fa0 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
31fb0 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 69 66  STINCT ){.    if
31fc0 28 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75  ( isDistinctRedu
31fd0 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54  ndant(pParse, pT
31fe0 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d  abList, &pWInfo-
31ff0 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53 65 74  >sWC, pResultSet
32000 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
32010 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69  e DISTINCT marki
32020 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e  ng is pointless.
32030 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a    Ignore it. */.
32040 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
32050 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
32060 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b  DISTINCT_UNIQUE;
32070 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
32080 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
32090 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52      /* Try to OR
320a0 44 45 52 20 42 59 20 74 68 65 20 72 65 73 75 6c  DER BY the resul
320b0 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69  t set to make di
320c0 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e  stinct processin
320d0 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20  g easier */.    
320e0 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46    pWInfo->wctrlF
320f0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49  lags |= WHERE_DI
32100 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20  STINCTBY;.      
32110 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
32120 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20   = pResultSet;. 
32130 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
32140 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57 68 65  onstruct the Whe
32150 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a  reLoop objects *
32160 2f 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  /.  WHERETRACE(0
32170 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69  xffff,("*** Opti
32180 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c  mizer Start ***\
32190 6e 22 29 29 3b 0a 20 20 2f 2a 20 44 69 73 70 6c  n"));.  /* Displ
321a0 61 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  ay all terms of 
321b0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
321c0 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
321d0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
321e0 45 44 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  ED) && defined(S
321f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45  QLITE_ENABLE_TRE
32200 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20 69 66 28  E_EXPLAIN).  if(
32210 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
32220 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
32230 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62    int i;.    Vdb
32240 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
32250 56 64 62 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Vdbe;.    sqlite
32260 33 45 78 70 6c 61 69 6e 42 65 67 69 6e 28 76 29  3ExplainBegin(v)
32270 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
32280 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d  <sWLB.pWC->nTerm
32290 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
322a0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
322b0 74 66 28 76 2c 20 22 23 25 2d 32 64 20 22 2c 20  tf(v, "#%-2d ", 
322c0 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  i);.      sqlite
322d0 33 45 78 70 6c 61 69 6e 50 75 73 68 28 76 29 3b  3ExplainPush(v);
322e0 0a 20 20 20 20 20 20 77 68 65 72 65 45 78 70 6c  .      whereExpl
322f0 61 69 6e 54 65 72 6d 28 76 2c 20 26 73 57 4c 42  ainTerm(v, &sWLB
32300 2e 70 57 43 2d 3e 61 5b 69 5d 29 3b 0a 20 20 20  .pWC->a[i]);.   
32310 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
32320 6e 50 6f 70 28 76 29 3b 0a 20 20 20 20 20 20 73  nPop(v);.      s
32330 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
32340 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  v);.    }.    sq
32350 6c 69 74 65 33 45 78 70 6c 61 69 6e 46 69 6e 69  lite3ExplainFini
32360 73 68 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  sh(v);.    sqlit
32370 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
32380 73 22 2c 20 73 71 6c 69 74 65 33 56 64 62 65 45  s", sqlite3VdbeE
32390 78 70 6c 61 6e 61 74 69 6f 6e 28 76 29 29 3b 0a  xplanation(v));.
323a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
323b0 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20   nTabList!=1 || 
323c0 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 26 73  whereShortCut(&s
323d0 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  WLB)==0 ){.    r
323e0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
323f0 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20 20  All(&sWLB);.    
32400 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68  if( rc ) goto wh
32410 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
32420 20 0a 20 20 20 20 2f 2a 20 44 69 73 70 6c 61 79   .    /* Display
32430 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68 65 72   all of the Wher
32440 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69 66  eLoop objects if
32450 20 77 68 65 72 65 74 72 61 63 65 20 69 73 20 65   wheretrace is e
32460 6e 61 62 6c 65 64 20 2a 2f 0a 23 69 66 64 65 66  nabled */.#ifdef
32470 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
32480 4c 45 44 20 2f 2a 20 21 3d 30 20 2a 2f 0a 20 20  LED /* !=0 */.  
32490 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
324a0 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  reTrace ){.     
324b0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20   WhereLoop *p;. 
324c0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
324d0 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4c    static char zL
324e0 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35  abel[] = "012345
324f0 36 37 38 39 61 62 63 64 65 66 67 68 69 6a 6b 6c  6789abcdefghijkl
32500 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a 22 0a  mnopqrstuvwyxz".
32510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32530 20 20 20 20 20 20 20 22 41 42 43 44 45 46 47 48         "ABCDEFGH
32540 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59  IJKLMNOPQRSTUVWY
32550 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  XZ";.      for(p
32560 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c  =pWInfo->pLoops,
32570 20 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e   i=0; p; p=p->pN
32580 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20  extLoop, i++){. 
32590 20 20 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20         p->cId = 
325a0 7a 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28  zLabel[i%sizeof(
325b0 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20  zLabel)];.      
325c0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
325d0 28 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20  (p, sWLB.pWC);. 
325e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
325f0 64 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65  dif.  .    where
32600 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66  PathSolver(pWInf
32610 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64  o, 0);.    if( d
32620 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
32630 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
32640 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20  nError;.    if( 
32650 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
32660 20 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65   ){.       where
32670 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66  PathSolver(pWInf
32680 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  o, pWInfo->nRowO
32690 75 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66  ut+1);.       if
326a0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
326b0 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
326c0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d  eginError;.    }
326d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66  .  }.  if( pWInf
326e0 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26  o->pOrderBy==0 &
326f0 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  & (db->flags & S
32700 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64  QLITE_ReverseOrd
32710 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70  er)!=0 ){.     p
32720 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
32730 20 28 42 69 74 6d 61 73 6b 29 28 2d 31 29 3b 0a   (Bitmask)(-1);.
32740 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
32750 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45 52 28  ->nErr || NEVER(
32760 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
32770 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68  ) ){.    goto wh
32780 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
32790 20 7d 0a 23 69 66 64 65 66 20 57 48 45 52 45 54   }.#ifdef WHERET
327a0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
327b0 21 3d 30 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  !=0 */.  if( sql
327c0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
327d0 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  {.    int ii;.  
327e0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
327f0 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74  intf("---- Solut
32800 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57  ion nRow=%d", pW
32810 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a  Info->nRowOut);.
32820 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
32830 62 4f 42 53 61 74 20 29 7b 0a 20 20 20 20 20 20  bOBSat ){.      
32840 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
32850 74 66 28 22 20 4f 52 44 45 52 42 59 3d 30 78 25  tf(" ORDERBY=0x%
32860 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 72 65  llx", pWInfo->re
32870 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  vMask);.    }.  
32880 20 20 73 77 69 74 63 68 28 20 70 57 49 6e 66 6f    switch( pWInfo
32890 2d 3e 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  ->eDistinct ){. 
328a0 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
328b0 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a  DISTINCT_UNIQUE:
328c0 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
328d0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
328e0 20 44 49 53 54 49 4e 43 54 3d 75 6e 69 71 75 65   DISTINCT=unique
328f0 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ");.        brea
32900 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
32910 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
32920 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a  INCT_ORDERED: {.
32930 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
32940 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49  ebugPrintf("  DI
32950 53 54 49 4e 43 54 3d 6f 72 64 65 72 65 64 22 29  STINCT=ordered")
32960 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
32970 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
32980 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
32990 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a  CT_UNORDERED: {.
329a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
329b0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49  ebugPrintf("  DI
329c0 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64  STINCT=unordered
329d0 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ");.        brea
329e0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
329f0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
32a00 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
32a10 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
32a20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
32a30 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65  ii++){.      whe
32a40 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e  reLoopPrint(pWIn
32a50 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70  fo->a[ii].pWLoop
32a60 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20  , sWLB.pWC);.   
32a70 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
32a80 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d  /* Attempt to om
32a90 69 74 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74  it tables from t
32aa0 68 65 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20  he join that do 
32ab0 6e 6f 74 20 65 66 66 65 63 74 20 74 68 65 20 72  not effect the r
32ac0 65 73 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20 70  esult */.  if( p
32ad0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32  WInfo->nLevel>=2
32ae0 0a 20 20 20 26 26 20 70 52 65 73 75 6c 74 53 65  .   && pResultSe
32af0 74 21 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d  t!=0.   && Optim
32b00 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
32b10 62 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f  b, SQLITE_OmitNo
32b20 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20  opJoin).  ){.   
32b30 20 42 69 74 6d 61 73 6b 20 74 61 62 55 73 65 64   Bitmask tabUsed
32b40 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65   = exprListTable
32b50 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
32b60 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20  pResultSet);.   
32b70 20 69 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72   if( sWLB.pOrder
32b80 42 79 20 29 20 74 61 62 55 73 65 64 20 7c 3d 20  By ) tabUsed |= 
32b90 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
32ba0 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 73 57 4c  ge(pMaskSet, sWL
32bb0 42 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  B.pOrderBy);.   
32bc0 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e   while( pWInfo->
32bd0 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20 20 20  nLevel>=2 ){.   
32be0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
32bf0 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20  erm, *pEnd;.    
32c00 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f    pLoop = pWInfo
32c10 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  ->a[pWInfo->nLev
32c20 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20  el-1].pWLoop;.  
32c30 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d      if( (pWInfo-
32c40 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f  >pTabList->a[pLo
32c50 6f 70 2d 3e 69 54 61 62 5d 2e 6a 6f 69 6e 74 79  op->iTab].jointy
32c60 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30  pe & JT_LEFT)==0
32c70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
32c80 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  if( (wctrlFlags 
32c90 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
32ca0 54 49 4e 43 54 29 3d 3d 30 0a 20 20 20 20 20 20  TINCT)==0.      
32cb0 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
32cc0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
32cd0 4f 57 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a  OW)==0.      ){.
32ce0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
32cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
32d00 20 28 74 61 62 55 73 65 64 20 26 20 70 4c 6f 6f   (tabUsed & pLoo
32d10 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20  p->maskSelf)!=0 
32d20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
32d30 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57 43 2d 3e  End = sWLB.pWC->
32d40 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d 3e 6e 54  a + sWLB.pWC->nT
32d50 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  erm;.      for(p
32d60 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61  Term=sWLB.pWC->a
32d70 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54  ; pTerm<pEnd; pT
32d80 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
32d90 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
32da0 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d  eqAll & pLoop->m
32db0 61 73 6b 53 65 6c 66 29 21 3d 30 0a 20 20 20 20  askSelf)!=0.    
32dc0 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73       && !ExprHas
32dd0 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
32de0 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
32df0 69 6e 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  in).        ){. 
32e00 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
32e10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32e20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  }.      if( pTer
32e30 6d 3c 70 45 6e 64 20 29 20 62 72 65 61 6b 3b 0a  m<pEnd ) break;.
32e40 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
32e50 28 30 78 66 66 66 66 2c 20 28 22 2d 3e 20 64 72  (0xffff, ("-> dr
32e60 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f 74 20 75  op loop %c not u
32e70 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63  sed\n", pLoop->c
32e80 49 64 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  Id));.      pWIn
32e90 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20  fo->nLevel--;.  
32ea0 20 20 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a      nTabList--;.
32eb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52      }.  }.  WHER
32ec0 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 28 22  ETRACE(0xffff,("
32ed0 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69  *** Optimizer Fi
32ee0 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b  nished ***\n"));
32ef0 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  .  pWInfo->pPars
32f00 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d  e->nQueryLoop +=
32f10 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
32f20 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
32f30 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41  aller is an UPDA
32f40 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61  TE or DELETE sta
32f50 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72  tement that is r
32f60 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74  equesting.  ** t
32f70 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73  o use a one-pass
32f80 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65   algorithm, dete
32f90 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20 69 73  rmine if this is
32fa0 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20   appropriate..  
32fb0 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61 73 73 20  ** The one-pass 
32fc0 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77  algorithm only w
32fd0 6f 72 6b 73 20 69 66 20 74 68 65 20 57 48 45 52  orks if the WHER
32fe0 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
32ff0 69 6e 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61  ins.  ** the sta
33000 74 65 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65  tement to update
33010 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20   a single row.. 
33020 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77   */.  assert( (w
33030 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
33040 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
33050 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d  D)==0 || pWInfo-
33060 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20  >nLevel==1 );.  
33070 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  if( (wctrlFlags 
33080 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
33090 44 45 53 49 52 45 44 29 21 3d 30 20 0a 20 20 20  DESIRED)!=0 .   
330a0 26 26 20 28 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d  && (pWInfo->a[0]
330b0 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  .pWLoop->wsFlags
330c0 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29   & WHERE_ONEROW)
330d0 21 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66  !=0 ){.    pWInf
330e0 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31  o->okOnePass = 1
330f0 3b 0a 20 20 20 20 69 66 28 20 48 61 73 52 6f 77  ;.    if( HasRow
33100 69 64 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  id(pTabList->a[0
33110 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ].pTab) ){.     
33120 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57   pWInfo->a[0].pW
33130 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 3d  Loop->wsFlags &=
33140 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   ~WHERE_IDX_ONLY
33150 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
33160 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65  * Open all table
33170 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  s in the pTabLis
33180 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65  t and any indice
33190 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20  s selected for. 
331a0 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68   ** searching th
331b0 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  ose tables..  */
331c0 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
331d0 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
331e0 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  (ii=0, pLevel=pW
331f0 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62  Info->a; ii<nTab
33200 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76  List; ii++, pLev
33210 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  el++){.    Table
33220 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54   *pTab;     /* T
33230 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
33240 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20      int iDb;    
33250 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
33260 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
33270 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78  ning table/index
33280 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 53   */.    struct S
33290 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
332a0 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62  bItem;..    pTab
332b0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
332c0 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
332d0 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70  m];.    pTab = p
332e0 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
332f0 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
33300 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
33310 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
33320 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ;.    pLoop = pL
33330 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
33340 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
33350 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
33360 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62  eral)!=0 || pTab
33370 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
33380 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
33390 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69   */.    }else.#i
333a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
333b0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
333c0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
333d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
333e0 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
333f0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
33400 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f  har *pVTab = (co
33410 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74  nst char *)sqlit
33420 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20  e3GetVTable(db, 
33430 70 54 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74  pTab);.      int
33440 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
33450 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
33460 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33470 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20  p4(v, OP_VOpen, 
33480 69 43 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61  iCur, 0, 0, pVTa
33490 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20  b, P4_VTAB);.   
334a0 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72   }else if( IsVir
334b0 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
334c0 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20      /* noop */. 
334d0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
334e0 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
334f0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
33500 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20  IDX_ONLY)==0.   
33510 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46        && (wctrlF
33520 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49  lags & WHERE_OMI
33530 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30  T_OPEN_CLOSE)==0
33540 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   ){.      int op
33550 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a   = OP_OpenRead;.
33560 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
33570 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 29 7b 0a 20  ->okOnePass ){. 
33580 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f         op = OP_O
33590 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  penWrite;.      
335a0 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f    pWInfo->aiCurO
335b0 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 54 61 62  nePass[0] = pTab
335c0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
335d0 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 73 71       };.      sq
335e0 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
335f0 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d  Parse, pTabItem-
33600 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70  >iCursor, iDb, p
33610 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20  Tab, op);.      
33620 61 73 73 65 72 74 28 20 70 54 61 62 49 74 65 6d  assert( pTabItem
33630 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65  ->iCursor==pLeve
33640 6c 2d 3e 69 54 61 62 43 75 72 20 29 3b 0a 20 20  l->iTabCur );.  
33650 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 70      testcase( !p
33660 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
33670 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d   && pTab->nCol==
33680 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  BMS-1 );.      t
33690 65 73 74 63 61 73 65 28 20 21 70 57 49 6e 66 6f  estcase( !pWInfo
336a0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70  ->okOnePass && p
336b0 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29  Tab->nCol==BMS )
336c0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 57 49  ;.      if( !pWI
336d0 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26  nfo->okOnePass &
336e0 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53  & pTab->nCol<BMS
336f0 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 54 61   && HasRowid(pTa
33700 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69  b) ){.        Bi
33710 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74  tmask b = pTabIt
33720 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20  em->colUsed;.   
33730 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a       int n = 0;.
33740 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b          for(; b;
33750 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a   b=b>>1, n++){}.
33760 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
33770 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 73  dbeChangeP4(v, s
33780 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
33790 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20 20 20  tAddr(v)-1, .   
337a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
337b0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
337c0 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50  INT_TO_PTR(n), P
337d0 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20  4_INT32);.      
337e0 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61    assert( n<=pTa
337f0 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
33800 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
33810 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
33820 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
33830 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
33840 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
33850 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f     }.    if( pLo
33860 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
33870 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
33880 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20       Index *pIx 
33890 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
338a0 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 69  .pIndex;.      i
338b0 6e 74 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20  nt iIndexCur;.  
338c0 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f      int op = OP_
338d0 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20  OpenRead;.      
338e0 2f 2a 20 69 49 64 78 43 75 72 20 69 73 20 61 6c  /* iIdxCur is al
338f0 77 61 79 73 20 73 65 74 20 69 66 20 74 6f 20 61  ways set if to a
33900 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20   positive value 
33910 69 66 20 4f 4e 45 50 41 53 53 20 69 73 20 70 6f  if ONEPASS is po
33920 73 73 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  ssible */.      
33930 61 73 73 65 72 74 28 20 69 49 64 78 43 75 72 21  assert( iIdxCur!
33940 3d 30 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77  =0 || (pWInfo->w
33950 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
33960 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
33970 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  D)==0 );.      i
33980 66 28 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65  f( pWInfo->okOne
33990 50 61 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  Pass ){.        
339a0 49 6e 64 65 78 20 2a 70 4a 20 3d 20 70 54 61 62  Index *pJ = pTab
339b0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e 64  Item->pTab->pInd
339c0 65 78 3b 0a 20 20 20 20 20 20 20 20 69 49 6e 64  ex;.        iInd
339d0 65 78 43 75 72 20 3d 20 69 49 64 78 43 75 72 3b  exCur = iIdxCur;
339e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
339f0 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
33a00 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
33a10 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 77  RED );.        w
33a20 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4a 29  hile( ALWAYS(pJ)
33a30 20 26 26 20 70 4a 21 3d 70 49 78 20 29 7b 0a 20   && pJ!=pIx ){. 
33a40 20 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43           iIndexC
33a50 75 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ur++;.          
33a60 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b 0a  pJ = pJ->pNext;.
33a70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33a80 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72    op = OP_OpenWr
33a90 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49  ite;.        pWI
33aa0 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
33ab0 73 5b 31 5d 20 3d 20 69 49 6e 64 65 78 43 75 72  s[1] = iIndexCur
33ac0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
33ad0 28 20 69 49 64 78 43 75 72 20 26 26 20 28 77 63  ( iIdxCur && (wc
33ae0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
33af0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21  _ONETABLE_ONLY)!
33b00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49  =0 ){.        iI
33b10 6e 64 65 78 43 75 72 20 3d 20 69 49 64 78 43 75  ndexCur = iIdxCu
33b20 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  r;.      }else{.
33b30 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
33b40 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
33b50 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
33b60 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
33b70 72 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20  r = iIndexCur;. 
33b80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78       assert( pIx
33b90 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
33ba0 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
33bb0 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78    assert( iIndex
33bc0 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  Cur>=0 );.      
33bd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
33be0 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64 65 78 43  3(v, op, iIndexC
33bf0 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69  ur, pIx->tnum, i
33c00 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
33c10 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
33c20 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b  fo(pParse, pIx);
33c30 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
33c40 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78  nt((v, "%s", pIx
33c50 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  ->zName));.    }
33c60 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
33c70 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
33c80 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 6e  rse, iDb);.    n
33c90 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d  otReady &= ~getM
33ca0 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
33cb0 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d  skSet, pTabItem-
33cc0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20  >iCursor);.  }. 
33cd0 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20   pWInfo->iTop = 
33ce0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
33cf0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28  ntAddr(v);.  if(
33d00 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
33d10 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
33d20 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20  ginError;..  /* 
33d30 47 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  Generate the cod
33d40 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72  e to do the sear
33d50 63 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74  ch.  Each iterat
33d60 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20  ion of the for. 
33d70 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67   ** loop below g
33d80 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f  enerates code fo
33d90 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65  r a single neste
33da0 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d  d loop of the VM
33db0 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20  .  ** program.. 
33dc0 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
33dd0 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
33de0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61  for(ii=0; ii<nTa
33df0 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  bList; ii++){.  
33e00 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
33e10 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 23 69 66 6e 64  fo->a[ii];.#ifnd
33e20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
33e30 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20  UTOMATIC_INDEX. 
33e40 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
33e50 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  pWLoop->wsFlags 
33e60 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
33e70 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  EX)!=0 ){.      
33e80 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74  constructAutomat
33e90 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  icIndex(pParse, 
33ea0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a 20 20  &pWInfo->sWC,.  
33eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
33ec0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
33ed0 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74 52 65  l->iFrom], notRe
33ee0 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20  ady, pLevel);.  
33ef0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
33f00 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
33f10 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
33f20 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
33f30 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e    explainOneScan
33f40 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
33f50 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c 20 70  t, pLevel, ii, p
33f60 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63  Level->iFrom, wc
33f70 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 70  trlFlags);.    p
33f80 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 20  Level->addrBody 
33f90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
33fa0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
33fb0 20 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f 64 65   notReady = code
33fc0 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49  OneLoopStart(pWI
33fd0 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52 65 61 64  nfo, ii, notRead
33fe0 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  y);.    pWInfo->
33ff0 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76  iContinue = pLev
34000 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20  el->addrCont;.  
34010 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f  }..  /* Done. */
34020 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
34030 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48  nt((v, "Begin WH
34040 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 72  ERE-core"));.  r
34050 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20  eturn pWInfo;.. 
34060 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
34070 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
34080 0a 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72  .whereBeginError
34090 3a 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29  :.  if( pWInfo )
340a0 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51  {.    pParse->nQ
340b0 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66  ueryLoop = pWInf
340c0 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  o->savedNQueryLo
340d0 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 49 6e 66  op;.    whereInf
340e0 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  oFree(db, pWInfo
340f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
34100 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
34110 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  rate the end of 
34120 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20  the WHERE loop. 
34130 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e   See comments on
34140 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72   .** sqlite3Wher
34150 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64  eBegin() for add
34160 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
34170 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
34180 69 74 65 33 57 68 65 72 65 45 6e 64 28 57 68 65  ite3WhereEnd(Whe
34190 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
341a0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
341b0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
341c0 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  e;.  Vdbe *v = p
341d0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
341e0 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65  int i;.  WhereLe
341f0 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 57  vel *pLevel;.  W
34200 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
34210 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
34220 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
34230 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  TabList;.  sqlit
34240 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
34250 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  >db;..  /* Gener
34260 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  ate loop termina
34270 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  tion code..  */.
34280 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
34290 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45  t((v, "End WHERE
342a0 2d 63 6f 72 65 22 29 29 3b 0a 20 20 73 71 6c 69  -core"));.  sqli
342b0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
342c0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
342d0 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  (i=pWInfo->nLeve
342e0 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  l-1; i>=0; i--){
342f0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  .    int addr;. 
34300 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
34310 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70  nfo->a[i];.    p
34320 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
34330 57 4c 6f 6f 70 3b 0a 20 20 20 20 73 71 6c 69 74  WLoop;.    sqlit
34340 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
34350 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
34360 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28  drCont);.    if(
34370 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f   pLevel->op!=OP_
34380 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Noop ){.      sq
34390 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
343a0 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70  v, pLevel->op, p
343b0 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65  Level->p1, pLeve
343c0 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20 73 71  l->p2);.      sq
343d0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
343e0 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29  5(v, pLevel->p5)
343f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
34400 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
34410 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26   WHERE_IN_ABLE &
34420 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  & pLevel->u.in.n
34430 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74  In>0 ){.      st
34440 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e  ruct InLoop *pIn
34450 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
34460 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34470 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
34480 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29  pLevel->addrNxt)
34490 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c  ;.      for(j=pL
344a0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20  evel->u.in.nIn, 
344b0 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69  pIn=&pLevel->u.i
344c0 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20  n.aInLoop[j-1]; 
344d0 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29  j>0; j--, pIn--)
344e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
344f0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
34500 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b   pIn->addrInTop+
34510 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
34520 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
34530 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
34540 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e  , pIn->iCur, pIn
34550 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20  ->addrInTop);.  
34560 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34570 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
34580 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a  ->addrInTop-1);.
34590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
345a0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
345b0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
345c0 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Loop);.    }.   
345d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
345e0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
345f0 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
34600 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64    if( pLevel->ad
34610 64 72 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  drSkip ){.      
34620 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34630 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
34640 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69   pLevel->addrSki
34650 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  p);.      VdbeCo
34660 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20  mment((v, "next 
34670 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22  skip-scan on %s"
34680 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  , pLoop->u.btree
34690 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29  .pIndex->zName))
346a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
346b0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
346c0 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29  Level->addrSkip)
346d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
346e0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
346f0 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 2d  Level->addrSkip-
34700 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  2);.    }.    if
34710 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
34720 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 61 64 64  oin ){.      add
34730 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
34740 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
34750 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  s, pLevel->iLeft
34760 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 61 73 73  Join);.      ass
34770 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
34780 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
34790 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20  _ONLY)==0.      
347a0 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e       || (pLoop->
347b0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
347c0 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20  INDEXED)!=0 );. 
347d0 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d       if( (pLoop-
347e0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
347f0 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _IDX_ONLY)==0 ){
34800 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34810 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
34820 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69  _NullRow, pTabLi
34830 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
34840 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
34850 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
34860 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
34870 58 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73  XED ){.        s
34880 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
34890 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
348a0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29  pLevel->iIdxCur)
348b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
348c0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d  if( pLevel->op==
348d0 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20  OP_Return ){.   
348e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
348f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
34900 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20  ub, pLevel->p1, 
34910 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73  pLevel->addrFirs
34920 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
34930 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34940 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
34950 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c  _Goto, 0, pLevel
34960 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  ->addrFirst);.  
34970 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
34980 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
34990 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a  v, addr);.    }.
349a0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
349b0 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45  ent((v, "End WHE
349c0 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 20  RE-loop%d: %s", 
349d0 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i,.             
349e0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
349f0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
34a00 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d  el->iFrom].pTab-
34a10 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20  >zName));.  }.. 
34a20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20   /* The "break" 
34a30 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a  point is here, j
34a40 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64  ust past the end
34a50 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f   of the outer lo
34a60 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e  op..  ** Set it.
34a70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
34a80 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
34a90 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  v, pWInfo->iBrea
34aa0 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  k);..  assert( p
34ab0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70  WInfo->nLevel<=p
34ac0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
34ad0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
34ae0 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
34af0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
34b00 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
34b10 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
34b20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
34b30 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
34b40 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
34b50 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
34b60 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  rom];.    Table 
34b70 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d  *pTab = pTabItem
34b80 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65  ->pTab;.    asse
34b90 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
34ba0 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
34bb0 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20  l->pWLoop;..    
34bc0 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20  /* Close all of 
34bd0 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
34be0 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20   were opened by 
34bf0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
34c00 6e 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74  n..    ** Except
34c10 2c 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 63  , do not close c
34c20 75 72 73 6f 72 73 20 74 68 61 74 20 77 69 6c 6c  ursors that will
34c30 20 62 65 20 72 65 75 73 65 64 20 62 79 20 74 68   be reused by th
34c40 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f  e OR optimizatio
34c50 6e 0a 20 20 20 20 2a 2a 20 28 57 48 45 52 45 5f  n.    ** (WHERE_
34c60 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29  OMIT_OPEN_CLOSE)
34c70 2e 20 20 41 6e 64 20 64 6f 20 6e 6f 74 20 63 6c  .  And do not cl
34c80 6f 73 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 57  ose the OP_OpenW
34c90 72 69 74 65 20 63 75 72 73 6f 72 73 0a 20 20 20  rite cursors.   
34ca0 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20   ** created for 
34cb0 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69  the ONEPASS opti
34cc0 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  mization..    */
34cd0 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
34ce0 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
34cf0 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20  hemeral)==0.    
34d00 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
34d10 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57  t==0.     && (pW
34d20 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
34d30 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50   & WHERE_OMIT_OP
34d40 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20  EN_CLOSE)==0.   
34d50 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73   ){.      int ws
34d60 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67   = pLoop->wsFlag
34d70 73 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 57  s;.      if( !pW
34d80 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
34d90 26 26 20 28 77 73 20 26 20 57 48 45 52 45 5f 49  && (ws & WHERE_I
34da0 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  DX_ONLY)==0 ){. 
34db0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
34dc0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
34dd0 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  lose, pTabItem->
34de0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
34df0 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20  }.      if( (ws 
34e00 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
34e10 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 77  !=0.       && (w
34e20 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57  s & (WHERE_IPK|W
34e30 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
34e40 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  )==0 .       && 
34e50 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 21  pLevel->iIdxCur!
34e60 3d 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e  =pWInfo->aiCurOn
34e70 65 50 61 73 73 5b 31 5d 0a 20 20 20 20 20 20 29  ePass[1].      )
34e80 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
34e90 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
34ea0 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d  P_Close, pLevel-
34eb0 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
34ec0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
34ed0 20 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73   If this scan us
34ee0 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b  es an index, mak
34ef0 65 20 56 44 42 45 20 63 6f 64 65 20 73 75 62 73  e VDBE code subs
34f00 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61  titutions to rea
34f10 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72  d data.    ** fr
34f20 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 73  om the index ins
34f30 74 65 61 64 20 6f 66 20 66 72 6f 6d 20 74 68 65  tead of from the
34f40 20 74 61 62 6c 65 20 77 68 65 72 65 20 70 6f 73   table where pos
34f50 73 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20  sible.  In some 
34f60 63 61 73 65 73 0a 20 20 20 20 2a 2a 20 74 68 69  cases.    ** thi
34f70 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70  s optimization p
34f80 72 65 76 65 6e 74 73 20 74 68 65 20 74 61 62 6c  revents the tabl
34f90 65 20 66 72 6f 6d 20 65 76 65 72 20 62 65 69 6e  e from ever bein
34fa0 67 20 72 65 61 64 2c 20 77 68 69 63 68 20 63 61  g read, which ca
34fb0 6e 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64 20 61  n.    ** yield a
34fc0 20 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72   significant per
34fd0 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a  formance boost..
34fe0 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43      ** .    ** C
34ff0 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65  alls to the code
35000 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65   generator in be
35010 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65  tween sqlite3Whe
35020 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20  reBegin and.    
35030 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ** sqlite3WhereE
35040 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65  nd will have cre
35050 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72  ated code that r
35060 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61  eferences the ta
35070 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  ble.    ** direc
35080 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20  tly.  This loop 
35090 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63  scans all that c
350a0 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ode looking for 
350b0 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74  opcodes.    ** t
350c0 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  hat reference th
350d0 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76  e table and conv
350e0 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f  erts them into o
350f0 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20  pcodes that.    
35100 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ** reference the
35110 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20   index..    */. 
35120 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
35130 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  Flags & (WHERE_I
35140 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 49 44 58  NDEXED|WHERE_IDX
35150 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20  _ONLY) ){.      
35160 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  pIdx = pLoop->u.
35170 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
35180 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f    }else if( pLoo
35190 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
351a0 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
351b0 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76       pIdx = pLev
351c0 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20  el->u.pCovidx;. 
351d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64     }.    if( pId
351e0 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  x && !db->malloc
351f0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
35200 69 6e 74 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20  int k, last;.   
35210 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
35220 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71  .      last = sq
35230 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
35240 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 6b  Addr(v);.      k
35250 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42   = pLevel->addrB
35260 6f 64 79 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d  ody;.      pOp =
35270 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
35280 70 28 76 2c 20 6b 29 3b 0a 20 20 20 20 20 20 66  p(v, k);.      f
35290 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b  or(; k<last; k++
352a0 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  , pOp++){.      
352b0 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70    if( pOp->p1!=p
352c0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29  Level->iTabCur )
352d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
352e0 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
352f0 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b  de==OP_Column ){
35300 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 78  .          int x
35310 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = pOp->p2;.    
35320 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
35330 64 78 2d 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62  dx->pTable==pTab
35340 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
35350 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
35360 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
35370 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71   Index *pPk = sq
35380 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
35390 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
353a0 20 20 20 20 20 20 20 20 78 20 3d 20 70 50 6b 2d          x = pPk-
353b0 3e 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20  >aiColumn[x];.  
353c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
353d0 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43      x = sqlite3C
353e0 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64  olumnOfIndex(pId
353f0 78 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20  x, x);.         
35400 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20   if( x>=0 ){.   
35410 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32           pOp->p2
35420 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 20 20   = x;.          
35430 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
35440 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
35450 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35460 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
35470 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
35480 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
35490 7c 7c 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20  || x>=0 );.     
354a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70     }else if( pOp
354b0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77  ->opcode==OP_Row
354c0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
354d0 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c  pOp->p1 = pLevel
354e0 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
354f0 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
35500 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a   = OP_IdxRowid;.
35510 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35520 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
35530 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a  * Final cleanup.
35540 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e    */.  pParse->n
35550 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e  QueryLoop = pWIn
35560 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
35570 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f  oop;.  whereInfo
35580 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
35590 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a        ;.  return;.}.