/ Hex Artifact Content
Login

Artifact 81cec50fe73633144b0730de477e141c53485862:


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 73  */..  pRight = s
57a0: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
57b0: 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 30  llate(pList->a[0
57c0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 6f 70 20 3d  ].pExpr);.  op =
57d0: 20 70 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69   pRight->op;.  i
57e0: 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42  f( op==TK_VARIAB
57f0: 4c 45 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  LE ){.    Vdbe *
5800: 70 52 65 70 72 65 70 61 72 65 20 3d 20 70 50 61  pReprepare = pPa
5810: 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 3b  rse->pReprepare;
5820: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  .    int iCol = 
5830: 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b  pRight->iColumn;
5840: 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  .    pVal = sqli
5850: 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56  te3VdbeGetBoundV
5860: 61 6c 75 65 28 70 52 65 70 72 65 70 61 72 65 2c  alue(pReprepare,
5870: 20 69 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46   iCol, SQLITE_AF
5880: 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28  F_NONE);.    if(
5890: 20 70 56 61 6c 20 26 26 20 73 71 6c 69 74 65 33   pVal && sqlite3
58a0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c  _value_type(pVal
58b0: 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29  )==SQLITE_TEXT )
58c0: 7b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61  {.      z = (cha
58d0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  r *)sqlite3_valu
58e0: 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a 20 20  e_text(pVal);.  
58f0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
5900: 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50  dbeSetVarmask(pP
5910: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f  arse->pVdbe, iCo
5920: 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
5930: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56  pRight->op==TK_V
5940: 41 52 49 41 42 4c 45 20 7c 7c 20 70 52 69 67 68  ARIABLE || pRigh
5950: 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  t->op==TK_REGIST
5960: 45 52 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ER );.  }else if
5970: 28 20 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20  ( op==TK_STRING 
5980: 29 7b 0a 20 20 20 20 7a 20 3d 20 70 52 69 67 68  ){.    z = pRigh
5990: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d  t->u.zToken;.  }
59a0: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
59b0: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  cnt = 0;.    whi
59c0: 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d  le( (c=z[cnt])!=
59d0: 30 20 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26  0 && c!=wc[0] &&
59e0: 20 63 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d   c!=wc[1] && c!=
59f0: 77 63 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20 63  wc[2] ){.      c
5a00: 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt++;.    }.    
5a10: 69 66 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35  if( cnt!=0 && 25
5a20: 35 21 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20  5!=(u8)z[cnt-1] 
5a30: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
5a40: 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70  Prefix;.      *p
5a50: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d  isComplete = c==
5a60: 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31  wc[0] && z[cnt+1
5a70: 5d 3d 3d 30 3b 0a 20 20 20 20 20 20 70 50 72 65  ]==0;.      pPre
5a80: 66 69 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70  fix = sqlite3Exp
5a90: 72 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c  r(db, TK_STRING,
5aa0: 20 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   z);.      if( p
5ab0: 50 72 65 66 69 78 20 29 20 70 50 72 65 66 69 78  Prefix ) pPrefix
5ac0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20  ->u.zToken[cnt] 
5ad0: 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70 70 50 72  = 0;.      *ppPr
5ae0: 65 66 69 78 20 3d 20 70 50 72 65 66 69 78 3b 0a  efix = pPrefix;.
5af0: 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b        if( op==TK
5b00: 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20  _VARIABLE ){.   
5b10: 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70       Vdbe *v = p
5b20: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
5b30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5b40: 65 53 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 70  eSetVarmask(v, p
5b50: 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  Right->iColumn);
5b60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 69  .        if( *pi
5b70: 73 43 6f 6d 70 6c 65 74 65 20 26 26 20 70 52 69  sComplete && pRi
5b80: 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d  ght->u.zToken[1]
5b90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
5ba0: 20 49 66 20 74 68 65 20 72 68 73 20 6f 66 20 74   If the rhs of t
5bb0: 68 65 20 4c 49 4b 45 20 65 78 70 72 65 73 73 69  he LIKE expressi
5bc0: 6f 6e 20 69 73 20 61 20 76 61 72 69 61 62 6c 65  on is a variable
5bd0: 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
5be0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76  t.          ** v
5bf0: 61 6c 75 65 20 6f 66 20 74 68 65 20 76 61 72 69  alue of the vari
5c00: 61 62 6c 65 20 6d 65 61 6e 73 20 74 68 65 72 65  able means there
5c10: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69   is no need to i
5c20: 6e 76 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20  nvoke the LIKE. 
5c30: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63           ** func
5c40: 74 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50  tion, then no OP
5c50: 5f 56 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62  _Variable will b
5c60: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70  e added to the p
5c70: 72 6f 67 72 61 6d 2e 0a 20 20 20 20 20 20 20 20  rogram..        
5c80: 20 20 2a 2a 20 54 68 69 73 20 63 61 75 73 65 73    ** This causes
5c90: 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68   problems for th
5ca0: 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  e sqlite3_bind_p
5cb0: 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a  arameter_name().
5cc0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 50 49            ** API
5cd0: 2e 20 54 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20  . To workaround 
5ce0: 74 68 65 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d  them, add a dumm
5cf0: 79 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 68 65  y OP_Variable he
5d00: 72 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  re..          */
5d10: 20 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20   .          int 
5d20: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
5d30: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
5d40: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5d50: 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
5d60: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
5d70: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  r1);.          s
5d80: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5d90: 50 33 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62  P3(v, sqlite3Vdb
5da0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d  eCurrentAddr(v)-
5db0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 0);.         
5dc0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5dd0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5de0: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
5df0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
5e00: 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20  .      z = 0;.  
5e10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
5e20: 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
5e30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 7a 21 3d  );.  return (z!=
5e40: 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  0);.}.#endif /* 
5e50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
5e60: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
5e70: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
5e80: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
5e90: 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  BLE./*.** Check 
5ea0: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69  to see if the gi
5eb0: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
5ec0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
5ed0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75  .**         colu
5ee0: 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a  mn MATCH expr.**
5ef0: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 74 68 65  .** If it is the
5f00: 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20  n return TRUE.  
5f10: 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46  If not, return F
5f20: 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ALSE..*/.static 
5f30: 69 6e 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c  int isMatchOfCol
5f40: 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78  umn(.  Expr *pEx
5f50: 70 72 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20  pr      /* Test 
5f60: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
5f70: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  */.){.  ExprList
5f80: 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20   *pList;..  if( 
5f90: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55  pExpr->op!=TK_FU
5fa0: 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65  NCTION ){.    re
5fb0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
5fc0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
5fd0: 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
5fe0: 2c 22 6d 61 74 63 68 22 29 21 3d 30 20 29 7b 0a  ,"match")!=0 ){.
5ff0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6000: 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  }.  pList = pExp
6010: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66  r->x.pList;.  if
6020: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  ( pList->nExpr!=
6030: 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
6040: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  0;.  }.  if( pLi
6050: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e  st->a[1].pExpr->
6060: 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20  op != TK_COLUMN 
6070: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6080: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
6090: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
60a0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
60b0: 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
60c0: 49 66 20 74 68 65 20 70 42 61 73 65 20 65 78 70  If the pBase exp
60d0: 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74  ression originat
60e0: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
60f0: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a  USING clause of.
6100: 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20  ** a join, then 
6110: 74 72 61 6e 73 66 65 72 20 74 68 65 20 61 70 70  transfer the app
6120: 72 6f 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67  ropriate marking
6130: 73 20 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65  s over to derive
6140: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
6150: 64 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61  d transferJoinMa
6160: 72 6b 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65  rkings(Expr *pDe
6170: 72 69 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61  rived, Expr *pBa
6180: 73 65 29 7b 0a 20 20 69 66 28 20 70 44 65 72 69  se){.  if( pDeri
6190: 76 65 64 20 29 7b 0a 20 20 20 20 70 44 65 72 69  ved ){.    pDeri
61a0: 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42  ved->flags |= pB
61b0: 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ase->flags & EP_
61c0: 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70 44  FromJoin;.    pD
61d0: 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f  erived->iRightJo
61e0: 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d  inTable = pBase-
61f0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
6200: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65  ;.  }.}..#if !de
6210: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6220: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
6230: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
6240: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
6250: 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ERY)./*.** Analy
6260: 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 63  ze a term that c
6270: 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f  onsists of two o
6280: 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63  r more OR-connec
6290: 74 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e  ted.** subterms.
62a0: 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20    So in:.**.**  
62b0: 20 20 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61     ... WHERE  (a
62c0: 3d 35 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20  =5) AND (b=7 OR 
62d0: 63 3d 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44  c=9 OR d=13) AND
62e0: 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20   (d=13).**      
62f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6300: 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e      ^^^^^^^^^^^^
6310: 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54  ^^^^^^^^.**.** T
6320: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c  his routine anal
6330: 79 7a 65 73 20 74 65 72 6d 73 20 73 75 63 68 20  yzes terms such 
6340: 61 73 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65  as the middle te
6350: 72 6d 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  rm in the above 
6360: 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68  example..** A Wh
6370: 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74  ereOrTerm object
6380: 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64   is computed and
6390: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
63a0: 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61   term under.** a
63b0: 6e 61 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c  nalysis, regardl
63c0: 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f  ess of the outco
63d0: 6d 65 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73  me of the analys
63e0: 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a  is.  Hence:.**.*
63f0: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
6400: 77 74 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45  wtFlags   |=  TE
6410: 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20  RM_ORINFO.**    
6420: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
6430: 49 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d  Info  =  a dynam
6440: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
6450: 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a   WhereOrTerm obj
6460: 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65  ect.**.** The te
6470: 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  rm being analyze
6480: 64 20 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20  d must have two 
6490: 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f  or more of OR-co
64a0: 6e 6e 65 63 74 65 64 20 73 75 62 74 65 72 6d 73  nnected subterms
64b0: 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75  ..** A single su
64c0: 62 74 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61  bterm might be a
64d0: 20 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e   set of AND-conn
64e0: 65 63 74 65 64 20 73 75 62 2d 73 75 62 74 65 72  ected sub-subter
64f0: 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20  ms..** Examples 
6500: 6f 66 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61  of terms under a
6510: 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  nalysis:.**.**  
6520: 20 20 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d     (A)     t1.x=
6530: 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e  t2.y OR t1.x=t2.
6540: 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20  z OR t1.y=15 OR 
6550: 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20  t1.z=t3.a+5.**  
6560: 20 20 20 28 42 29 20 20 20 20 20 78 3d 65 78 70     (B)     x=exp
6570: 72 31 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52  r1 OR expr2=x OR
6580: 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20   x=expr3.**     
6590: 28 43 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e  (C)     t1.x=t2.
65a0: 79 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20  y OR (t1.x=t2.z 
65b0: 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20  AND t1.y=15).** 
65c0: 20 20 20 20 28 44 29 20 20 20 20 20 78 3d 65 78      (D)     x=ex
65d0: 70 72 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44  pr1 OR (y>11 AND
65e0: 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45   y<22 AND z LIKE
65f0: 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20   '*hello*').**  
6600: 20 20 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d     (E)     (p.a=
6610: 31 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20  1 AND q.b=2 AND 
6620: 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34  r.c=3) OR (p.x=4
6630: 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72   AND q.y=5 AND r
6640: 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45  .z=6).**.** CASE
6650: 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c   1:.**.** If all
6660: 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66   subterms are of
6670: 20 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78   the form T.C=ex
6680: 70 72 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67  pr for some sing
6690: 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61  le column of C a
66a0: 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74  nd.** a single t
66b0: 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e  able T (as shown
66c0: 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62   in example B ab
66d0: 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61 74 65  ove) then create
66e0: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a   a new virtual.*
66f0: 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 61  * term that is a
6700: 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20  n equivalent IN 
6710: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20  expression.  In 
6720: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
6730: 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e  the term.** bein
6740: 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a  g analyzed is:.*
6750: 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78  *.**      x = ex
6760: 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d  pr1  OR  expr2 =
6770: 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72   x  OR  x = expr
6780: 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65  3.**.** then cre
6790: 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61  ate a new virtua
67a0: 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73  l term like this
67b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49  :.**.**      x I
67c0: 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65  N (expr1,expr2,e
67d0: 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45  xpr3).**.** CASE
67e0: 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c   2:.**.** If all
67f0: 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e   subterms are in
6800: 64 65 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e  dexable by a sin
6810: 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65  gle table T, the
6820: 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20  n set.**.**     
6830: 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61  WhereTerm.eOpera
6840: 74 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  tor             
6850: 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20   =  WO_OR.**    
6860: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
6870: 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
6880: 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20   |=  the cursor 
6890: 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65  number for table
68a0: 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65   T.**.** A subte
68b0: 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65  rm is "indexable
68c0: 22 20 69 66 20 69 74 20 69 73 20 6f 66 20 74 68  " if it is of th
68d0: 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c  e form.** "T.C <
68e0: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72  op> <expr>" wher
68f0: 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d  e C is any colum
6900: 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64  n of table T and
6910: 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65   .** <op> is one
6920: 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c   of "=", "<", "<
6930: 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22  =", ">", ">=", "
6940: 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e  IS NULL", or "IN
6950: 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20  "..** A subterm 
6960: 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c  is also indexabl
6970: 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e  e if it is an AN
6980: 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  D of two or more
6990: 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20  .** subsubterms 
69a0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20  at least one of 
69b0: 77 68 69 63 68 20 69 73 20 69 6e 64 65 78 61 62  which is indexab
69c0: 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41  le.  Indexable A
69d0: 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20  ND .** subterms 
69e0: 68 61 76 65 20 74 68 65 69 72 20 65 4f 70 65 72  have their eOper
69f0: 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41  ator set to WO_A
6a00: 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61 76 65  ND and they have
6a10: 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73  .** u.pAndInfo s
6a20: 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61  et to a dynamica
6a30: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
6a40: 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63  ereAndTerm objec
6a50: 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e  t..**.** From an
6a60: 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76  other point of v
6a70: 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22  iew, "indexable"
6a80: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
6a90: 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a  subterm could.**
6aa0: 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20   potentially be 
6ab0: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
6ac0: 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72  ex if an appropr
6ad0: 69 61 74 65 20 69 6e 64 65 78 20 65 78 69 73 74  iate index exist
6ae0: 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79  s..** This analy
6af0: 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  sis does not con
6b00: 73 69 64 65 72 20 77 68 65 74 68 65 72 20 6f 72  sider whether or
6b10: 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65   not the index e
6b20: 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69  xists; that.** i
6b30: 73 20 64 65 63 69 64 65 64 20 65 6c 73 65 77 68  s decided elsewh
6b40: 65 72 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79  ere.  This analy
6b50: 73 69 73 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61  sis only looks a
6b60: 74 20 77 68 65 74 68 65 72 20 73 75 62 74 65 72  t whether subter
6b70: 6d 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  ms.** appropriat
6b80: 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65  e for indexing e
6b90: 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  xist..**.** All 
6ba0: 65 78 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75  examples A throu
6bb0: 67 68 20 45 20 61 62 6f 76 65 20 73 61 74 69 73  gh E above satis
6bc0: 66 79 20 63 61 73 65 20 32 2e 20 20 42 75 74 20  fy case 2.  But 
6bd0: 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73  if a term.** als
6be0: 6f 20 73 74 61 74 69 73 66 69 65 73 20 63 61 73  o statisfies cas
6bf0: 65 20 31 20 28 73 75 63 68 20 61 73 20 42 29 20  e 1 (such as B) 
6c00: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
6c10: 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a   optimizer will.
6c20: 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66 65 72  ** always prefer
6c30: 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e 20 74   case 1, so in t
6c40: 68 61 74 20 63 61 73 65 20 77 65 20 70 72 65 74  hat case we pret
6c50: 65 6e 64 20 74 68 61 74 20 63 61 73 65 20 32 20  end that case 2 
6c60: 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66  is not.** satisf
6c70: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69  ied..**.** It mi
6c80: 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ght be the case 
6c90: 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 74 61  that multiple ta
6ca0: 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78 61 62  bles are indexab
6cb0: 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  le.  For example
6cc0: 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65 20 69  ,.** (E) above i
6cd0: 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74  s indexable on t
6ce0: 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64 20  ables P, Q, and 
6cf0: 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74  R..**.** Terms t
6d00: 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65  hat satisfy case
6d10: 20 32 20 61 72 65 20 63 61 6e 64 69 64 61 74 65   2 are candidate
6d20: 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20  s for lookup by 
6d30: 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74  using.** separat
6d40: 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66 69 6e  e indices to fin
6d50: 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65 61 63  d rowids for eac
6d60: 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20 63 6f  h subterm and co
6d70: 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75  mposing.** the u
6d80: 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69  nion of all rowi
6d90: 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77 53 65  ds using a RowSe
6da0: 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  t object.  This 
6db0: 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f  is similar.** to
6dc0: 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63 65 73   "bitmap indices
6dd0: 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74 61 62  " in other datab
6de0: 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a  ase engines..**.
6df0: 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a  ** OTHERWISE:.**
6e00: 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 63  .** If neither c
6e10: 61 73 65 20 31 20 6e 6f 72 20 63 61 73 65 20 32  ase 1 nor case 2
6e20: 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61   apply, then lea
6e30: 76 65 20 74 68 65 20 65 4f 70 65 72 61 74 6f 72  ve the eOperator
6e40: 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e   set to.** zero.
6e50: 20 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 6e    This term is n
6e60: 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65  ot useful for se
6e70: 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  arch..*/.static 
6e80: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
6e90: 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c 69 73  OrTerm(.  SrcLis
6ea0: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20  t *pSrc,        
6eb0: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
6ec0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
6ed0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
6ee0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d        /* the com
6ef0: 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61 75  plete WHERE clau
6f00: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54  se */.  int idxT
6f10: 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
6f20: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
6f30: 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65 20  e OR-term to be 
6f40: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20  analyzed */.){. 
6f50: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
6f60: 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  fo = pWC->pWInfo
6f70: 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52  ;        /* WHER
6f80: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
6f90: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
6fa0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
6fb0: 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
6fd0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
6fe0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
6ff0: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
7000: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
7010: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
7020: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
7030: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
7040: 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54  dxTerm];    /* T
7050: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
7060: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72  alyzed */.  Expr
7070: 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
7080: 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  >pExpr;         
7090: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
70a0: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 72  ssion of the ter
70b0: 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  m */.  int i;   
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
70e0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
70f0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
7100: 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20 20 2f   *pOrWc;       /
7110: 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70 54 65  * Breakup of pTe
7120: 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  rm into subterms
7130: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
7140: 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20 20 20  *pOrTerm;       
7150: 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20 77 69  /* A Sub-term wi
7160: 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63 20 2a  thin the pOrWc *
7170: 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20  /.  WhereOrInfo 
7180: 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a  *pOrInfo;     /*
7190: 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   Additional info
71a0: 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69 61 74  rmation associat
71b0: 65 64 20 77 69 74 68 20 70 54 65 72 6d 20 2a 2f  ed with pTerm */
71c0: 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e 67 54  .  Bitmask chngT
71d0: 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  oIN;         /* 
71e0: 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68  Tables that migh
71f0: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 31  t satisfy case 1
7200: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e   */.  Bitmask in
7210: 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20 20  dexable;        
7220: 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 61  /* Tables that a
7230: 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20 73 61  re indexable, sa
7240: 74 69 73 66 79 69 6e 67 20 63 61 73 65 20 32 20  tisfying case 2 
7250: 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72  */..  /*.  ** Br
7260: 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61 75 73  eak the OR claus
7270: 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70 61 72  e into its separ
7280: 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20 20 54  ate subterms.  T
7290: 68 65 20 73 75 62 74 65 72 6d 73 20 61 72 65 0a  he subterms are.
72a0: 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61    ** stored in a
72b0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
72c0: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
72d0: 67 20 77 69 74 68 69 6e 20 74 68 65 20 57 68 65  g within the Whe
72e0: 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62  reOrInfo.  ** ob
72f0: 6a 65 63 74 20 74 68 61 74 20 69 73 20 61 74 74  ject that is att
7300: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f 72 69  ached to the ori
7310: 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65 20  ginal OR clause 
7320: 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  term..  */.  ass
7330: 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ert( (pTerm->wtF
7340: 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44 59 4e  lags & (TERM_DYN
7350: 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f  AMIC|TERM_ORINFO
7360: 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d  |TERM_ANDINFO))=
7370: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
7380: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  pExpr->op==TK_OR
7390: 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70   );.  pTerm->u.p
73a0: 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f  OrInfo = pOrInfo
73b0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
73c0: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
73d0: 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20  f(*pOrInfo));.  
73e0: 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29  if( pOrInfo==0 )
73f0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d   return;.  pTerm
7400: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
7410: 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57  M_ORINFO;.  pOrW
7420: 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63  c = &pOrInfo->wc
7430: 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49  ;.  whereClauseI
7440: 6e 69 74 28 70 4f 72 57 63 2c 20 70 57 49 6e 66  nit(pOrWc, pWInf
7450: 6f 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74  o);.  whereSplit
7460: 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c 20 54  (pOrWc, pExpr, T
7470: 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e 61  K_OR);.  exprAna
7480: 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f  lyzeAll(pSrc, pO
7490: 72 57 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  rWc);.  if( db->
74a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
74b0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
74c0: 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32   pOrWc->nTerm>=2
74d0: 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43   );..  /*.  ** C
74e0: 6f 6d 70 75 74 65 20 74 68 65 20 73 65 74 20 6f  ompute the set o
74f0: 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69  f tables that mi
7500: 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65  ght satisfy case
7510: 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20  s 1 or 2..  */. 
7520: 20 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28 42   indexable = ~(B
7530: 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67  itmask)0;.  chng
7540: 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b  ToIN = ~(Bitmask
7550: 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57  )0;.  for(i=pOrW
7560: 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54  c->nTerm-1, pOrT
7570: 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e  erm=pOrWc->a; i>
7580: 3d 30 20 26 26 20 69 6e 64 65 78 61 62 6c 65 3b  =0 && indexable;
7590: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
75a0: 7b 0a 20 20 20 20 69 66 28 20 28 70 4f 72 54 65  {.    if( (pOrTe
75b0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
75c0: 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b  WO_SINGLE)==0 ){
75d0: 0a 20 20 20 20 20 20 57 68 65 72 65 41 6e 64 49  .      WhereAndI
75e0: 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20  nfo *pAndInfo;. 
75f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4f       assert( (pO
7600: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
7610: 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54   (TERM_ANDINFO|T
7620: 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20  ERM_ORINFO))==0 
7630: 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f 49  );.      chngToI
7640: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 6e  N = 0;.      pAn
7650: 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  dInfo = sqlite3D
7660: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
7670: 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29  izeof(*pAndInfo)
7680: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e  );.      if( pAn
7690: 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  dInfo ){.       
76a0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41   WhereClause *pA
76b0: 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68  ndWC;.        Wh
76c0: 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72  ereTerm *pAndTer
76d0: 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  m;.        int j
76e0: 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  ;.        Bitmas
76f0: 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  k b = 0;.       
7700: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64   pOrTerm->u.pAnd
7710: 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b  Info = pAndInfo;
7720: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
7730: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
7740: 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20  M_ANDINFO;.     
7750: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65     pOrTerm->eOpe
7760: 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a  rator = WO_AND;.
7770: 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d          pAndWC =
7780: 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a   &pAndInfo->wc;.
7790: 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c 61          whereCla
77a0: 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c 20  useInit(pAndWC, 
77b0: 70 57 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20 20  pWC->pWInfo);.  
77c0: 20 20 20 20 20 20 77 68 65 72 65 53 70 6c 69 74        whereSplit
77d0: 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d  (pAndWC, pOrTerm
77e0: 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29  ->pExpr, TK_AND)
77f0: 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e  ;.        exprAn
7800: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70  alyzeAll(pSrc, p
7810: 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20  AndWC);.        
7820: 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d  pAndWC->pOuter =
7830: 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65   pWC;.        te
7840: 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c  stcase( db->mall
7850: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
7860: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
7870: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
7880: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
7890: 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d  pAndTerm=pAndWC-
78a0: 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54  >a; j<pAndWC->nT
78b0: 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65  erm; j++, pAndTe
78c0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
78d0: 20 20 20 61 73 73 65 72 74 28 20 70 41 6e 64 54     assert( pAndT
78e0: 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  erm->pExpr );.  
78f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 6c            if( al
7900: 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d  lowedOp(pAndTerm
7910: 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a  ->pExpr->op) ){.
7920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 20                b 
7930: 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e  |= getMask(&pWIn
7940: 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 41  fo->sMaskSet, pA
7950: 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  ndTerm->leftCurs
7960: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  or);.           
7970: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
7980: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7990: 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b   indexable &= b;
79a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
79b0: 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
79c0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
79d0: 4f 50 49 45 44 20 29 7b 0a 20 20 20 20 20 20 2f  OPIED ){.      /
79e0: 2a 20 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d  * Skip this term
79f0: 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72 65   for now.  We re
7a00: 76 69 73 69 74 20 69 74 20 77 68 65 6e 20 77 65  visit it when we
7a10: 20 70 72 6f 63 65 73 73 20 74 68 65 0a 20 20 20   process the.   
7a20: 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64     ** correspond
7a30: 69 6e 67 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  ing TERM_VIRTUAL
7a40: 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c   term */.    }el
7a50: 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  se{.      Bitmas
7a60: 6b 20 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 67  k b;.      b = g
7a70: 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
7a80: 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72  sMaskSet, pOrTer
7a90: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a  m->leftCursor);.
7aa0: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
7ab0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
7ac0: 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20  M_VIRTUAL ){.   
7ad0: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
7ae0: 70 4f 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d  pOther = &pOrWc-
7af0: 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72  >a[pOrTerm->iPar
7b00: 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20  ent];.        b 
7b10: 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e  |= getMask(&pWIn
7b20: 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f  fo->sMaskSet, pO
7b30: 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72  ther->leftCursor
7b40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7b50: 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b   indexable &= b;
7b60: 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54  .      if( (pOrT
7b70: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7b80: 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20 20   WO_EQ)==0 ){.  
7b90: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d        chngToIN =
7ba0: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
7bb0: 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49  .        chngToI
7bc0: 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a  N &= b;.      }.
7bd0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
7be0: 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20    ** Record the 
7bf0: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
7c00: 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20  at satisfy case 
7c10: 32 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67 68  2.  The set migh
7c20: 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e  t be.  ** empty.
7c30: 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d  .  */.  pOrInfo-
7c40: 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64  >indexable = ind
7c50: 65 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d  exable;.  pTerm-
7c60: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64  >eOperator = ind
7c70: 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20  exable==0 ? 0 : 
7c80: 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  WO_OR;..  /*.  *
7c90: 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73  * chngToIN holds
7ca0: 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73   a set of tables
7cb0: 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61   that *might* sa
7cc0: 74 69 73 66 79 20 63 61 73 65 20 31 2e 20 20 42  tisfy case 1.  B
7cd0: 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20  ut.  ** we have 
7ce0: 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74  to do some addit
7cf0: 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74  ional checking t
7d00: 6f 20 73 65 65 20 69 66 20 63 61 73 65 20 31 20  o see if case 1 
7d10: 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73  really.  ** is s
7d20: 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20  atisfied..  **. 
7d30: 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c   ** chngToIN wil
7d40: 6c 20 68 6f 6c 64 20 65 69 74 68 65 72 20 30 2c  l hold either 0,
7d50: 20 31 2c 20 6f 72 20 32 20 62 69 74 73 2e 20 20   1, or 2 bits.  
7d60: 54 68 65 20 30 2d 62 69 74 20 63 61 73 65 20 6d  The 0-bit case m
7d70: 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 74  eans.  ** that t
7d80: 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 73 69  here is no possi
7d90: 62 69 6c 69 74 79 20 6f 66 20 74 72 61 6e 73 66  bility of transf
7da0: 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52 20 63 6c  orming the OR cl
7db0: 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a  ause into an.  *
7dc0: 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 62 65  * IN operator be
7dd0: 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72  cause one or mor
7de0: 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  e terms in the O
7df0: 52 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  R clause contain
7e00: 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20  .  ** something 
7e10: 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e  other than == on
7e20: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
7e30: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20   single table.  
7e40: 54 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63  The 1-bit.  ** c
7e50: 61 73 65 20 6d 65 61 6e 73 20 74 68 61 74 20 65  ase means that e
7e60: 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65  very term of the
7e70: 20 4f 52 20 63 6c 61 75 73 65 20 69 73 20 6f 66   OR clause is of
7e80: 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22   the form.  ** "
7e90: 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70  table.column=exp
7ea0: 72 22 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67  r" for some sing
7eb0: 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6f  le table.  The o
7ec0: 6e 65 20 62 69 74 20 74 68 61 74 20 69 73 20 73  ne bit that is s
7ed0: 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72  et.  ** will cor
7ee0: 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 63  respond to the c
7ef0: 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65  ommon table.  We
7f00: 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63   still need to c
7f10: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a  heck to make.  *
7f20: 2a 20 73 75 72 65 20 74 68 65 20 73 61 6d 65 20  * sure the same 
7f30: 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 6f  column is used o
7f40: 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68  n all terms.  Th
7f50: 65 20 32 2d 62 69 74 20 63 61 73 65 20 69 73 20  e 2-bit case is 
7f60: 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c  when.  ** the al
7f70: 6c 20 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74  l terms are of t
7f80: 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e  he form "table1.
7f90: 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f  column=table2.co
7fa0: 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20  lumn".  It.  ** 
7fb0: 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c  might be possibl
7fc0: 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20  e to form an IN 
7fd0: 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 65 69  operator with ei
7fe0: 74 68 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75  ther table1.colu
7ff0: 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65  mn.  ** or table
8000: 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20  2.column as the 
8010: 4c 48 53 20 69 66 20 65 69 74 68 65 72 20 69 73  LHS if either is
8020: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79   common to every
8030: 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68   term of.  ** th
8040: 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a  e OR clause..  *
8050: 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  *.  ** Note that
8060: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
8070: 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e  rm "table.column
8080: 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22  1=table.column2"
8090: 20 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20   (the.  ** same 
80a0: 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69  table on both si
80b0: 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d 29 20 63  zes of the ==) c
80c0: 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a  annot be optimiz
80d0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ed..  */.  if( c
80e0: 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69  hngToIN ){.    i
80f0: 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  nt okToChngToIN 
8100: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  = 0;     /* True
8110: 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69   if the conversi
8120: 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61 6c 69  on to IN is vali
8130: 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f  d */.    int iCo
8140: 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20  lumn = -1;      
8150: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64     /* Column ind
8160: 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20  ex on lhs of IN 
8170: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
8180: 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20 2d 31  int iCursor = -1
8190: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ;         /* Tab
81a0: 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e  le cursor common
81b0: 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f   to all terms */
81c0: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20  .    int j = 0; 
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
81e0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
81f0: 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  /..    /* Search
8200: 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61 6e 64   for a table and
8210: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70 70   column that app
8220: 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65  ears on one side
8230: 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   or the.    ** o
8240: 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f  ther of the == o
8250: 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65 72 79  perator in every
8260: 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61 74 20   subterm.  That 
8270: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
8280: 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  .    ** will be 
8290: 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43 75 72  recorded in iCur
82a0: 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e  sor and iColumn.
82b0: 20 20 54 68 65 72 65 20 6d 69 67 68 74 20 6e 6f    There might no
82c0: 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20  t be any.    ** 
82d0: 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64 20 63  such table and c
82e0: 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f  olumn.  Set okTo
82f0: 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20 61  ChngToIN if an a
8300: 70 70 72 6f 70 72 69 61 74 65 20 74 61 62 6c 65  ppropriate table
8310: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75  .    ** and colu
8320: 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20  mn is found but 
8330: 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f  leave okToChngTo
8340: 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20  IN false if not 
8350: 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  found..    */.  
8360: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26    for(j=0; j<2 &
8370: 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b  & !okToChngToIN;
8380: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72   j++){.      pOr
8390: 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b  Term = pOrWc->a;
83a0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72  .      for(i=pOr
83b0: 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d  Wc->nTerm-1; i>=
83c0: 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  0; i--, pOrTerm+
83d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
83e0: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  rt( pOrTerm->eOp
83f0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29  erator & WO_EQ )
8400: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
8410: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54  m->wtFlags &= ~T
8420: 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20  ERM_OR_OK;.     
8430: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
8440: 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
8450: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
8460: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
8470: 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64 20 77  2-bit case and w
8480: 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73 65 63  e are on the sec
8490: 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 61 6e  ond iteration an
84a0: 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  d.          ** c
84b0: 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20 66  urrent term is f
84c0: 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 69 74  rom the first it
84d0: 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69  eration.  So ski
84e0: 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a  p this term. */.
84f0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
8500: 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( j==1 );.      
8510: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
8520: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8530: 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20  if( (chngToIN & 
8540: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
8550: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65  >sMaskSet, pOrTe
8560: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 29  rm->leftCursor))
8570: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8580: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 6d 75   /* This term mu
8590: 73 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  st be of the for
85a0: 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65  m t1.a==t2.b whe
85b0: 72 65 20 74 32 20 69 73 20 69 6e 20 74 68 65 0a  re t2 is in the.
85c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68 6e            ** chn
85d0: 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20 74 31  gToIN set but t1
85e0: 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73 20 74   is not.  This t
85f0: 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69 74 68  erm will be eith
8600: 65 72 20 70 72 65 63 65 65 64 65 64 0a 20 20 20  er preceeded.   
8610: 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c         ** or fol
8620: 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76 65 72  lwed by an inver
8630: 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d  ted copy (t2.b==
8640: 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74 68 69  t1.a).  Skip thi
8650: 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20 20 20  s term .        
8660: 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69 74 73    ** and use its
8670: 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20   inversion. */. 
8680: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
8690: 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  e( pOrTerm->wtFl
86a0: 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45  ags & TERM_COPIE
86b0: 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  D );.          t
86c0: 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d  estcase( pOrTerm
86d0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
86e0: 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
86f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
8700: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
8710: 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45   (TERM_COPIED|TE
8720: 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a 20  RM_VIRTUAL) );. 
8730: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
8740: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
8750: 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70       iColumn = p
8760: 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  OrTerm->u.leftCo
8770: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 43  lumn;.        iC
8780: 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d  ursor = pOrTerm-
8790: 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20  >leftCursor;.   
87a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
87b0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c    }.      if( i<
87c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
87d0: 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74 61 62  No candidate tab
87e0: 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f  le+column was fo
87f0: 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e 20 6f  und.  This can o
8800: 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20 20 20  nly occur.      
8810: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f    ** on the seco
8820: 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a  nd iteration */.
8830: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8840: 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  j==1 );.        
8850: 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f  assert( IsPowerO
8860: 66 54 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29  fTwo(chngToIN) )
8870: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
8880: 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d  ( chngToIN==getM
8890: 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
88a0: 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72 29 20  skSet, iCursor) 
88b0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
88c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
88d0: 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31 20 29  testcase( j==1 )
88e0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68  ;..      /* We h
88f0: 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61 6e 64  ave found a cand
8900: 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e 64 20  idate table and 
8910: 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74  column.  Check t
8920: 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a 20 20  o see if that.  
8930: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64      ** table and
8940: 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f   column is commo
8950: 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  n to every term 
8960: 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  in the OR clause
8970: 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68   */.      okToCh
8980: 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20  ngToIN = 1;.    
8990: 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20    for(; i>=0 && 
89a0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d  okToChngToIN; i-
89b0: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
89c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
89d0: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
89e0: 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
89f0: 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
8a00: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43  ->leftCursor!=iC
8a10: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
8a20: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c     pOrTerm->wtFl
8a30: 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f  ags &= ~TERM_OR_
8a40: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OK;.        }els
8a50: 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75  e if( pOrTerm->u
8a60: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f  .leftColumn!=iCo
8a70: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
8a80: 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d    okToChngToIN =
8a90: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
8aa0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
8ab0: 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69 67   affLeft, affRig
8ac0: 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ht;.          /*
8ad0: 20 49 66 20 74 68 65 20 72 69 67 68 74 2d 68 61   If the right-ha
8ae0: 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f 20  nd side is also 
8af0: 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74  a column, then t
8b00: 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a 20 20  he affinities.  
8b10: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f          ** of bo
8b20: 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66  th right and lef
8b30: 74 20 73 69 64 65 73 20 6d 75 73 74 20 62 65 20  t sides must be 
8b40: 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70  such that no typ
8b50: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
8b60: 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72  onversions are r
8b70: 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72  equired on the r
8b80: 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23  ight.  (Ticket #
8b90: 32 32 34 39 29 0a 20 20 20 20 20 20 20 20 20 20  2249).          
8ba0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  */.          aff
8bb0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
8bc0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54  xprAffinity(pOrT
8bd0: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
8be0: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ht);.          a
8bf0: 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  ffLeft = sqlite3
8c00: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72  ExprAffinity(pOr
8c10: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  Term->pExpr->pLe
8c20: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ft);.          i
8c30: 66 28 20 61 66 66 52 69 67 68 74 21 3d 30 20 26  f( affRight!=0 &
8c40: 26 20 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c  & affRight!=affL
8c50: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eft ){.         
8c60: 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20     okToChngToIN 
8c70: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
8c80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
8c90: 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61    pOrTerm->wtFla
8ca0: 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b  gs |= TERM_OR_OK
8cb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8cc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8cd0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
8ce0: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54   this point, okT
8cf0: 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74 72 75  oChngToIN is tru
8d00: 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20 70 54  e if original pT
8d10: 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a 20 20  erm satisfies.  
8d20: 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20 49 6e    ** case 1.  In
8d30: 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f 6e 73   that case, cons
8d40: 74 72 75 63 74 20 61 20 6e 65 77 20 76 69 72 74  truct a new virt
8d50: 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20 69 73  ual term that is
8d60: 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d 20 63   .    ** pTerm c
8d70: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e  onverted into an
8d80: 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   IN operator..  
8d90: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54    */.    if( okT
8da0: 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20  oChngToIN ){.   
8db0: 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20 20     Expr *pDup;  
8dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
8dd0: 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69 63 61  ransient duplica
8de0: 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  te expression */
8df0: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
8e00: 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a  *pList = 0;   /*
8e10: 20 54 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   The RHS of the 
8e20: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
8e30: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
8e40: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54   = 0;       /* T
8e50: 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
8e60: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
8e70: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20     Expr *pNew;  
8e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
8e90: 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65   complete IN ope
8ea0: 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20  rator */..      
8eb0: 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65  for(i=pOrWc->nTe
8ec0: 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f  rm-1, pOrTerm=pO
8ed0: 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  rWc->a; i>=0; i-
8ee0: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
8ef0: 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54         if( (pOrT
8f00: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
8f10: 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20  ERM_OR_OK)==0 ) 
8f20: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
8f30: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
8f40: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
8f50: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
8f60: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
8f70: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
8f80: 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20  rsor );.        
8f90: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
8fa0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69  >u.leftColumn==i
8fb0: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20  Column );.      
8fc0: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
8fd0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 72 54  ExprDup(db, pOrT
8fe0: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
8ff0: 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
9000: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
9010: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 57  xprListAppend(pW
9020: 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4c  Info->pParse, pL
9030: 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  ist, pDup);.    
9040: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54      pLeft = pOrT
9050: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
9060: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
9070: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d   assert( pLeft!=
9080: 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20  0 );.      pDup 
9090: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
90a0: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a  (db, pLeft, 0);.
90b0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
90c0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
90d0: 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30  , TK_IN, pDup, 0
90e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
90f0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
9100: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
9110: 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e      transferJoin
9120: 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70  Markings(pNew, p
9130: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61  Expr);.        a
9140: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
9150: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
9160: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
9170: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
9180: 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  List = pList;.  
9190: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
91a0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
91b0: 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d  (pWC, pNew, TERM
91c0: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
91d0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20  NAMIC);.        
91e0: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
91f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 65  ==0 );.        e
9200: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
9210: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20   pWC, idxNew);. 
9220: 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
9230: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
9240: 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  .        pWC->a[
9250: 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20  idxNew].iParent 
9260: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
9270: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
9280: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
9290: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
92a0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
92b0: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
92c0: 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d     }.      pTerm
92d0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
92e0: 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20  _NOOP;  /* case 
92f0: 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32 20  1 trumps case 2 
9300: 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  */.    }.  }.}.#
9310: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
9320: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
9330: 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45  ATION && !SQLITE
9340: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
9350: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70  /../*.** The inp
9360: 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ut to this routi
9370: 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54 65  ne is an WhereTe
9380: 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69 74  rm structure wit
9390: 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70  h only the.** "p
93a0: 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c  Expr" field fill
93b0: 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20  ed in.  The job 
93c0: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
93d0: 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68  is to analyze th
93e0: 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69  e.** subexpressi
93f0: 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  on and populate 
9400: 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69  all the other fi
9410: 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65 72  elds of the Wher
9420: 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75  eTerm.** structu
9430: 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  re..**.** If the
9440: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
9450: 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70  f the form "<exp
9460: 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65  r> <op> X" it ge
9470: 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74  ts commuted.** t
9480: 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 66  o the standard f
9490: 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c  orm of "X <op> <
94a0: 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66  expr>"..**.** If
94b0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
94c0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
94d0: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
94e0: 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72 65  both X and Y are
94f0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  .** columns, the
9500: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65  n the original e
9510: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63  xpression is unc
9520: 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77  hanged and a new
9530: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d   virtual.** term
9540: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20   of the form "Y 
9550: 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65 64  <op> X" is added
9560: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
9570: 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c  ause and.** anal
9580: 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  yzed separately.
9590: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
95a0: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
95b0: 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a  th TERM_COPIED.*
95c0: 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65  * and the new te
95d0: 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74  rm is marked wit
95e0: 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28  h TERM_DYNAMIC (
95f0: 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45 78  because it's pEx
9600: 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62  pr.** needs to b
9610: 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68 65  e freed with the
9620: 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e   WhereClause) an
9630: 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28  d TERM_VIRTUAL (
9640: 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73  because it.** is
9650: 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79   a commuted copy
9660: 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d   of a prior term
9670: 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .)  The original
9680: 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64   term has nChild
9690: 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f  =1.** and the co
96a0: 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e 74  py has idxParent
96b0: 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
96c0: 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  x of the origina
96d0: 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69  l term..*/.stati
96e0: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
96f0: 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ze(.  SrcList *p
9700: 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Src,            
9710: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
9720: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
9730: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
9740: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
9750: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
9760: 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  dxTerm          
9770: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
9780: 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
9790: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20  analyzed */.){. 
97a0: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
97b0: 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  fo = pWC->pWInfo
97c0: 3b 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73  ; /* WHERE claus
97d0: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e  e processing con
97e0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  text */.  WhereT
97f0: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
9800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9810: 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  e term to be ana
9820: 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lyzed */.  Where
9830: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
9840: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  t;          /* S
9850: 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65  et of table inde
9860: 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70  x masks */.  Exp
9870: 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20  r *pExpr;       
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9890: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
98a0: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
98b0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
98c0: 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  eqLeft;         
98d0: 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65       /* Prereque
98e0: 73 69 74 65 73 20 6f 66 20 74 68 65 20 70 45 78  sites of the pEx
98f0: 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42  pr->pLeft */.  B
9900: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c  itmask prereqAll
9910: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9920: 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73  /* Prerequesites
9930: 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42   of pExpr */.  B
9940: 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68  itmask extraRigh
9950: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
9960: 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64 65  /* Extra depende
9970: 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f  ncies on LEFT JO
9980: 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53  IN */.  Expr *pS
9990: 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tr1 = 0;        
99a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20           /* RHS 
99b0: 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65  of LIKE/GLOB ope
99c0: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  rator */.  int i
99d0: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20  sComplete = 0;  
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
99f0: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
9a00: 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63 61  ends with wildca
9a10: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61  rd */.  int noCa
9a20: 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  se = 0;         
9a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45           /* LIKE
9a40: 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73  /GLOB distinguis
9a50: 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e  hes case */.  in
9a60: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9a80: 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72  * Top-level oper
9a90: 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70  ator.  pExpr->op
9aa0: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
9ab0: 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
9ac0: 61 72 73 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e  arse;  /* Parsin
9ad0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
9ae0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
9af0: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
9b00: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
9b10: 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28  ection */..  if(
9b20: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
9b30: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
9b40: 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26  .  }.  pTerm = &
9b50: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
9b60: 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70  .  pMaskSet = &p
9b70: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b  WInfo->sMaskSet;
9b80: 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d  .  pExpr = pTerm
9b90: 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ->pExpr;.  asser
9ba0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
9bb0: 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  _AS && pExpr->op
9bc0: 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a  !=TK_COLLATE );.
9bd0: 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65    prereqLeft = e
9be0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
9bf0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
9c00: 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45  Left);.  op = pE
9c10: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
9c20: 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  p==TK_IN ){.    
9c30: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
9c40: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
9c50: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
9c60: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
9c70: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
9c80: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
9c90: 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63  ight = exprSelec
9ca0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
9cb0: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  kSet, pExpr->x.p
9cc0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c  Select);.    }el
9cd0: 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  se{.      pTerm-
9ce0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
9cf0: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
9d00: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
9d10: 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
9d20: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f   }.  }else if( o
9d30: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
9d40: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
9d50: 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65  qRight = 0;.  }e
9d60: 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  lse{.    pTerm->
9d70: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78  prereqRight = ex
9d80: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
9d90: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52  skSet, pExpr->pR
9da0: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65  ight);.  }.  pre
9db0: 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62  reqAll = exprTab
9dc0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
9dd0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
9de0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9df0: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
9e00: 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  in) ){.    Bitma
9e10: 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70  sk x = getMask(p
9e20: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
9e30: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29  iRightJoinTable)
9e40: 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20  ;.    prereqAll 
9e50: 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52  |= x;.    extraR
9e60: 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20  ight = x-1;  /* 
9e70: 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  ON clause terms 
9e80: 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20  may not be used 
9e90: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20  with an index.  
9ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9eb0: 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20       ** on left 
9ec0: 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
9ed0: 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33  JOIN.  Ticket #3
9ee0: 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65  015 */.  }.  pTe
9ef0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
9f00: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65  prereqAll;.  pTe
9f10: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
9f20: 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50   -1;.  pTerm->iP
9f30: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54  arent = -1;.  pT
9f40: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
9f50: 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65   0;.  if( allowe
9f60: 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20 20 45  dOp(op) ){.    E
9f70: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c  xpr *pLeft = sql
9f80: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
9f90: 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ate(pExpr->pLeft
9fa0: 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  );.    Expr *pRi
9fb0: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
9fc0: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78  rSkipCollate(pEx
9fd0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
9fe0: 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28 70   u16 opMask = (p
9ff0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
a000: 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d  t & prereqLeft)=
a010: 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f  =0 ? WO_ALL : WO
a020: 5f 45 51 55 49 56 3b 0a 20 20 20 20 69 66 28 20  _EQUIV;.    if( 
a030: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pLeft->op==TK_CO
a040: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54  LUMN ){.      pT
a050: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
a060: 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
a070: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e  .      pTerm->u.
a080: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
a090: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
a0a0: 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
a0b0: 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61  tor = operatorMa
a0c0: 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b 3b  sk(op) & opMask;
a0d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
a0e0: 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74 2d  Right && pRight-
a0f0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
a100: 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
a110: 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45  m *pNew;.      E
a120: 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20  xpr *pDup;.     
a130: 20 75 31 36 20 65 45 78 74 72 61 4f 70 20 3d 20   u16 eExtraOp = 
a140: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74  0;        /* Ext
a150: 72 61 20 62 69 74 73 20 66 6f 72 20 70 4e 65 77  ra bits for pNew
a160: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ->eOperator */. 
a170: 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
a180: 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b  leftCursor>=0 ){
a190: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78  .        int idx
a1a0: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75  New;.        pDu
a1b0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
a1c0: 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29  up(db, pExpr, 0)
a1d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  ;.        if( db
a1e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
a1f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
a200: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
a210: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20  , pDup);.       
a220: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
a230: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78     }.        idx
a240: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
a250: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75  eInsert(pWC, pDu
a260: 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  p, TERM_VIRTUAL|
a270: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
a280: 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e 65         if( idxNe
a290: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  w==0 ) return;. 
a2a0: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70         pNew = &p
a2b0: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
a2c0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61         pNew->iPa
a2d0: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
a2e0: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
a2f0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
a300: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
a310: 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20  >nChild = 1;.   
a320: 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
a330: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49  ags |= TERM_COPI
a340: 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ED;.        if( 
a350: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
a360: 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78  .         && !Ex
a370: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
a380: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
a390: 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70  ).         && Op
a3a0: 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
a3b0: 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 54 72 61  d(db, SQLITE_Tra
a3c0: 6e 73 69 74 69 76 65 29 0a 20 20 20 20 20 20 20  nsitive).       
a3d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
a3e0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c  erm->eOperator |
a3f0: 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  = WO_EQUIV;.    
a400: 20 20 20 20 20 20 65 45 78 74 72 61 4f 70 20 3d        eExtraOp =
a410: 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20   WO_EQUIV;.     
a420: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
a430: 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  {.        pDup =
a440: 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
a450: 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pNew = pTerm;.  
a460: 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72      }.      expr
a470: 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20  Commute(pParse, 
a480: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65  pDup);.      pLe
a490: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
a4a0: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 75 70  SkipCollate(pDup
a4b0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
a4c0: 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72  pNew->leftCursor
a4d0: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
a4e0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
a4f0: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
a500: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
a510: 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 72     testcase( (pr
a520: 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61  ereqLeft | extra
a530: 52 69 67 68 74 29 20 21 3d 20 70 72 65 72 65 71  Right) != prereq
a540: 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70 4e  Left );.      pN
a550: 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  ew->prereqRight 
a560: 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65  = prereqLeft | e
a570: 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20 20  xtraRight;.     
a580: 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c   pNew->prereqAll
a590: 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20   = prereqAll;.  
a5a0: 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61      pNew->eOpera
a5b0: 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f 72 4d  tor = (operatorM
a5c0: 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b 20  ask(pDup->op) + 
a5d0: 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70 4d 61  eExtraOp) & opMa
a5e0: 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  sk;.    }.  }..#
a5f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a600: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d  IT_BETWEEN_OPTIM
a610: 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20  IZATION.  /* If 
a620: 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42 45  a term is the BE
a630: 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20  TWEEN operator, 
a640: 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76  create two new v
a650: 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a  irtual terms.  *
a660: 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74 68  * that define th
a670: 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68 65  e range that the
a680: 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65   BETWEEN impleme
a690: 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  nts.  For exampl
a6a0: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
a6b0: 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e    a BETWEEN b AN
a6c0: 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73  D c.  **.  ** is
a6d0: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a   converted into:
a6e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
a6f0: 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44  (a BETWEEN b AND
a700: 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41   c) AND (a>=b) A
a710: 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20  ND (a<=c).  **. 
a720: 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20   ** The two new 
a730: 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20  terms are added 
a740: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
a750: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
a760: 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65  object..  ** The
a770: 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 22   new terms are "
a780: 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65  dynamic" and are
a790: 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65   children of the
a7a0: 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45   original BETWEE
a7b0: 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68  N.  ** term.  Th
a7c0: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  at means that if
a7d0: 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 65 72   the BETWEEN ter
a7e0: 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20  m is coded, the 
a7f0: 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a  children are.  *
a800: 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20  * skipped.  Or, 
a810: 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20  if the children 
a820: 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62 79  are satisfied by
a830: 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f   an index, the o
a840: 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54  riginal.  ** BET
a850: 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69  WEEN term is ski
a860: 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
a870: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
a880: 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70  =TK_BETWEEN && p
a890: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
a8a0: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
a8b0: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
a8c0: 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  .pList;.    int 
a8d0: 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  i;.    static co
a8e0: 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b  nst u8 ops[] = {
a8f0: 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20  TK_GE, TK_LE};. 
a900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
a910: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
a920: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  t( pList->nExpr=
a930: 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  =2 );.    for(i=
a940: 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
a950: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
a960: 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64  pr;.      int id
a970: 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77  xNew;.      pNew
a980: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
a990: 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b  xpr(pParse, ops[
a9a0: 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  i], .           
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
a9d0: 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  (db, pExpr->pLef
a9e0: 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20  t, 0),.         
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa00: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
aa10: 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  up(db, pList->a[
aa20: 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29  i].pExpr, 0), 0)
aa30: 3b 0a 20 20 20 20 20 20 74 72 61 6e 73 66 65 72  ;.      transfer
aa40: 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65  JoinMarkings(pNe
aa50: 77 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20  wExpr, pExpr);. 
aa60: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
aa70: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
aa80: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54  pWC, pNewExpr, T
aa90: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
aaa0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
aab0: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
aac0: 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  w==0 );.      ex
aad0: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
aae0: 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20  pWC, idxNew);.  
aaf0: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
ab00: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
ab10: 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
ab20: 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  w].iParent = idx
ab30: 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Term;.    }.    
ab40: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
ab50: 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  2;.  }.#endif /*
ab60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54   SQLITE_OMIT_BET
ab70: 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  WEEN_OPTIMIZATIO
ab80: 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  N */..#if !defin
ab90: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ed(SQLITE_OMIT_O
aba0: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20  R_OPTIMIZATION) 
abb0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
abc0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
abd0: 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61  ).  /* Analyze a
abe0: 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 63 6f   term that is co
abf0: 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f 72  mposed of two or
ac00: 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73 20 63   more subterms c
ac10: 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 2a 2a  onnected by.  **
ac20: 20 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e   an OR operator.
ac30: 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28  .  */.  else if(
ac40: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f   pExpr->op==TK_O
ac50: 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  R ){.    assert(
ac60: 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44   pWC->op==TK_AND
ac70: 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c   );.    exprAnal
ac80: 79 7a 65 4f 72 54 65 72 6d 28 70 53 72 63 2c 20  yzeOrTerm(pSrc, 
ac90: 70 57 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20  pWC, idxTerm);. 
aca0: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
acb0: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d  >a[idxTerm];.  }
acc0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
acd0: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
ace0: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64  ZATION */..#ifnd
acf0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
ad00: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
ad10: 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72  .  /* Add constr
ad20: 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20  aints to reduce 
ad30: 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
ad40: 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c   on a LIKE or GL
ad50: 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  OB.  ** operator
ad60: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69  ..  **.  ** A li
ad70: 6b 65 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68  ke pattern of th
ad80: 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27  e form "x LIKE '
ad90: 61 62 63 25 27 22 20 69 73 20 63 68 61 6e 67 65  abc%'" is change
ada0: 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e  d into constrain
adb0: 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  ts.  **.  **    
adc0: 20 20 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41        x>='abc' A
add0: 4e 44 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78  ND x<'abd' AND x
ade0: 20 4c 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a   LIKE 'abc%'.  *
adf0: 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20  *.  ** The last 
ae00: 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
ae10: 20 70 72 65 66 69 78 20 22 61 62 63 22 20 69 73   prefix "abc" is
ae20: 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20   incremented to 
ae30: 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65  form the.  ** te
ae40: 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74  rmination condit
ae50: 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a  ion "abd"..  */.
ae60: 20 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54    if( pWC->op==T
ae70: 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20 69 73 4c  K_AND .   && isL
ae80: 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 65  ikeOrGlob(pParse
ae90: 2c 20 70 45 78 70 72 2c 20 26 70 53 74 72 31 2c  , pExpr, &pStr1,
aea0: 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e   &isComplete, &n
aeb0: 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20 20 20 20  oCase).  ){.    
aec0: 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20  Expr *pLeft;    
aed0: 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b     /* LHS of LIK
aee0: 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
aef0: 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74  */.    Expr *pSt
af00: 72 32 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  r2;       /* Cop
af10: 79 20 6f 66 20 70 53 74 72 31 20 2d 20 52 48 53  y of pStr1 - RHS
af20: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70   of LIKE/GLOB op
af30: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78  erator */.    Ex
af40: 70 72 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20  pr *pNewExpr1;. 
af50: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
af60: 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e  r2;.    int idxN
af70: 65 77 31 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  ew1;.    int idx
af80: 4e 65 77 32 3b 0a 20 20 20 20 54 6f 6b 65 6e 20  New2;.    Token 
af90: 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 2f  sCollSeqName;  /
afa0: 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74  * Name of collat
afb0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ing sequence */.
afc0: 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78  .    pLeft = pEx
afd0: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
afe0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74  ].pExpr;.    pSt
aff0: 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
b000: 44 75 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30  Dup(db, pStr1, 0
b010: 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  );.    if( !db->
b020: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
b030: 20 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b        u8 c, *pC;
b040: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63         /* Last c
b050: 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20  haracter before 
b060: 74 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 61  the first wildca
b070: 72 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d  rd */.      pC =
b080: 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e   (u8*)&pStr2->u.
b090: 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74  zToken[sqlite3St
b0a0: 72 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e  rlen30(pStr2->u.
b0b0: 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20  zToken)-1];.    
b0c0: 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20    c = *pC;.     
b0d0: 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20   if( noCase ){. 
b0e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
b0f0: 69 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d  int is to increm
b100: 65 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68 61  ent the last cha
b110: 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
b120: 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20  e first.        
b130: 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75  ** wildcard.  Bu
b140: 74 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e  t if we incremen
b150: 74 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c  t '@', that will
b160: 20 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68   push it into th
b170: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70  e.        ** alp
b180: 68 61 62 65 74 69 63 20 72 61 6e 67 65 20 77 68  habetic range wh
b190: 65 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73  ere case convers
b1a0: 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75  ions will mess u
b1b0: 70 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  p the .        *
b1c0: 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54  * inequality.  T
b1d0: 6f 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61  o avoid this, ma
b1e0: 6b 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20  ke sure to also 
b1f0: 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20  run the full.   
b200: 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20       ** LIKE on 
b210: 61 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78  all candidate ex
b220: 70 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65  pressions by cle
b230: 61 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70  aring the isComp
b240: 6c 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20  lete flag.      
b250: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
b260: 20 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f   c=='A'-1 ) isCo
b270: 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20  mplete = 0;.    
b280: 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55      c = sqlite3U
b290: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a  pperToLower[c];.
b2a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
b2b0: 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d  C = c + 1;.    }
b2c0: 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d  .    sCollSeqNam
b2d0: 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22  e.z = noCase ? "
b2e0: 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52  NOCASE" : "BINAR
b2f0: 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71  Y";.    sCollSeq
b300: 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20  Name.n = 6;.    
b310: 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69  pNewExpr1 = sqli
b320: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
b330: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e  Left, 0);.    pN
b340: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
b350: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
b360: 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20  K_GE, .         
b370: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64    sqlite3ExprAdd
b380: 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61  CollateToken(pPa
b390: 72 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73  rse,pNewExpr1,&s
b3a0: 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20  CollSeqName),.  
b3b0: 20 20 20 20 20 20 20 20 20 70 53 74 72 31 2c 20           pStr1, 
b3c0: 30 29 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72  0);.    transfer
b3d0: 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65  JoinMarkings(pNe
b3e0: 77 45 78 70 72 31 2c 20 70 45 78 70 72 29 3b 0a  wExpr1, pExpr);.
b3f0: 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68      idxNew1 = wh
b400: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
b410: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20  pWC, pNewExpr1, 
b420: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
b430: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
b440: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
b450: 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72  1==0 );.    expr
b460: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
b470: 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20  C, idxNew1);.   
b480: 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c   pNewExpr2 = sql
b490: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
b4a0: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70  pLeft, 0);.    p
b4b0: 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74  NewExpr2 = sqlit
b4c0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
b4d0: 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20  TK_LT,.         
b4e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64    sqlite3ExprAdd
b4f0: 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61  CollateToken(pPa
b500: 72 73 65 2c 70 4e 65 77 45 78 70 72 32 2c 26 73  rse,pNewExpr2,&s
b510: 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20  CollSeqName),.  
b520: 20 20 20 20 20 20 20 20 20 70 53 74 72 32 2c 20           pStr2, 
b530: 30 29 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72  0);.    transfer
b540: 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65  JoinMarkings(pNe
b550: 77 45 78 70 72 32 2c 20 70 45 78 70 72 29 3b 0a  wExpr2, pExpr);.
b560: 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68      idxNew2 = wh
b570: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
b580: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20  pWC, pNewExpr2, 
b590: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
b5a0: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
b5b0: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
b5c0: 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72  2==0 );.    expr
b5d0: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
b5e0: 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20  C, idxNew2);.   
b5f0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
b600: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69  [idxTerm];.    i
b610: 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b  f( isComplete ){
b620: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64  .      pWC->a[id
b630: 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d  xNew1].iParent =
b640: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
b650: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e  pWC->a[idxNew2].
b660: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
b670: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  m;.      pTerm->
b680: 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20  nChild = 2;.    
b690: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
b6a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
b6b0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
b6c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b6d0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
b6e0: 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57 4f  LE.  /* Add a WO
b6f0: 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72 79  _MATCH auxiliary
b700: 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e   term to the con
b710: 73 74 72 61 69 6e 74 20 73 65 74 20 69 66 20 74  straint set if t
b720: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
b730: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
b740: 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75   the form:  colu
b750: 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a 20  mn MATCH expr.. 
b760: 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61   ** This informa
b770: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
b780: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d  the xBestIndex m
b790: 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76  ethods of.  ** v
b7a0: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20  irtual tables.  
b7b0: 54 68 65 20 6e 61 74 69 76 65 20 71 75 65 72 79  The native query
b7c0: 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73 20   optimizer does 
b7d0: 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a  not attempt.  **
b7e0: 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20   to do anything 
b7f0: 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63 74  with MATCH funct
b800: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
b810: 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e   isMatchOfColumn
b820: 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69  (pExpr) ){.    i
b830: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 45  nt idxNew;.    E
b840: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c  xpr *pRight, *pL
b850: 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65  eft;.    WhereTe
b860: 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20  rm *pNewTerm;.  
b870: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
b880: 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78  Column, prereqEx
b890: 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74 20  pr;..    pRight 
b8a0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
b8b0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
b8c0: 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
b8d0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
b8e0: 45 78 70 72 3b 0a 20 20 20 20 70 72 65 72 65 71  Expr;.    prereq
b8f0: 45 78 70 72 20 3d 20 65 78 70 72 54 61 62 6c 65  Expr = exprTable
b900: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
b910: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70 72 65  pRight);.    pre
b920: 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72  reqColumn = expr
b930: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
b940: 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  Set, pLeft);.   
b950: 20 69 66 28 20 28 70 72 65 72 65 71 45 78 70 72   if( (prereqExpr
b960: 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29   & prereqColumn)
b970: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  ==0 ){.      Exp
b980: 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20  r *pNewExpr;.   
b990: 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71     pNewExpr = sq
b9a0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
b9b0: 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20  e, TK_MATCH, .  
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73              0, s
b9e0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
b9f0: 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20 30 29  , pRight, 0), 0)
ba00: 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d  ;.      idxNew =
ba10: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
ba20: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
ba30: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
ba40: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
ba50: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
ba60: 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  xNew==0 );.     
ba70: 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43   pNewTerm = &pWC
ba80: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
ba90: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65     pNewTerm->pre
baa0: 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65  reqRight = prere
bab0: 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  qExpr;.      pNe
bac0: 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  wTerm->leftCurso
bad0: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
bae0: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  e;.      pNewTer
baf0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  m->u.leftColumn 
bb00: 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
bb10: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
bb20: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
bb30: 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70 4e  _MATCH;.      pN
bb40: 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20  ewTerm->iParent 
bb50: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
bb60: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
bb70: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
bb80: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
bb90: 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   1;.      pTerm-
bba0: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
bbb0: 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70  _COPIED;.      p
bbc0: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  NewTerm->prereqA
bbd0: 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  ll = pTerm->prer
bbe0: 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  eqAll;.    }.  }
bbf0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
bc00: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
bc10: 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  BLE */..#ifdef S
bc20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
bc30: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 2f 2a  T3_OR_STAT4.  /*
bc40: 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61   When sqlite_sta
bc50: 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  t3 histogram dat
bc60: 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61  a is available a
bc70: 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68  n operator of th
bc80: 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49  e.  ** form "x I
bc90: 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20  S NOT NULL" can 
bca0: 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61  sometimes be eva
bcb0: 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69  luated more effi
bcc0: 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20  ciently.  ** as 
bcd0: 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73  "x>NULL" if x is
bce0: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
bcf0: 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f  PRIMARY KEY.  So
bd00: 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a   construct a.  *
bd10: 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f  * virtual term o
bd20: 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a  f that form..  *
bd30: 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  *.  ** Note that
bd40: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 65 72   the virtual ter
bd50: 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67 65 64  m must be tagged
bd60: 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c   with TERM_VNULL
bd70: 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52  .  This.  ** TER
bd80: 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c  M_VNULL tag will
bd90: 20 73 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f   suppress the no
bda0: 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20  t-null check at 
bdb0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  the beginning.  
bdc0: 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  ** of the loop. 
bdd0: 20 57 69 74 68 6f 75 74 20 74 68 65 20 54 45 52   Without the TER
bde0: 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68  M_VNULL flag, th
bdf0: 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b  e not-null check
be00: 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61   at.  ** the sta
be10: 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77  rt of the loop w
be20: 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20  ill prevent any 
be30: 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69  results from bei
be40: 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a  ng returned..  *
be50: 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  /.  if( pExpr->o
be60: 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20  p==TK_NOTNULL.  
be70: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   && pExpr->pLeft
be80: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
be90: 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65     && pExpr->pLe
bea0: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20  ft->iColumn>=0. 
beb0: 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
bec0: 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
bed0: 49 54 45 5f 53 74 61 74 33 29 0a 20 20 29 7b 0a  ITE_Stat3).  ){.
bee0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
bef0: 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  pr;.    Expr *pL
bf00: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
bf10: 66 74 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e  ft;.    int idxN
bf20: 65 77 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  ew;.    WhereTer
bf30: 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20  m *pNewTerm;..  
bf40: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
bf50: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
bf60: 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20  , TK_GT,.       
bf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf80: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
bf90: 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30  Dup(db, pLeft, 0
bfa0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
bfc0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
bfd0: 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20  se, TK_NULL, 0, 
bfe0: 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20  0, 0), 0);..    
bff0: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
c000: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
c010: 70 4e 65 77 45 78 70 72 2c 0a 20 20 20 20 20 20  pNewExpr,.      
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 20 20 20 20 20 54 45 52 4d 5f 56 49 52          TERM_VIR
c040: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
c050: 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20  C|TERM_VNULL);. 
c060: 20 20 20 69 66 28 20 69 64 78 4e 65 77 20 29 7b     if( idxNew ){
c070: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20  .      pNewTerm 
c080: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
c090: 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  ];.      pNewTer
c0a0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
c0b0: 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   0;.      pNewTe
c0c0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
c0d0: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
c0e0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
c0f0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
c100: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
c110: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65       pNewTerm->e
c120: 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54  Operator = WO_GT
c130: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c140: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ->iParent = idxT
c150: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
c160: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
c170: 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  rm];.      pTerm
c180: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
c190: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
c1a0: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
c1b0: 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  D;.      pNewTer
c1c0: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
c1d0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b  Term->prereqAll;
c1e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
c1f0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
c200: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
c210: 34 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65  4 */..  /* Preve
c220: 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72  nt ON clause ter
c230: 6d 73 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  ms of a LEFT JOI
c240: 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65  N from being use
c250: 64 20 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20  d to drive.  ** 
c260: 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62  an index for tab
c270: 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
c280: 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a  of the join..  *
c290: 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  /.  pTerm->prere
c2a0: 71 52 69 67 68 74 20 7c 3d 20 65 78 74 72 61 52  qRight |= extraR
c2b0: 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ight;.}../*.** T
c2c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61  his function sea
c2d0: 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20  rches pList for 
c2e0: 61 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74  a entry that mat
c2f0: 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d 74 68  ches the iCol-th
c300: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e   column.** of in
c310: 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20  dex pIdx..**.** 
c320: 49 66 20 73 75 63 68 20 61 6e 20 65 78 70 72 65  If such an expre
c330: 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20  ssion is found, 
c340: 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  its index in pLi
c350: 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72  st->a[] is retur
c360: 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78  ned. If.** no ex
c370: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e  pression is foun
c380: 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  d, -1 is returne
c390: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
c3a0: 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20   findIndexCol(. 
c3b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3d0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
c3e0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
c3f0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
c400: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
c410: 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61  sion list to sea
c420: 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61  rch */.  int iBa
c430: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
c440: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
c450: 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73  or for table ass
c460: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64  ociated with pId
c470: 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  x */.  Index *pI
c480: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
c490: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
c4a0: 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20  to match column 
c4b0: 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  of */.  int iCol
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
c4e0: 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61  n of index to ma
c4f0: 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tch */.){.  int 
c500: 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
c510: 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61  *zColl = pIdx->a
c520: 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20  zColl[iCol];..  
c530: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
c540: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
c550: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
c560: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
c570: 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ate(pList->a[i].
c580: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
c590: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
c5a0: 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c  .     && p->iCol
c5b0: 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn==pIdx->aiCol
c5c0: 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26  umn[iCol].     &
c5d0: 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61  & p->iTable==iBa
c5e0: 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  se.    ){.      
c5f0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
c600: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
c610: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73  Seq(pParse, pLis
c620: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
c630: 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
c640: 28 70 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71  (pColl) && 0==sq
c650: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
c660: 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c  ll->zName, zColl
c670: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
c680: 75 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20  urn i;.      }. 
c690: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
c6a0: 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
c6b0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
c6c0: 68 65 20 44 49 53 54 49 4e 43 54 20 65 78 70 72  he DISTINCT expr
c6d0: 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73  ession-list pass
c6e0: 65 64 20 61 73 20 74 68 65 20 74 68 69 72 64 20  ed as the third 
c6f0: 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72  argument.** is r
c700: 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20  edundant..**.** 
c710: 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20  A DISTINCT list 
c720: 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69 66 20  is redundant if 
c730: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
c740: 74 61 69 6e 73 20 73 6f 6d 65 20 73 75 62 73 65  tains some subse
c750: 74 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  t of.** columns 
c760: 74 68 61 74 20 61 72 65 20 75 6e 69 71 75 65 20  that are unique 
c770: 61 6e 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f  and non-null..*/
c780: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 44 69  .static int isDi
c790: 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28  stinctRedundant(
c7a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c7b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
c7c0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
c7d0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
c7e0: 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  abList,        /
c7f0: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
c800: 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
c810: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
c820: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
c830: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
c840: 73 74 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20  st *pDistinct   
c850: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
c860: 74 20 73 65 74 20 74 68 61 74 20 6e 65 65 64 73  t set that needs
c870: 20 74 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20   to be DISTINCT 
c880: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
c890: 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
c8a0: 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  dx;.  int i;    
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61        .  int iBa
c8d0: 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  se;..  /* If the
c8e0: 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  re is more than 
c8f0: 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62  one table or sub
c900: 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46  -select in the F
c910: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20  ROM clause of.  
c920: 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c 20 74  ** this query, t
c930: 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  hen it will not 
c940: 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73  be possible to s
c950: 68 6f 77 20 74 68 61 74 20 74 68 65 20 44 49 53  how that the DIS
c960: 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75  TINCT .  ** clau
c970: 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  se is redundant.
c980: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69   */.  if( pTabLi
c990: 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  st->nSrc!=1 ) re
c9a0: 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20  turn 0;.  iBase 
c9b0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  = pTabList->a[0]
c9c0: 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62  .iCursor;.  pTab
c9d0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30   = pTabList->a[0
c9e0: 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66  ].pTab;..  /* If
c9f0: 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72   any of the expr
ca00: 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50  essions is an IP
ca10: 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c  K column on tabl
ca20: 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65  e iBase, then re
ca30: 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e  turn .  ** true.
ca40: 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69   Note: The (p->i
ca50: 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61  Table==iBase) pa
ca60: 72 74 20 6f 66 20 74 68 69 73 20 74 65 73 74 20  rt of this test 
ca70: 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69 66 20  may be false if 
ca80: 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
ca90: 20 53 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72   SELECT is a cor
caa0: 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72  related sub-quer
cab0: 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
cac0: 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e  0; i<pDistinct->
cad0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
cae0: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
caf0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
cb00: 65 28 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69  e(pDistinct->a[i
cb10: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
cb20: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
cb30: 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d  MN && p->iTable=
cb40: 3d 69 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f  =iBase && p->iCo
cb50: 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20  lumn<0 ) return 
cb60: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f  1;.  }..  /* Loo
cb70: 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e  p through all in
cb80: 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62  dices on the tab
cb90: 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63  le, checking eac
cba0: 68 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d  h to see if it m
cbb0: 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49  akes.  ** the DI
cbc0: 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
cbd0: 20 72 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64   redundant. It d
cbe0: 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a  oes so if:.  **.
cbf0: 20 20 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e    **   1. The in
cc00: 64 65 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e  dex is itself UN
cc10: 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20  IQUE, and.  **. 
cc20: 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20   **   2. All of 
cc30: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  the columns in t
cc40: 68 65 20 69 6e 64 65 78 20 61 72 65 20 65 69 74  he index are eit
cc50: 68 65 72 20 70 61 72 74 20 6f 66 20 74 68 65 20  her part of the 
cc60: 70 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20  pDistinct.  **  
cc70: 20 20 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73      list, or els
cc80: 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
cc90: 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65  se contains a te
cca0: 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rm of the form "
ccb0: 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20  col=X",.  **    
ccc0: 20 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63    where X is a c
ccd0: 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54  onstant value. T
cce0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
ccf0: 75 65 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20  uences of the.  
cd00: 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73  **      comparis
cd10: 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69  on and select-li
cd20: 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d  st expressions m
cd30: 75 73 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20  ust match those 
cd40: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  of the index..  
cd50: 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c  **.  **   3. All
cd60: 20 6f 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20   of those index 
cd70: 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63  columns for whic
cd80: 68 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  h the WHERE clau
cd90: 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a  se does not.  **
cda0: 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20        contain a 
cdb0: 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65  "col=X" term are
cdc0: 20 73 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f   subject to a NO
cdd0: 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  T NULL constrain
cde0: 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49  t..  */.  for(pI
cdf0: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
ce00: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
ce10: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
ce20: 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
ce30: 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69  =OE_None ) conti
ce40: 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  nue;.    for(i=0
ce50: 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; i<pIdx->nKeyCo
ce60: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
ce70: 31 36 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  16 iCol = pIdx->
ce80: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
ce90: 20 20 20 69 66 28 20 30 3d 3d 66 69 6e 64 54 65     if( 0==findTe
cea0: 72 6d 28 70 57 43 2c 20 69 42 61 73 65 2c 20 69  rm(pWC, iBase, i
ceb0: 43 6f 6c 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30  Col, ~(Bitmask)0
cec0: 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 20 29  , WO_EQ, pIdx) )
ced0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 49  {.        int iI
cee0: 64 78 43 6f 6c 20 3d 20 66 69 6e 64 49 6e 64 65  dxCol = findInde
cef0: 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69  xCol(pParse, pDi
cf00: 73 74 69 6e 63 74 2c 20 69 42 61 73 65 2c 20 70  stinct, iBase, p
cf10: 49 64 78 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  Idx, i);.       
cf20: 20 69 66 28 20 69 49 64 78 43 6f 6c 3c 30 20 7c   if( iIdxCol<0 |
cf30: 7c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  | pTab->aCol[iCo
cf40: 6c 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b  l].notNull==0 ){
cf50: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
cf60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
cf70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
cf80: 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  ( i==pIdx->nKeyC
cf90: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ol ){.      /* T
cfa0: 68 69 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65  his index implie
cfb0: 73 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49  s that the DISTI
cfc0: 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 69 73  NCT qualifier is
cfd0: 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20   redundant. */. 
cfe0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
cff0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
d000: 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
d010: 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 67  Estimate the log
d020: 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e  arithm of the in
d030: 70 75 74 20 76 61 6c 75 65 20 74 6f 20 62 61 73  put value to bas
d040: 65 20 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  e 2..*/.static L
d050: 6f 67 45 73 74 20 65 73 74 4c 6f 67 28 4c 6f 67  ogEst estLog(Log
d060: 45 73 74 20 4e 29 7b 0a 20 20 4c 6f 67 45 73 74  Est N){.  LogEst
d070: 20 78 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45   x = sqlite3LogE
d080: 73 74 28 4e 29 3b 0a 20 20 72 65 74 75 72 6e 20  st(N);.  return 
d090: 78 3e 33 33 20 3f 20 78 20 2d 20 33 33 20 3a 20  x>33 ? x - 33 : 
d0a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20  0;.}../*.** Two 
d0b0: 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69  routines for pri
d0c0: 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  nting the conten
d0d0: 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f  t of an sqlite3_
d0e0: 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74  index_info.** st
d0f0: 72 75 63 74 75 72 65 2e 20 20 55 73 65 64 20 66  ructure.  Used f
d100: 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
d110: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20  ebugging only.  
d120: 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51  If neither.** SQ
d130: 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c  LITE_TEST or SQL
d140: 49 54 45 5f 44 45 42 55 47 20 61 72 65 20 64 65  ITE_DEBUG are de
d150: 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73  fined, then thes
d160: 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72  e routines.** ar
d170: 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66  e no-ops..*/.#if
d180: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d190: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
d1a0: 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 57  LE) && defined(W
d1b0: 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
d1c0: 44 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54  D).static void T
d1d0: 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
d1e0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
d1f0: 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  fo *p){.  int i;
d200: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57  .  if( !sqlite3W
d210: 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75  hereTrace ) retu
d220: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
d230: 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
d240: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
d250: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
d260: 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a   constraint[%d]:
d270: 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25   col=%d termid=%
d280: 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d  d op=%d usabled=
d290: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
d2a0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
d2b0: 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d  traint[i].iColum
d2c0: 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  n,.       p->aCo
d2d0: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72  nstraint[i].iTer
d2e0: 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20  mOffset,.       
d2f0: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
d300: 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e  ].op,.       p->
d310: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75  aConstraint[i].u
d320: 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f  sable);.  }.  fo
d330: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64  r(i=0; i<p->nOrd
d340: 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
d350: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
d360: 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64  tf("  orderby[%d
d370: 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25  ]: col=%d desc=%
d380: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
d390: 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72         p->aOrder
d3a0: 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20  By[i].iColumn,. 
d3b0: 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42        p->aOrderB
d3c0: 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a  y[i].desc);.  }.
d3d0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52  }.static void TR
d3e0: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
d3f0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
d400: 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  fo *p){.  int i;
d410: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57  .  if( !sqlite3W
d420: 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75  hereTrace ) retu
d430: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
d440: 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
d450: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
d460: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
d470: 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76   usage[%d]: argv
d480: 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e  Idx=%d omit=%d\n
d490: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
d4a0: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
d4b0: 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49  ntUsage[i].argvI
d4c0: 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e  ndex,.       p->
d4d0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
d4e0: 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20  [i].omit);.  }. 
d4f0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d500: 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64  ntf("  idxNum=%d
d510: 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b  \n", p->idxNum);
d520: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
d530: 72 69 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d  rintf("  idxStr=
d540: 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72  %s\n", p->idxStr
d550: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
d560: 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72  gPrintf("  order
d570: 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22  ByConsumed=%d\n"
d580: 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  , p->orderByCons
d590: 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  umed);.  sqlite3
d5a0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65  DebugPrintf("  e
d5b0: 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c  stimatedCost=%g\
d5c0: 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64  n", p->estimated
d5d0: 43 6f 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cost);.  sqlite3
d5e0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65  DebugPrintf("  e
d5f0: 73 74 69 6d 61 74 65 64 52 6f 77 73 3d 25 6c 6c  stimatedRows=%ll
d600: 64 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74  d\n", p->estimat
d610: 65 64 52 6f 77 73 29 3b 0a 7d 0a 23 65 6c 73 65  edRows);.}.#else
d620: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
d630: 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65  DX_INPUTS(A).#de
d640: 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f  fine TRACE_IDX_O
d650: 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66  UTPUTS(A).#endif
d660: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d670: 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
d680: 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75  INDEX./*.** Retu
d690: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 57  rn TRUE if the W
d6a0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
d6b0: 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66   pTerm is of a f
d6c0: 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20  orm where it.** 
d6d0: 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 77 69  could be used wi
d6e0: 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61  th an index to a
d6f0: 63 63 65 73 73 20 70 53 72 63 2c 20 61 73 73 75  ccess pSrc, assu
d700: 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69  ming an appropri
d710: 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69  ate.** index exi
d720: 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sted..*/.static 
d730: 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65  int termCanDrive
d740: 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 54 65  Index(.  WhereTe
d750: 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20  rm *pTerm,      
d760: 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
d770: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
d780: 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63  check */.  struc
d790: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
d7a0: 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62  pSrc,     /* Tab
d7b0: 6c 65 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  le we are trying
d7c0: 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20   to access */.  
d7d0: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d7f0: 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65  * Tables in oute
d800: 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a  r loops of the j
d810: 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  oin */.){.  char
d820: 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72   aff;.  if( pTer
d830: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70  m->leftCursor!=p
d840: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72  Src->iCursor ) r
d850: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
d860: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
d870: 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20 72   & WO_EQ)==0 ) r
d880: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
d890: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
d8a0: 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d  ht & notReady)!=
d8b0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
d8c0: 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  if( pTerm->u.lef
d8d0: 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  tColumn<0 ) retu
d8e0: 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53  rn 0;.  aff = pS
d8f0: 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  rc->pTab->aCol[p
d900: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
d910: 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
d920: 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
d930: 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72  xAffinityOk(pTer
d940: 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29  m->pExpr, aff) )
d950: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
d960: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
d970: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d980: 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
d990: 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  INDEX./*.** Gene
d9a0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e  rate code to con
d9b0: 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78  struct the Index
d9c0: 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61   object for an a
d9d0: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a  utomatic index.*
d9e0: 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20  * and to set up 
d9f0: 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f  the WhereLevel o
da00: 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20  bject pLevel so 
da10: 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 67 65  that the code ge
da20: 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73  nerator.** makes
da30: 20 75 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f   use of the auto
da40: 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a  matic index..*/.
da50: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73  static void cons
da60: 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e  tructAutomaticIn
da70: 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
da80: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
da90: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
daa0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
dab0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
dac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
dad0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
dae0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
daf0: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
db00: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
db10: 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74  se term to get t
db20: 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f  he next index */
db30: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
db40: 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ady,           /
db50: 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
db60: 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
db70: 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68  vailable */.  Wh
db80: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
db90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
dba0: 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72  te new index her
dbb0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b  e */.){.  int nK
dbc0: 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  eyCol;          
dbd0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
dbe0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
dbf0: 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
dc00: 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  dex */.  WhereTe
dc10: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
dc20: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
dc30: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
dc40: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
dc50: 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64  hereTerm *pWCEnd
dc60: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  ;          /* En
dc70: 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f  d of pWC->a[] */
dc80: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dca0: 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62  * Object describ
dcb0: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ing the transien
dcc0: 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62  t index */.  Vdb
dcd0: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
dce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70           /* Prep
dcf0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75  ared statement u
dd00: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
dd10: 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49  n */.  int addrI
dd20: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
dd30: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
dd40: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
dd50: 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20  ion bypass jump 
dd60: 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
dd70: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
dd80: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65   /* The table be
dd90: 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20  ing indexed */. 
dda0: 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ddc0: 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78  Top of the index
ddd0: 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20   fill loop */.  
dde0: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20  int regRecord;  
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
de00: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
de10: 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  an index record 
de20: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de40: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74   /* Column count
de50: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  er */.  int i;  
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
de80: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42  ter */.  int mxB
de90: 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  itCol;          
dea0: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
deb0: 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e  column in pSrc->
dec0: 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c  colUsed */.  Col
ded0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
dee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
def0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
df00: 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f  o on a column */
df10: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
df20: 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oop;           /
df30: 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65 63  * The Loop objec
df40: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 6f  t */.  char *zNo
df50: 74 55 73 65 64 3b 20 20 20 20 20 20 20 20 20 20  tUsed;          
df60: 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63     /* Extra spac
df70: 65 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20  e on the end of 
df80: 70 49 64 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73  pIdx */.  Bitmas
df90: 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20  k idxCols;      
dfa0: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20        /* Bitmap 
dfb0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20  of columns used 
dfc0: 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a  for indexing */.
dfd0: 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43    Bitmask extraC
dfe0: 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ols;          /*
dff0: 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74   Bitmap of addit
e000: 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f  ional columns */
e010: 0a 20 20 75 38 20 73 65 6e 74 57 61 72 6e 69 6e  .  u8 sentWarnin
e020: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  g = 0;         /
e030: 2a 20 54 72 75 65 20 69 66 20 61 20 77 61 72 6e  * True if a warn
e040: 6e 69 6e 67 20 68 61 73 20 62 65 65 6e 20 69 73  ning has been is
e050: 73 75 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65  sued */..  /* Ge
e060: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73  nerate code to s
e070: 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63 72 65  kip over the cre
e080: 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61  ation and initia
e090: 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  lization of the.
e0a0: 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69    ** transient i
e0b0: 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20  ndex on 2nd and 
e0c0: 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61  subsequent itera
e0d0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f  tions of the loo
e0e0: 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72  p. */.  v = pPar
e0f0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
e100: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61  ert( v!=0 );.  a
e110: 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  ddrInit = sqlite
e120: 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
e130: 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  );..  /* Count t
e140: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
e150: 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
e160: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  e added to the i
e170: 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73  ndex.  ** and us
e180: 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52  ed to match WHER
e190: 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
e1a0: 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f  ints */.  nKeyCo
e1b0: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20  l = 0;.  pTable 
e1c0: 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
e1d0: 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61  pWCEnd = &pWC->a
e1e0: 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  [pWC->nTerm];.  
e1f0: 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
e200: 70 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c  pWLoop;.  idxCol
e210: 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65  s = 0;.  for(pTe
e220: 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  rm=pWC->a; pTerm
e230: 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  <pWCEnd; pTerm++
e240: 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43  ){.    if( termC
e250: 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
e260: 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  rm, pSrc, notRea
e270: 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  dy) ){.      int
e280: 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75   iCol = pTerm->u
e290: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
e2a0: 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b     Bitmask cMask
e2b0: 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d   = iCol>=BMS ? M
e2c0: 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20  ASKBIT(BMS-1) : 
e2d0: 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20  MASKBIT(iCol);. 
e2e0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
e2f0: 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
e300: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
e310: 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
e320: 20 69 66 28 20 21 73 65 6e 74 57 61 72 6e 69 6e   if( !sentWarnin
e330: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
e340: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
e350: 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45  WARNING_AUTOINDE
e360: 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  X,.            "
e370: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
e380: 6f 6e 20 25 73 28 25 73 29 22 2c 20 70 54 61 62  on %s(%s)", pTab
e390: 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  le->zName,.     
e3a0: 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61         pTable->a
e3b0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
e3c0: 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 74 57 61  ;.        sentWa
e3d0: 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  rning = 1;.     
e3e0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69 64   }.      if( (id
e3f0: 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
e400: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
e410: 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
e420: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f  (pParse->db, pLo
e430: 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29  op, nKeyCol+1) )
e440: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
e450: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e   pLoop->aLTerm[n
e460: 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72  KeyCol++] = pTer
e470: 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f  m;.        idxCo
e480: 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20  ls |= cMask;.   
e490: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
e4a0: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c   assert( nKeyCol
e4b0: 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75  >0 );.  pLoop->u
e4c0: 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f  .btree.nEq = pLo
e4d0: 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65  op->nLTerm = nKe
e4e0: 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77  yCol;.  pLoop->w
e4f0: 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
e500: 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45  OLUMN_EQ | WHERE
e510: 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
e520: 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20  E_INDEXED.      
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
e540: 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
e550: 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  X;..  /* Count t
e560: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64  he number of add
e570: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
e580: 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65  needed to create
e590: 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67   a.  ** covering
e5a0: 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65   index.  A "cove
e5b0: 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61  ring index" is a
e5c0: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  n index that con
e5d0: 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63  tains all.  ** c
e5e0: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20  olumns that are 
e5f0: 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75  needed by the qu
e600: 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76  ery.  With a cov
e610: 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65  ering index, the
e620: 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
e630: 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73  able never needs
e640: 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e   to be accessed.
e650: 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69    Automatic indi
e660: 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ces must.  ** be
e670: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
e680: 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e  x because the in
e690: 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  dex will not be 
e6a0: 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20  updated if the. 
e6b0: 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
e6c0: 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74  le changes and t
e6d0: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
e6e0: 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62  le cannot both b
e6f0: 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74  e used.  ** if t
e700: 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79  hey go out of sy
e710: 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61  nc..  */.  extra
e720: 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  Cols = pSrc->col
e730: 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73  Used & (~idxCols
e740: 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   | MASKBIT(BMS-1
e750: 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d  ));.  mxBitCol =
e760: 20 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e   (pTable->nCol >
e770: 3d 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31  = BMS-1) ? BMS-1
e780: 20 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   : pTable->nCol;
e790: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
e7a0: 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31  ble->nCol==BMS-1
e7b0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
e7c0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d  pTable->nCol==BM
e7d0: 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  S-2 );.  for(i=0
e7e0: 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b  ; i<mxBitCol; i+
e7f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72  +){.    if( extr
e800: 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28  aCols & MASKBIT(
e810: 69 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a  i) ) nKeyCol++;.
e820: 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
e830: 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49  colUsed & MASKBI
e840: 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20  T(BMS-1) ){.    
e850: 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c  nKeyCol += pTabl
e860: 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20  e->nCol - BMS + 
e870: 31 3b 0a 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e  1;.  }.  pLoop->
e880: 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
e890: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45  _COLUMN_EQ | WHE
e8a0: 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20  RE_IDX_ONLY;..  
e8b0: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  /* Construct the
e8c0: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f   Index object to
e8d0: 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20 69   describe this i
e8e0: 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d  ndex */.  pIdx =
e8f0: 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65   sqlite3Allocate
e900: 49 6e 64 65 78 4f 62 6a 65 63 74 28 70 50 61 72  IndexObject(pPar
e910: 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b  se->db, nKeyCol+
e920: 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29  1, 0, &zNotUsed)
e930: 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20  ;.  if( pIdx==0 
e940: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 6f  ) return;.  pLoo
e950: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
e960: 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78  x = pIdx;.  pIdx
e970: 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d  ->zName = "auto-
e980: 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e  index";.  pIdx->
e990: 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  pTable = pTable;
e9a0: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43  .  n = 0;.  idxC
e9b0: 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  ols = 0;.  for(p
e9c0: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65  Term=pWC->a; pTe
e9d0: 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
e9e0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72  ++){.    if( ter
e9f0: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
ea00: 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52  Term, pSrc, notR
ea10: 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69  eady) ){.      i
ea20: 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d  nt iCol = pTerm-
ea30: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
ea40: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61       Bitmask cMa
ea50: 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f  sk = iCol>=BMS ?
ea60: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
ea70: 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b  : MASKBIT(iCol);
ea80: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ea90: 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a   iCol==BMS-1 );.
eaa0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
eab0: 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  iCol==BMS );.   
eac0: 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20     if( (idxCols 
ead0: 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  & cMask)==0 ){. 
eae0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20         Expr *pX 
eaf0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
eb00: 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20          idxCols 
eb10: 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20  |= cMask;.      
eb20: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
eb30: 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  [n] = pTerm->u.l
eb40: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
eb50: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
eb60: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
eb70: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
eb80: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
eb90: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70  ight);.        p
eba0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
ebb0: 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f   ALWAYS(pColl) ?
ebc0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20   pColl->zName : 
ebd0: 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
ebe0: 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    n++;.      }. 
ebf0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
ec00: 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70  t( (u32)n==pLoop
ec10: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b  ->u.btree.nEq );
ec20: 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74  ..  /* Add addit
ec30: 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65  ional columns ne
ec40: 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  eded to make the
ec50: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
ec60: 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76   into.  ** a cov
ec70: 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  ering index */. 
ec80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69   for(i=0; i<mxBi
ec90: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
eca0: 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20  if( extraCols & 
ecb0: 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20 20  MASKBIT(i) ){.  
ecc0: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
ecd0: 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[n] = i;.     
ece0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
ecf0: 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20   = "BINARY";.   
ed00: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
ed10: 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f  }.  if( pSrc->co
ed20: 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28  lUsed & MASKBIT(
ed30: 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f  BMS-1) ){.    fo
ed40: 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61  r(i=BMS-1; i<pTa
ed50: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  ble->nCol; i++){
ed60: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43  .      pIdx->aiC
ed70: 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20  olumn[n] = i;.  
ed80: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
ed90: 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  [n] = "BINARY";.
eda0: 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d        n++;.    }
edb0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
edc0: 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70  ==nKeyCol );.  p
edd0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
ede0: 20 3d 20 2d 31 3b 0a 20 20 70 49 64 78 2d 3e 61   = -1;.  pIdx->a
edf0: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41  zColl[n] = "BINA
ee00: 52 59 22 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  RY";..  /* Creat
ee10: 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
ee20: 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72  index */.  asser
ee30: 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  t( pLevel->iIdxC
ee40: 75 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65  ur>=0 );.  pLeve
ee50: 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61  l->iIdxCur = pPa
ee60: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
ee70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ee80: 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69  (v, OP_OpenAutoi
ee90: 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  ndex, pLevel->iI
eea0: 64 78 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31  dxCur, nKeyCol+1
eeb0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
eec0: 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
eed0: 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 56 64  rse, pIdx);.  Vd
eee0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
eef0: 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e  or %s", pTable->
ef00: 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46  zName));..  /* F
ef10: 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ill the automati
ef20: 63 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e  c index with con
ef30: 74 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f  tent */.  addrTo
ef40: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
ef50: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
ef60: 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  nd, pLevel->iTab
ef70: 43 75 72 29 3b 0a 20 20 72 65 67 52 65 63 6f 72  Cur);.  regRecor
ef80: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
ef90: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
efa0: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
efb0: 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
efc0: 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69   pIdx, pLevel->i
efd0: 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72  TabCur, regRecor
efe0: 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d, 0, 0, 0, 0);.
eff0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f000: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
f010: 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert, pLevel->iId
f020: 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29  xCur, regRecord)
f030: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
f040: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
f050: 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
f060: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
f070: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
f080: 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
f090: 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20  r, addrTop+1);. 
f0a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
f0b0: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53  geP5(v, SQLITE_S
f0c0: 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e  TMTSTATUS_AUTOIN
f0d0: 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  DEX);.  sqlite3V
f0e0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
f0f0: 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74  ddrTop);.  sqlit
f100: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
f110: 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
f120: 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d  rd);.  .  /* Jum
f130: 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70  p here when skip
f140: 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
f150: 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  ization */.  sql
f160: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
f170: 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 7d  (v, addrInit);.}
f180: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
f190: 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
f1a0: 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64  _INDEX */..#ifnd
f1b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
f1c0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
f1d0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70  * Allocate and p
f1e0: 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74  opulate an sqlit
f1f0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
f200: 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 74  ructure. It is t
f210: 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  he .** responsib
f220: 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
f230: 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
f240: 79 20 72 65 6c 65 61 73 65 20 74 68 65 20 73 74  y release the st
f250: 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61  ructure.** by pa
f260: 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65  ssing the pointe
f270: 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
f280: 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73  is function to s
f290: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
f2a0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
f2b0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c  _index_info *all
f2c0: 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a  ocateIndexInfo(.
f2d0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
f2e0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
f2f0: 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53 72  pWC,.  struct Sr
f300: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
f310: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ,.  ExprList *pO
f320: 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20  rderBy.){.  int 
f330: 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72  i, j;.  int nTer
f340: 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  m;.  struct sqli
f350: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
f360: 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
f370: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
f380: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a  _index_orderby *
f390: 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73  pIdxOrderBy;.  s
f3a0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
f3b0: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
f3c0: 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20  sage *pUsage;.  
f3d0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
f3e0: 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  ;.  int nOrderBy
f3f0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
f400: 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
f410: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
f420: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73  e number of poss
f430: 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73  ible WHERE claus
f440: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65  e constraints re
f450: 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  ferring.  ** to 
f460: 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62  this virtual tab
f470: 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54  le */.  for(i=nT
f480: 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  erm=0, pTerm=pWC
f490: 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
f4a0: 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
f4b0: 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
f4c0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
f4d0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
f4e0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
f4f0: 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
f500: 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  o(pTerm->eOperat
f510: 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20  or & ~WO_EQUIV) 
f520: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
f530: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
f540: 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
f550: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
f560: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
f570: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69  _ISNULL );.    i
f580: 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
f590: 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c  tor & (WO_ISNULL
f5a0: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
f5b0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
f5c0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
f5d0: 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  L ) continue;.  
f5e0: 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a    nTerm++;.  }..
f5f0: 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45    /* If the ORDE
f600: 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74  R BY clause cont
f610: 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e  ains only column
f620: 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s in the current
f630: 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74   .  ** virtual t
f640: 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61  able then alloca
f650: 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
f660: 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f   aOrderBy part o
f670: 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74  f.  ** the sqlit
f680: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
f690: 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20  ructure..  */.  
f6a0: 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  nOrderBy = 0;.  
f6b0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
f6c0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64      int n = pOrd
f6d0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
f6e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
f6f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
f700: 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
f710: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
f720: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
f730: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
f740: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d   pExpr->iTable!=
f750: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
f760: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
f770: 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20   if( i==n){.    
f780: 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a    nOrderBy = n;.
f790: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
f7a0: 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c  Allocate the sql
f7b0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
f7c0: 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20  structure.  */. 
f7d0: 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69   pIdxInfo = sqli
f7e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
f7f0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
f800: 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20  of(*pIdxInfo).  
f810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f820: 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65           + (size
f830: 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20  of(*pIdxCons) + 
f840: 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29  sizeof(*pUsage))
f850: 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20  *nTerm.         
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f870: 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78    + sizeof(*pIdx
f880: 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42  OrderBy)*nOrderB
f890: 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  y );.  if( pIdxI
f8a0: 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  nfo==0 ){.    sq
f8b0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
f8c0: 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65  arse, "out of me
f8d0: 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74 75  mory");.    retu
f8e0: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
f8f0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
f900: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73  tructure.  The s
f910: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
f920: 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  o structure cont
f930: 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66  ains.  ** many f
f940: 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64  ields that are d
f950: 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20  eclared "const" 
f960: 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74  to prevent xBest
f970: 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20  Index from.  ** 
f980: 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20  changing them.  
f990: 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f  We have to do so
f9a0: 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67  me funky casting
f9b0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a   in order to.  *
f9c0: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f  * initialize tho
f9d0: 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a  se fields..  */.
f9e0: 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74    pIdxCons = (st
f9f0: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
fa00: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26  ex_constraint*)&
fa10: 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70  pIdxInfo[1];.  p
fa20: 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74  IdxOrderBy = (st
fa30: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
fa40: 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64  ex_orderby*)&pId
fa50: 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20  xCons[nTerm];.  
fa60: 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74  pUsage = (struct
fa70: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
fa80: 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
fa90: 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f  )&pIdxOrderBy[nO
faa0: 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74  rderBy];.  *(int
fab0: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  *)&pIdxInfo->nCo
fac0: 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d  nstraint = nTerm
fad0: 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
fae0: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
faf0: 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73   nOrderBy;.  *(s
fb00: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
fb10: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
fb20: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
fb30: 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f  straint = pIdxCo
fb40: 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  ns;.  *(struct s
fb50: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
fb60: 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f  erby**)&pIdxInfo
fb70: 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64  ->aOrderBy = pId
fb80: 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74  xOrderBy;.  *(st
fb90: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
fba0: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
fbb0: 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  age**)&pIdxInfo-
fbc0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
fbd0: 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e =.            
fbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbf0: 20 20 20 20 20 20 20 20 20 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 70 55 73 61 67 65 3b 0a 0a         pUsage;..
fc20: 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65    for(i=j=0, pTe
fc30: 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
fc40: 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
fc50: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f  erm++){.    u8 o
fc60: 70 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  p;.    if( pTerm
fc70: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
fc80: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
fc90: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
fca0: 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
fcb0: 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  wo(pTerm->eOpera
fcc0: 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29  tor & ~WO_EQUIV)
fcd0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
fce0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
fcf0: 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
fd00: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
fd10: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
fd20: 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
fd30: 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
fd40: 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c  ator & (WO_ISNUL
fd50: 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
fd60: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
fd70: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
fd80: 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
fd90: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
fda0: 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e  Column = pTerm->
fdb0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
fdc0: 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54    pIdxCons[j].iT
fdd0: 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20  ermOffset = i;. 
fde0: 20 20 20 6f 70 20 3d 20 28 75 38 29 70 54 65 72     op = (u8)pTer
fdf0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
fe00: 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f  O_ALL;.    if( o
fe10: 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20  p==WO_IN ) op = 
fe20: 57 4f 5f 45 51 3b 0a 20 20 20 20 70 49 64 78 43  WO_EQ;.    pIdxC
fe30: 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a  ons[j].op = op;.
fe40: 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63      /* The direc
fe50: 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20  t assignment in 
fe60: 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e  the previous lin
fe70: 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e  e is possible on
fe80: 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a  ly because.    *
fe90: 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51  * the WO_ and SQ
fea0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
feb0: 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65  RAINT_ codes are
fec0: 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65   identical.  The
fed0: 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  .    ** followin
fee0: 67 20 61 73 73 65 72 74 73 20 76 65 72 69 66 79  g asserts verify
fef0: 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20   this fact. */. 
ff00: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51     assert( WO_EQ
ff10: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
ff20: 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a  ONSTRAINT_EQ );.
ff30: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c      assert( WO_L
ff40: 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  T==SQLITE_INDEX_
ff50: 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b  CONSTRAINT_LT );
ff60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
ff70: 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  LE==SQLITE_INDEX
ff80: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29  _CONSTRAINT_LE )
ff90: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
ffa0: 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _GT==SQLITE_INDE
ffb0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20  X_CONSTRAINT_GT 
ffc0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
ffd0: 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_GE==SQLITE_IND
ffe0: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45  EX_CONSTRAINT_GE
fff0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
10000 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45  WO_MATCH==SQLITE
10010 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
10020 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 61  T_MATCH );.    a
10030 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f  ssert( pTerm->eO
10040 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e  perator & (WO_IN
10050 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f  |WO_EQ|WO_LT|WO_
10060 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57  LE|WO_GT|WO_GE|W
10070 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20  O_MATCH) );.    
10080 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  j++;.  }.  for(i
10090 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
100a0 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
100b0 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  pExpr = pOrderBy
100c0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
100d0 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d    pIdxOrderBy[i]
100e0 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72  .iColumn = pExpr
100f0 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  ->iColumn;.    p
10100 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65  IdxOrderBy[i].de
10110 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  sc = pOrderBy->a
10120 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
10130 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64   }..  return pId
10140 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xInfo;.}../*.** 
10150 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74  The table object
10160 20 72 65 66 65 72 65 6e 63 65 20 70 61 73 73 65   reference passe
10170 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
10180 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
10190 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73   function.** mus
101a0 74 20 72 65 70 72 65 73 65 6e 74 20 61 20 76 69  t represent a vi
101b0 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69  rtual table. Thi
101c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b  s function invok
101d0 65 73 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  es the xBestInde
101e0 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66  x().** method of
101f0 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
10200 6c 65 20 77 69 74 68 20 74 68 65 20 73 71 6c 69  le with the sqli
10210 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 6f  te3_index_info o
10220 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f  bject that.** co
10230 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20 33 72  mes in as the 3r
10240 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
10250 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
10260 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
10270 63 63 75 72 73 2c 20 70 50 61 72 73 65 20 69 73  ccurs, pParse is
10280 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
10290 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
102a0 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65   and a.** non-ze
102b0 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  ro value is retu
102c0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
102d0 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 61   0 is returned a
102e0 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  nd the output.**
102f0 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c   part of the sql
10300 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
10310 73 74 72 75 63 74 75 72 65 20 69 73 20 6c 65 66  structure is lef
10320 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a  t populated..**.
10330 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
10340 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  t an error is re
10350 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68  turned, it is th
10360 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
10370 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   of the.** calle
10380 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
10390 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69  free p->idxStr i
103a0 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  f p->needToFreeI
103b0 64 78 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a  dxStr indicates.
103c0 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ** that this is 
103d0 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61  required..*/.sta
103e0 74 69 63 20 69 6e 74 20 76 74 61 62 42 65 73 74  tic int vtabBest
103f0 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
10400 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
10410 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  , sqlite3_index_
10420 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69  info *p){.  sqli
10430 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20  te3_vtab *pVtab 
10440 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  = sqlite3GetVTab
10450 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  le(pParse->db, p
10460 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69  Tab)->pVtab;.  i
10470 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
10480 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  .  TRACE_IDX_INP
10490 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70  UTS(p);.  rc = p
104a0 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78  Vtab->pModule->x
104b0 42 65 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c  BestIndex(pVtab,
104c0 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58   p);.  TRACE_IDX
104d0 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20  _OUTPUTS(p);..  
104e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
104f0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
10500 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
10510 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
10520 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
10530 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
10540 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d  f( !pVtab->zErrM
10550 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  sg ){.      sqli
10560 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
10570 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  se, "%s", sqlite
10580 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20  3ErrStr(rc));.  
10590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
105a0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
105b0 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74  Parse, "%s", pVt
105c0 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
105d0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
105e0 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45  3_free(pVtab->zE
105f0 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d  rrMsg);.  pVtab-
10600 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20  >zErrMsg = 0;.. 
10610 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
10620 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
10630 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43  {.    if( !p->aC
10640 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
10650 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74  ble && p->aConst
10660 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
10670 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20  gvIndex>0 ){.   
10680 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
10690 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
106a0 20 20 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a        "table %s:
106b0 20 78 42 65 73 74 49 6e 64 65 78 20 72 65 74 75   xBestIndex retu
106c0 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20  rned an invalid 
106d0 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  plan", pTab->zNa
106e0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  me);.    }.  }..
106f0 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
10700 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66 20  >nErr;.}.#endif 
10710 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
10720 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
10730 41 42 4c 45 29 20 2a 2f 0a 0a 0a 23 69 66 64 65  ABLE) */...#ifde
10740 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10750 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
10760 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
10770 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20  e location of a 
10780 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20 61  particular key a
10790 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e  mong all keys in
107a0 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53   an.** index.  S
107b0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
107c0 20 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f 6c   in aStat as fol
107d0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61  lows:.**.**    a
107e0 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73 74  Stat[0]      Est
107f0 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  . number of rows
10800 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61 6c 0a   less than pVal.
10810 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 20  **    aStat[1]  
10820 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20      Est. number 
10830 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74 6f  of rows equal to
10840 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75   pVal.**.** Retu
10850 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
10860 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  success..*/.stat
10870 69 63 20 76 6f 69 64 20 77 68 65 72 65 4b 65 79  ic void whereKey
10880 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a  Stats(.  Parse *
10890 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
108a0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
108b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
108c0 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
108d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
108e0 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65  Index to conside
108f0 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20  r domain of */. 
10900 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
10910 2a 70 52 65 63 2c 20 20 20 20 20 20 20 2f 2a 20  *pRec,       /* 
10920 56 65 63 74 6f 72 20 6f 66 20 76 61 6c 75 65 73  Vector of values
10930 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a   to consider */.
10940 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20    int roundUp,  
10950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10960 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75   Round up if tru
10970 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69  e.  Round down i
10980 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f  f false */.  tRo
10990 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20  wcnt *aStat     
109a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
109b0 20 73 74 61 74 73 20 77 72 69 74 74 65 6e 20 68   stats written h
109c0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ere */.){.  Inde
109d0 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65  xSample *aSample
109e0 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65   = pIdx->aSample
109f0 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20  ;.  int iCol;   
10a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a10 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 65 71 75  /* Index of requ
10a20 69 72 65 64 20 73 74 61 74 73 20 69 6e 20 61 6e  ired stats in an
10a30 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69  Eq[] etc. */.  i
10a40 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20 20  nt iMin = 0;    
10a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d             /* Sm
10a60 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e 6f  allest sample no
10a70 74 20 79 65 74 20 74 65 73 74 65 64 20 2a 2f 0a  t yet tested */.
10a80 20 20 69 6e 74 20 69 20 3d 20 70 49 64 78 2d 3e    int i = pIdx->
10a90 6e 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 2f 2a  nSample;      /*
10aa0 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65   Smallest sample
10ab0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6f 72 20   larger than or 
10ac0 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f  equal to pRec */
10ad0 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20 20  .  int iTest;   
10ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10af0 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74 6f  * Next sample to
10b00 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72   test */.  int r
10b10 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
10b20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
10b30 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f   of comparison o
10b40 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66  peration */..#if
10b50 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  ndef SQLITE_DEBU
10b60 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  G.  UNUSED_PARAM
10b70 45 54 45 52 28 20 70 50 61 72 73 65 20 29 3b 0a  ETER( pParse );.
10b80 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
10b90 20 70 52 65 63 21 3d 30 20 29 3b 0a 20 20 69 43   pRec!=0 );.  iC
10ba0 6f 6c 20 3d 20 70 52 65 63 2d 3e 6e 46 69 65 6c  ol = pRec->nFiel
10bb0 64 20 2d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  d - 1;.  assert(
10bc0 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30   pIdx->nSample>0
10bd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
10be0 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20 26 26 20  ec->nField>0 && 
10bf0 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 53 61 6d 70  iCol<pIdx->nSamp
10c00 6c 65 43 6f 6c 20 29 3b 0a 20 20 64 6f 7b 0a 20  leCol );.  do{. 
10c10 20 20 20 69 54 65 73 74 20 3d 20 28 69 4d 69 6e     iTest = (iMin
10c20 2b 69 29 2f 32 3b 0a 20 20 20 20 72 65 73 20 3d  +i)/2;.    res =
10c30 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
10c40 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
10c50 65 5b 69 54 65 73 74 5d 2e 6e 2c 20 61 53 61 6d  e[iTest].n, aSam
10c60 70 6c 65 5b 69 54 65 73 74 5d 2e 70 2c 20 70 52  ple[iTest].p, pR
10c70 65 63 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  ec);.    if( res
10c80 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 4d 69 6e  <0 ){.      iMin
10c90 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20   = iTest+1;.    
10ca0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 20 3d  }else{.      i =
10cb0 20 69 54 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20   iTest;.    }.  
10cc0 7d 77 68 69 6c 65 28 20 72 65 73 20 26 26 20 69  }while( res && i
10cd0 4d 69 6e 3c 69 20 29 3b 0a 0a 23 69 66 64 65 66  Min<i );..#ifdef
10ce0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
10cf0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
10d00 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
10d10 74 73 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ts check that th
10d20 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  e binary search 
10d30 63 6f 64 65 0a 20 20 2a 2a 20 61 62 6f 76 65 20  code.  ** above 
10d40 66 6f 75 6e 64 20 74 68 65 20 72 69 67 68 74 20  found the right 
10d50 61 6e 73 77 65 72 2e 20 54 68 69 73 20 62 6c 6f  answer. This blo
10d60 63 6b 20 73 65 72 76 65 73 20 6e 6f 20 70 75 72  ck serves no pur
10d70 70 6f 73 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20  pose other.  ** 
10d80 74 68 61 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74  than to invoke t
10d90 68 65 20 61 73 73 65 72 74 73 2e 20 20 2a 2f 0a  he asserts.  */.
10da0 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
10db0 20 20 20 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d      /* If (res==
10dc0 30 29 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  0) is true, then
10dd0 20 73 61 6d 70 6c 65 20 24 69 20 6d 75 73 74 20   sample $i must 
10de0 62 65 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63  be equal to pRec
10df0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
10e00 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  i<pIdx->nSample 
10e10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  );.    assert( 0
10e20 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  ==sqlite3VdbeRec
10e30 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
10e40 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  le[i].n, aSample
10e50 5b 69 5d 2e 70 2c 20 70 52 65 63 29 0a 20 20 20  [i].p, pRec).   
10e60 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
10e70 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
10e80 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
10e90 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
10ea0 70 52 65 63 20 6d 75 73 74 20 62 65 20 73 6d 61  pRec must be sma
10eb0 6c 6c 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65  ller than sample
10ec0 20 24 69 20 61 6e 64 20 6c 61 72 67 65 72 20 74   $i and larger t
10ed0 68 61 6e 0a 20 20 20 20 2a 2a 20 73 61 6d 70 6c  han.    ** sampl
10ee0 65 20 28 24 69 2d 31 29 2e 20 20 2a 2f 0a 20 20  e ($i-1).  */.  
10ef0 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 64    assert( i==pId
10f00 78 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20  x->nSample .    
10f10 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
10f20 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
10f30 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61  (aSample[i].n, a
10f40 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65  Sample[i].p, pRe
10f50 63 29 3e 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  c)>0.         ||
10f60 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
10f70 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
10f80 20 61 73 73 65 72 74 28 20 69 3d 3d 30 0a 20 20   assert( i==0.  
10f90 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
10fa0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
10fb0 72 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e  re(aSample[i-1].
10fc0 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e  n, aSample[i-1].
10fd0 70 2c 20 70 52 65 63 29 3c 30 0a 20 20 20 20 20  p, pRec)<0.     
10fe0 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64      || pParse->d
10ff0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11000 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
11010 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45   ifdef SQLITE_DE
11020 42 55 47 20 2a 2f 0a 0a 20 20 2f 2a 20 41 74 20  BUG */..  /* At 
11030 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 53 61 6d  this point, aSam
11040 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66 69  ple[i] is the fi
11050 72 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 20  rst sample that 
11060 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  is greater than.
11070 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20 74 6f    ** or equal to
11080 20 70 56 61 6c 2e 20 20 4f 72 20 69 66 20 69 3d   pVal.  Or if i=
11090 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20  =pIdx->nSample, 
110a0 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73  then all samples
110b0 20 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a 20 74   are less.  ** t
110c0 68 61 6e 20 70 56 61 6c 2e 20 20 49 66 20 61 53  han pVal.  If aS
110d0 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c 2c 20  ample[i]==pVal, 
110e0 74 68 65 6e 20 72 65 73 3d 3d 30 2e 0a 20 20 2a  then res==0..  *
110f0 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29  /.  if( res==0 )
11100 7b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d  {.    aStat[0] =
11110 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74   aSample[i].anLt
11120 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61  [iCol];.    aSta
11130 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[1] = aSample[i
11140 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anEq[iCol];.  
11150 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f 77 63  }else{.    tRowc
11160 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70 70 65  nt iLower, iUppe
11170 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66 28  r, iGap;.    if(
11180 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69   i==0 ){.      i
11190 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  Lower = 0;.     
111a0 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c   iUpper = aSampl
111b0 65 5b 30 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b  e[0].anLt[iCol];
111c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
111d0 20 20 69 55 70 70 65 72 20 3d 20 69 3e 3d 70 49    iUpper = i>=pI
111e0 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20 70 49  dx->nSample ? pI
111f0 64 78 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20  dx->aiRowEst[0] 
11200 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c  : aSample[i].anL
11210 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69  t[iCol];.      i
11220 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b  Lower = aSample[
11230 69 2d 31 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 20  i-1].anEq[iCol] 
11240 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 61  + aSample[i-1].a
11250 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d  nLt[iCol];.    }
11260 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
11270 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 69  (pIdx->nKeyCol>i
11280 43 6f 6c 20 3f 20 70 49 64 78 2d 3e 61 41 76 67  Col ? pIdx->aAvg
11290 45 71 5b 69 43 6f 6c 5d 20 3a 20 31 29 3b 0a 20  Eq[iCol] : 1);. 
112a0 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69     if( iLower>=i
112b0 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69  Upper ){.      i
112c0 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Gap = 0;.    }el
112d0 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d  se{.      iGap =
112e0 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72   iUpper - iLower
112f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11300 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20  roundUp ){.     
11310 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29   iGap = (iGap*2)
11320 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /3;.    }else{. 
11330 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61 70       iGap = iGap
11340 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53  /3;.    }.    aS
11350 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20  tat[0] = iLower 
11360 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 7d 0a 23 65  + iGap;.  }.}.#e
11370 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
11380 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
11390 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  TAT4 */../*.** T
113a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
113b0 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65  used to estimate
113c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
113d0 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
113e0 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73   visited.** by s
113f0 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78  canning an index
11400 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20   for a range of 
11410 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67  values. The rang
11420 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70  e may have an up
11430 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20  per.** bound, a 
11440 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20  lower bound, or 
11450 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45 20  both. The WHERE 
11460 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61  clause terms tha
11470 74 20 73 65 74 20 74 68 65 20 75 70 70 65 72 0a  t set the upper.
11480 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75  ** and lower bou
11490 6e 64 73 20 61 72 65 20 72 65 70 72 65 73 65 6e  nds are represen
114a0 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e  ted by pLower an
114b0 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74  d pUpper respect
114c0 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78  ively. For.** ex
114d0 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20  ample, assuming 
114e0 74 68 61 74 20 69 6e 64 65 78 20 70 20 69 73 20  that index p is 
114f0 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20  on t1(a):.**.** 
11500 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
11510 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20  ERE a > ? AND a 
11520 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  < ? ....**      
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f                |_
11540 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a  ____|   |_____|.
11550 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11560 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
11570 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
11580 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77              pLow
11590 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a  er    pUpper.**.
115a0 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  ** If either of 
115b0 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77  the upper or low
115c0 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20  er bound is not 
115d0 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55  present, then NU
115e0 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a  LL is passed in.
115f0 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20  ** place of the 
11600 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68  corresponding Wh
11610 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54  ereTerm..**.** T
11620 68 65 20 76 61 6c 75 65 20 69 6e 20 28 70 42 75  he value in (pBu
11630 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
11640 74 72 65 65 2e 6e 45 71 29 20 69 73 20 74 68 65  tree.nEq) is the
11650 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 69 6e   index of the in
11660 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75  dex.** column su
11670 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72 61 6e  bject to the ran
11680 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f  ge constraint. O
11690 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c  r, equivalently,
116a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
116b0 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  * equality const
116c0 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64  raints optimized
116d0 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64   by the proposed
116e0 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72   index scan. For
116f0 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73   example,.** ass
11700 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73  uming index p is
11710 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e   on t1(a, b), an
11720 64 20 74 68 65 20 53 51 4c 20 71 75 65 72 79 20  d the SQL query 
11730 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
11740 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
11750 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e  = ? AND b > ? AN
11760 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a  D b < ? ....**.*
11770 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65  * then nEq is se
11780 74 20 74 6f 20 31 20 28 61 73 20 74 68 65 20 72  t to 1 (as the r
11790 61 6e 67 65 20 72 65 73 74 72 69 63 74 65 64 20  ange restricted 
117a0 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68  column, b, is th
117b0 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66  e second .** lef
117c0 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
117d0 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c   the index). Or,
117e0 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
117f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
11800 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20  OM t1 WHERE a > 
11810 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a  ? AND a < ? ....
11820 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69  **.** then nEq i
11830 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  s set to 0..**.*
11840 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
11850 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
11860 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f  *pnOut is set to
11870 20 74 68 65 20 73 71 6c 69 74 65 33 4c 6f 67 45   the sqlite3LogE
11880 73 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e  st() of the.** n
11890 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
118a0 61 74 20 74 68 65 20 69 6e 64 65 78 20 73 63 61  at the index sca
118b0 6e 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f  n is expected to
118c0 20 76 69 73 69 74 20 77 69 74 68 6f 75 74 20 0a   visit without .
118d0 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74  ** considering t
118e0 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  he range constra
118f0 69 6e 74 73 2e 20 49 66 20 6e 45 71 20 69 73 20  ints. If nEq is 
11900 30 2c 20 74 68 69 73 20 69 73 20 74 68 65 20 6e  0, this is the n
11910 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 72 6f 77  umber of .** row
11920 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20  s in the index. 
11930 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f  Assuming no erro
11940 72 20 6f 63 63 75 72 73 2c 20 2a 70 6e 4f 75 74  r occurs, *pnOut
11950 20 69 73 20 61 64 6a 75 73 74 65 64 20 28 72 65   is adjusted (re
11960 64 75 63 65 64 29 0a 2a 2a 20 74 6f 20 61 63 63  duced).** to acc
11970 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 72 61 6e  ount for the ran
11980 67 65 20 63 6f 6e 74 72 61 69 6e 74 73 20 70 4c  ge contraints pL
11990 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 2e  ower and pUpper.
119a0 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61  .** .** In the a
119b0 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65  bsence of sqlite
119c0 5f 73 74 61 74 34 20 41 4e 41 4c 59 5a 45 20 64  _stat4 ANALYZE d
119d0 61 74 61 2c 20 6f 72 20 69 66 20 73 75 63 68 20  ata, or if such 
119e0 64 61 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  data cannot be.*
119f0 2a 20 75 73 65 64 2c 20 65 61 63 68 20 72 61 6e  * used, each ran
11a00 67 65 20 69 6e 65 71 75 61 6c 69 74 79 20 72 65  ge inequality re
11a10 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68  duces the search
11a20 20 73 70 61 63 65 20 62 79 20 61 20 66 61 63 74   space by a fact
11a30 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 48 65 6e  or of 4. .** Hen
11a40 63 65 20 61 20 70 61 69 72 20 6f 66 20 63 6f 6e  ce a pair of con
11a50 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e  straints (x>? AN
11a60 44 20 78 3c 3f 29 20 72 65 64 75 63 65 73 20 74  D x<?) reduces t
11a70 68 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d 62  he expected numb
11a80 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76 69  er of.** rows vi
11a90 73 69 74 65 64 20 62 79 20 61 20 66 61 63 74 6f  sited by a facto
11aa0 72 20 6f 66 20 31 36 2e 0a 2a 2f 0a 73 74 61 74  r of 16..*/.stat
11ab0 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67  ic int whereRang
11ac0 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  eScanEst(.  Pars
11ad0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11ae0 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
11af0 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
11b00 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
11b10 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
11b20 69 6c 64 65 72 2c 0a 20 20 57 68 65 72 65 54 65  ilder,.  WhereTe
11b30 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a  rm *pLower,   /*
11b40 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Lower bound on 
11b50 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
11b60 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20  x>123" Might be 
11b70 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54  NULL */.  WhereT
11b80 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f  erm *pUpper,   /
11b90 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e  * Upper bound on
11ba0 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
11bb0 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65  "x<455" Might be
11bc0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
11bd0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20 20 20  Loop *pLoop     
11be0 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 2e 6e  /* Modify the .n
11bf0 4f 75 74 20 61 6e 64 20 6d 61 79 62 65 20 2e 72  Out and maybe .r
11c00 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b  Run fields */.){
11c10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11c20 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75  TE_OK;.  int nOu
11c30 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b  t = pLoop->nOut;
11c40 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77 3b 0a  .  LogEst nNew;.
11c50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
11c60 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
11c70 54 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70 20  TAT4.  Index *p 
11c80 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
11c90 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e  .pIndex;.  int n
11ca0 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Eq = pLoop->u.bt
11cb0 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28 20  ree.nEq;..  if( 
11cc0 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 0a 20 20 20  p->nSample>0.   
11cd0 26 26 20 6e 45 71 3d 3d 70 42 75 69 6c 64 65 72  && nEq==pBuilder
11ce0 2d 3e 6e 52 65 63 56 61 6c 69 64 0a 20 20 20 26  ->nRecValid.   &
11cf0 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65  & nEq<p->nSample
11d00 43 6f 6c 0a 20 20 20 26 26 20 4f 70 74 69 6d 69  Col.   && Optimi
11d10 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50  zationEnabled(pP
11d20 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45  arse->db, SQLITE
11d30 5f 53 74 61 74 33 29 20 0a 20 20 29 7b 0a 20 20  _Stat3) .  ){.  
11d40 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
11d50 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65   *pRec = pBuilde
11d60 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20 74 52 6f  r->pRec;.    tRo
11d70 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20 75  wcnt a[2];.    u
11d80 38 20 61 66 66 3b 0a 0a 20 20 20 20 2f 2a 20 56  8 aff;..    /* V
11d90 61 72 69 61 62 6c 65 20 69 4c 6f 77 65 72 20 77  ariable iLower w
11da0 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68  ill be set to th
11db0 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  e estimate of th
11dc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
11dd0 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   in .    ** the 
11de0 69 6e 64 65 78 20 74 68 61 74 20 61 72 65 20 6c  index that are l
11df0 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77  ess than the low
11e00 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20  er bound of the 
11e10 72 61 6e 67 65 20 71 75 65 72 79 2e 20 54 68 65  range query. The
11e20 0a 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f  .    ** lower bo
11e30 75 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f  und being the co
11e40 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24  ncatenation of $
11e50 50 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20  P and $L, where 
11e60 24 50 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  $P is the.    **
11e70 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f 72 6d   key-prefix form
11e80 65 64 20 62 79 20 74 68 65 20 6e 45 71 20 76 61  ed by the nEq va
11e90 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61 67 61  lues matched aga
11ea0 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c 65 66  inst the nEq lef
11eb0 74 2d 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 63 6f  t-most.    ** co
11ec0 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
11ed0 65 78 2c 20 61 6e 64 20 24 4c 20 69 73 20 74 68  ex, and $L is th
11ee0 65 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f 77 65  e value in pLowe
11ef0 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r..    **.    **
11f00 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72 20 69   Or, if pLower i
11f10 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61 6e  s NULL or $L can
11f20 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64  not be extracted
11f30 20 66 72 6f 6d 20 69 74 20 28 62 65 63 61 75 73   from it (becaus
11f40 65 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e  e it.    ** is n
11f50 6f 74 20 61 20 73 69 6d 70 6c 65 20 76 61 72 69  ot a simple vari
11f60 61 62 6c 65 20 6f 72 20 6c 69 74 65 72 61 6c 20  able or literal 
11f70 76 61 6c 75 65 29 2c 20 74 68 65 20 6c 6f 77 65  value), the lowe
11f80 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 0a 20  r bound of the. 
11f90 20 20 20 2a 2a 20 72 61 6e 67 65 20 69 73 20 24     ** range is $
11fa0 50 2e 20 44 75 65 20 74 6f 20 61 20 71 75 69 72  P. Due to a quir
11fb0 6b 20 69 6e 20 74 68 65 20 77 61 79 20 77 68 65  k in the way whe
11fc0 72 65 4b 65 79 53 74 61 74 73 28 29 20 77 6f 72  reKeyStats() wor
11fd0 6b 73 2c 20 65 76 65 6e 0a 20 20 20 20 2a 2a 20  ks, even.    ** 
11fe0 69 66 20 24 4c 20 69 73 20 61 76 61 69 6c 61 62  if $L is availab
11ff0 6c 65 2c 20 77 68 65 72 65 4b 65 79 53 74 61 74  le, whereKeyStat
12000 73 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  s() is called fo
12010 72 20 62 6f 74 68 20 28 24 50 29 20 61 6e 64 20  r both ($P) and 
12020 0a 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20  .    ** ($P:$L) 
12030 61 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f  and the larger o
12040 66 20 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e  f the two return
12050 65 64 20 76 61 6c 75 65 73 20 75 73 65 64 2e 0a  ed values used..
12060 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 69      **.    ** Si
12070 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70 65 72 20  milarly, iUpper 
12080 69 73 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20  is to be set to 
12090 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20  the estimate of 
120a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
120b0 77 73 0a 20 20 20 20 2a 2a 20 6c 65 73 73 20 74  ws.    ** less t
120c0 68 61 6e 20 74 68 65 20 75 70 70 65 72 20 62 6f  han the upper bo
120d0 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65  und of the range
120e0 20 71 75 65 72 79 2e 20 57 68 65 72 65 20 74 68   query. Where th
120f0 65 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20 20  e upper bound.  
12100 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 28    ** is either (
12110 24 50 29 20 6f 72 20 28 24 50 3a 24 55 29 2e 20  $P) or ($P:$U). 
12120 41 67 61 69 6e 2c 20 65 76 65 6e 20 69 66 20 24  Again, even if $
12130 55 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  U is available, 
12140 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 20 20  both values.    
12150 2a 2a 20 6f 66 20 69 55 70 70 65 72 20 61 72 65  ** of iUpper are
12160 20 72 65 71 75 65 73 74 65 64 20 6f 66 20 77 68   requested of wh
12170 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 61 6e  ereKeyStats() an
12180 64 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 75 73  d the smaller us
12190 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 74  ed..    */.    t
121a0 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b 0a 20  Rowcnt iLower;. 
121b0 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65     tRowcnt iUppe
121c0 72 3b 0a 0a 20 20 20 20 69 66 28 20 6e 45 71 3d  r;..    if( nEq=
121d0 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20  =p->nKeyCol ){. 
121e0 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
121f0 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20  E_AFF_INTEGER;. 
12200 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12210 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d  aff = p->pTable-
12220 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d  >aCol[p->aiColum
12230 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69 6e 69 74 79  n[nEq]].affinity
12240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44  ;.    }.    /* D
12250 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20  etermine iLower 
12260 61 6e 64 20 69 55 70 70 65 72 20 75 73 69 6e 67  and iUpper using
12270 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20   ($P) only. */. 
12280 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29 7b     if( nEq==0 ){
12290 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20  .      iLower = 
122a0 30 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20  0;.      iUpper 
122b0 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  = p->aiRowEst[0]
122c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
122d0 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73     /* Note: this
122e0 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65 20 6f   call could be o
122f0 70 74 69 6d 69 7a 65 64 20 61 77 61 79 20 2d 20  ptimized away - 
12300 73 69 6e 63 65 20 74 68 65 20 73 61 6d 65 20 76  since the same v
12310 61 6c 75 65 73 20 6d 75 73 74 20 0a 20 20 20 20  alues must .    
12320 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 72    ** have been r
12330 65 71 75 65 73 74 65 64 20 77 68 65 6e 20 74 65  equested when te
12340 73 74 69 6e 67 20 6b 65 79 20 24 50 20 69 6e 20  sting key $P in 
12350 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
12360 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77  t().  */.      w
12370 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
12380 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
12390 20 61 29 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65   a);.      iLowe
123a0 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20  r = a[0];.      
123b0 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 20 2b 20  iUpper = a[0] + 
123c0 61 5b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  a[1];.    }..   
123d0 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c   /* If possible,
123e0 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20   improve on the 
123f0 69 4c 6f 77 65 72 20 65 73 74 69 6d 61 74 65 20  iLower estimate 
12400 75 73 69 6e 67 20 28 24 50 3a 24 4c 29 2e 20 2a  using ($P:$L). *
12410 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72  /.    if( pLower
12420 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f   ){.      int bO
12430 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
12440 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
12450 20 76 61 6c 75 65 20 69 73 20 65 78 74 72 61 63   value is extrac
12460 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a  ted from pExpr *
12470 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  /.      Expr *pE
12480 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45  xpr = pLower->pE
12490 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
124a0 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 77     assert( (pLow
124b0 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
124c0 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d  (WO_GT|WO_GE))!=
124d0 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
124e0 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
124f0 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
12500 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
12510 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f  r, aff, nEq, &bO
12520 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
12530 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
12540 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 74 52  Ok ){.        tR
12550 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20  owcnt iNew;.    
12560 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74      whereKeyStat
12570 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
12580 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 0, a);.      
12590 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20    iNew = a[0] + 
125a0 28 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61  ((pLower->eOpera
125b0 74 6f 72 20 26 20 57 4f 5f 47 54 29 20 3f 20 61  tor & WO_GT) ? a
125c0 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  [1] : 0);.      
125d0 20 20 69 66 28 20 69 4e 65 77 3e 69 4c 6f 77 65    if( iNew>iLowe
125e0 72 20 29 20 69 4c 6f 77 65 72 20 3d 20 69 4e 65  r ) iLower = iNe
125f0 77 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 2d  w;.        nOut-
12600 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  -;.      }.    }
12610 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73  ..    /* If poss
12620 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e  ible, improve on
12630 20 74 68 65 20 69 55 70 70 65 72 20 65 73 74 69   the iUpper esti
12640 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24  mate using ($P:$
12650 55 29 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  U). */.    if( p
12660 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69  Upper ){.      i
12670 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20  nt bOk;         
12680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
12690 75 65 20 69 66 20 76 61 6c 75 65 20 69 73 20 65  ue if value is e
126a0 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45  xtracted from pE
126b0 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  xpr */.      Exp
126c0 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70 70 65  r *pExpr = pUppe
126d0 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
126e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
126f0 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
12700 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  or & (WO_LT|WO_L
12710 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  E))!=0 );.      
12720 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
12730 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70  4ProbeSetValue(p
12740 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c  Parse, p, &pRec,
12750 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71   pExpr, aff, nEq
12760 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 69  , &bOk);.      i
12770 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12780 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20   && bOk ){.     
12790 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b     tRowcnt iNew;
127a0 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4b 65  .        whereKe
127b0 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
127c0 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a 20  , pRec, 1, a);. 
127d0 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b         iNew = a[
127e0 30 5d 20 2b 20 28 28 70 55 70 70 65 72 2d 3e 65  0] + ((pUpper->e
127f0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45  Operator & WO_LE
12800 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20  ) ? a[1] : 0);. 
12810 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3c         if( iNew<
12820 69 55 70 70 65 72 20 29 20 69 55 70 70 65 72 20  iUpper ) iUpper 
12830 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = iNew;.        
12840 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  nOut--;.      }.
12850 20 20 20 20 7d 0a 0a 20 20 20 20 70 42 75 69 6c      }..    pBuil
12860 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63  der->pRec = pRec
12870 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
12880 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12890 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77   if( iUpper>iLow
128a0 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4e  er ){.        nN
128b0 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ew = sqlite3LogE
128c0 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77  st(iUpper - iLow
128d0 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  er);.      }else
128e0 7b 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d  {.        nNew =
128f0 20 31 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   10;        asse
12900 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 10==sqlite3L
12910 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20  ogEst(2) );.    
12920 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 4e    }.      if( nN
12930 65 77 3c 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20  ew<nOut ){.     
12940 20 20 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a     nOut = nNew;.
12950 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
12960 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67  oop->nOut = (Log
12970 45 73 74 29 6e 4f 75 74 3b 0a 20 20 20 20 20 20  Est)nOut;.      
12980 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c  WHERETRACE(0x10,
12990 20 28 22 72 61 6e 67 65 20 73 63 61 6e 20 72 65   ("range scan re
129a0 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 65  gions: %u..%u  e
129b0 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  st=%d\n",.      
129c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129d0 20 20 20 28 75 33 32 29 69 4c 6f 77 65 72 2c 20     (u32)iLower, 
129e0 28 75 33 32 29 69 55 70 70 65 72 2c 20 6e 4f 75  (u32)iUpper, nOu
129f0 74 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  t));.      retur
12a00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
12a10 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55   }.  }.#else.  U
12a20 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12a30 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45  pParse);.  UNUSE
12a40 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42 75 69  D_PARAMETER(pBui
12a50 6c 64 65 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20  lder);.#endif.  
12a60 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 20 7c  assert( pLower |
12a70 7c 20 70 55 70 70 65 72 20 29 3b 0a 20 20 2f 2a  | pUpper );.  /*
12a80 20 54 55 4e 49 4e 47 3a 20 20 45 61 63 68 20 69   TUNING:  Each i
12a90 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
12aa0 61 69 6e 74 20 72 65 64 75 63 65 73 20 74 68 65  aint reduces the
12ab0 20 73 65 61 72 63 68 20 73 70 61 63 65 20 34 2d   search space 4-
12ac0 66 6f 6c 64 2e 0a 20 20 2a 2a 20 41 20 42 45 54  fold..  ** A BET
12ad0 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74  WEEN operator, t
12ae0 68 65 72 65 66 6f 72 65 2c 20 72 65 64 75 63 65  herefore, reduce
12af0 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  s the search spa
12b00 63 65 20 31 36 2d 66 6f 6c 64 20 2a 2f 0a 20 20  ce 16-fold */.  
12b10 6e 4e 65 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 69  nNew = nOut;.  i
12b20 66 28 20 70 4c 6f 77 65 72 20 26 26 20 28 70 4c  f( pLower && (pL
12b30 6f 77 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20  ower->wtFlags & 
12b40 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
12b50 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20 32 30  {.    nNew -= 20
12b60 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  ;        assert(
12b70 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   20==sqlite3LogE
12b80 73 74 28 34 29 20 29 3b 0a 20 20 20 20 6e 4f 75  st(4) );.    nOu
12b90 74 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  t--;.  }.  if( p
12ba0 55 70 70 65 72 20 29 7b 0a 20 20 20 20 6e 4e 65  Upper ){.    nNe
12bb0 77 20 2d 3d 20 32 30 3b 20 20 20 20 20 20 20 20  w -= 20;        
12bc0 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c 69  assert( 20==sqli
12bd0 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a  te3LogEst(4) );.
12be0 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 7d 0a      nOut--;.  }.
12bf0 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20 29 20    if( nNew<10 ) 
12c00 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69 66 28  nNew = 10;.  if(
12c10 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75   nNew<nOut ) nOu
12c20 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 70 4c 6f 6f  t = nNew;.  pLoo
12c30 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73  p->nOut = (LogEs
12c40 74 29 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e  t)nOut;.  return
12c50 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
12c60 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
12c70 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
12c80 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * Estimate the n
12c90 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
12ca0 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
12cb0 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ned based on.** 
12cc0 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  an equality cons
12cd0 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61  traint x=VALUE a
12ce0 6e 64 20 77 68 65 72 65 20 74 68 61 74 20 56 41  nd where that VA
12cf0 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a  LUE occurs in.**
12d00 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64   the histogram d
12d10 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  ata.  This only 
12d20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20  works when x is 
12d30 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a  the left-most.**
12d40 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e   column of an in
12d50 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73  dex and sqlite_s
12d60 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64  tat3 histogram d
12d70 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
12d80 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64  .** for that ind
12d90 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d  ex.  When pExpr=
12da0 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
12db0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
12dc0 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c  is.** "x IS NULL
12dd0 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d  " instead of "x=
12de0 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72  VALUE"..**.** Wr
12df0 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
12e00 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
12e10 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
12e20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
12e30 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
12e40 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
12e50 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
12e60 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
12e70 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
12e80 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
12e90 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
12ea0 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
12eb0 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
12ec0 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
12ed0 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
12ee0 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
12ef0 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
12f00 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
12f10 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
12f20 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
12f30 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
12f40 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
12f50 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
12f60 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
12f70 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
12f80 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20  eEqualScanEst(. 
12f90 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
12fa0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
12fb0 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
12fc0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
12fd0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
12fe0 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78   *pBuilder,.  Ex
12ff0 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
13000 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
13010 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68   for VALUE in th
13020 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72  e x=VALUE constr
13030 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  aint */.  tRowcn
13040 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f  t *pnRow       /
13050 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69  * Write the revi
13060 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65  sed row estimate
13070 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
13080 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65  dex *p = pBuilde
13090 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
130a0 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e  .pIndex;.  int n
130b0 45 71 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  Eq = pBuilder->p
130c0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
130d0 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  ;.  UnpackedReco
130e0 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c  rd *pRec = pBuil
130f0 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 75 38 20  der->pRec;.  u8 
13100 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  aff;            
13110 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
13120 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69   affinity */.  i
13130 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
13140 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66           /* Subf
13150 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63  unction return c
13160 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  ode */.  tRowcnt
13170 20 61 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20   a[2];          
13180 20 20 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73     /* Statistics
13190 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a   */.  int bOk;..
131a0 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 31    assert( nEq>=1
131b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45   );.  assert( nE
131c0 71 3c 3d 28 70 2d 3e 6e 4b 65 79 43 6f 6c 2b 31  q<=(p->nKeyCol+1
131d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
131e0 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a  ->aSample!=0 );.
131f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61    assert( p->nSa
13200 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  mple>0 );.  asse
13210 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  rt( pBuilder->nR
13220 65 63 56 61 6c 69 64 3c 6e 45 71 20 29 3b 0a 0a  ecValid<nEq );..
13230 20 20 2f 2a 20 49 66 20 76 61 6c 75 65 73 20 61    /* If values a
13240 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
13250 20 66 6f 72 20 61 6c 6c 20 66 69 65 6c 64 73 20   for all fields 
13260 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
13270 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66  the left.  ** of
13280 20 74 68 69 73 20 6f 6e 65 2c 20 6e 6f 20 65 73   this one, no es
13290 74 69 6d 61 74 65 20 63 61 6e 20 62 65 20 6d 61  timate can be ma
132a0 64 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  de. Return SQLIT
132b0 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a 20  E_NOTFOUND. */. 
132c0 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e   if( pBuilder->n
132d0 52 65 63 56 61 6c 69 64 3c 28 6e 45 71 2d 31 29  RecValid<(nEq-1)
132e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
132f0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
13300 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69    }..  /* This i
13310 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
13320 6e 20 6f 6e 6c 79 2e 20 54 68 65 20 63 61 6c 6c  n only. The call
13330 20 74 6f 20 73 71 6c 69 74 65 33 53 74 61 74 34   to sqlite3Stat4
13340 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 29 0a  ProbeSetValue().
13350 20 20 2a 2a 20 62 65 6c 6f 77 20 77 6f 75 6c 64    ** below would
13360 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
13370 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69 66   value.  */.  if
13380 28 20 6e 45 71 3e 70 2d 3e 6e 4b 65 79 43 6f 6c  ( nEq>p->nKeyCol
13390 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d   ){.    *pnRow =
133a0 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
133b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
133c0 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65   aff = p->pTable
133d0 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75  ->aCol[p->aiColu
133e0 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61 66 66 69 6e  mn[nEq-1]].affin
133f0 69 74 79 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ity;.  rc = sqli
13400 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
13410 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c  Value(pParse, p,
13420 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61   &pRec, pExpr, a
13430 66 66 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29  ff, nEq-1, &bOk)
13440 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52  ;.  pBuilder->pR
13450 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 69 66 28  ec = pRec;.  if(
13460 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13470 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
13480 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72  ( bOk==0 ) retur
13490 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
134a0 44 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  D;.  pBuilder->n
134b0 52 65 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a  RecValid = nEq;.
134c0 0a 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  .  whereKeyStats
134d0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
134e0 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48 45 52 45  , 0, a);.  WHERE
134f0 54 52 41 43 45 28 30 78 31 30 2c 28 22 65 71 75  TRACE(0x10,("equ
13500 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f  ality scan regio
13510 6e 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29  ns: %d\n", (int)
13520 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f 77  a[1]));.  *pnRow
13530 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20 72 65   = a[1];.  .  re
13540 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
13550 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
13560 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
13570 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  4 */..#ifdef SQL
13580 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
13590 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20  _OR_STAT4./*.** 
135a0 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  Estimate the num
135b0 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
135c0 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
135d0 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e  d based on.** an
135e0 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77   IN constraint w
135f0 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d 68  here the right-h
13600 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
13610 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69  IN operator.** i
13620 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75  s a list of valu
13630 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  es.  Example:.**
13640 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52 45  .**        WHERE
13650 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a   x IN (1,2,3,4).
13660 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
13670 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f  estimated row co
13680 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20  unt into *pnRow 
13690 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
136a0 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61  E_OK. .** If una
136b0 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65  ble to make an e
136c0 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a  stimate, leave *
136d0 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20  pnRow unchanged 
136e0 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  and return.** no
136f0 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  n-zero..**.** Th
13700 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66  is routine can f
13710 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61  ail if it is una
13720 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f  ble to load a co
13730 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
13740 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72  .** required for
13750 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73   string comparis
13760 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65  on, or if unable
13770 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
13780 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46  ory.** for a UTF
13790 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75   conversion requ
137a0 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  ired for compari
137b0 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20  son.  The error 
137c0 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  is stored.** in 
137d0 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
137e0 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
137f0 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45  int whereInScanE
13800 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
13810 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
13820 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
13830 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
13840 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
13850 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
13860 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
13870 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76  st,     /* The v
13880 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65  alue list on the
13890 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76   RHS of "x IN (v
138a0 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f  1,v2,v3,...)" */
138b0 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f  .  tRowcnt *pnRo
138c0 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  w       /* Write
138d0 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77   the revised row
138e0 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a   estimate here *
138f0 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  /.){.  Index *p 
13900 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
13910 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
13920 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69  ;.  int nRecVali
13930 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  d = pBuilder->nR
13940 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72  ecValid;.  int r
13950 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
13960 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f     /* Subfunctio
13970 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  n return code */
13980 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b  .  tRowcnt nEst;
13990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
139a0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f 72  mber of rows for
139b0 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a   a single term *
139c0 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77  /.  tRowcnt nRow
139d0 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  Est = 0;    /* N
139e0 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  ew estimate of t
139f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
13a00 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
13a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13a20 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
13a30 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
13a40 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20  aSample!=0 );.  
13a50 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
13a60 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73  ITE_OK && i<pLis
13a70 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
13a80 20 20 20 20 6e 45 73 74 20 3d 20 70 2d 3e 61 69      nEst = p->ai
13a90 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 72  RowEst[0];.    r
13aa0 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63  c = whereEqualSc
13ab0 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
13ac0 75 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e 61  uilder, pList->a
13ad0 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73 74  [i].pExpr, &nEst
13ae0 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 2b  );.    nRowEst +
13af0 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75 69  = nEst;.    pBui
13b00 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
13b10 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 7d  = nRecValid;.  }
13b20 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
13b30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
13b40 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61 69   nRowEst > p->ai
13b50 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f 77  RowEst[0] ) nRow
13b60 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73  Est = p->aiRowEs
13b70 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e 52 6f 77  t[0];.    *pnRow
13b80 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20   = nRowEst;.    
13b90 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c  WHERETRACE(0x10,
13ba0 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74  ("IN row estimat
13bb0 65 3a 20 65 73 74 3d 25 67 5c 6e 22 2c 20 6e 52  e: est=%g\n", nR
13bc0 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 61  owEst));.  }.  a
13bd0 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d  ssert( pBuilder-
13be0 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65 63  >nRecValid==nRec
13bf0 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75 72  Valid );.  retur
13c00 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
13c10 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
13c20 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a  STAT3_OR_STAT4 *
13c30 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65  /../*.** Disable
13c40 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
13c50 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78  HERE clause.  Ex
13c60 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73  cept, do not dis
13c70 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a  able the term.**
13c80 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20   if it controls 
13c90 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
13ca0 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74  N and it did not
13cb0 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68   originate in th
13cc0 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47  e ON.** or USING
13cd0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20   clause of that 
13ce0 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73  join..**.** Cons
13cf0 69 64 65 72 20 74 68 65 20 74 65 72 6d 20 74 32  ider the term t2
13d00 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66  .z='ok' in the f
13d10 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73  ollowing queries
13d20 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53  :.**.**   (1)  S
13d30 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
13d40 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
13d50 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20  t1.a=t2.x WHERE 
13d60 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28  t2.z='ok'.**   (
13d70 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2)  SELECT * FRO
13d80 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
13d90 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41  2 ON t1.a=t2.x A
13da0 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20  ND t2.z='ok'.** 
13db0 20 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20    (3)  SELECT * 
13dc0 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52  FROM t1, t2 WHER
13dd0 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20  E t1.a=t2.x AND 
13de0 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20  t2.z='ok'.**.** 
13df0 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73  The t2.z='ok' is
13e00 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65   disabled in the
13e10 20 69 6e 20 28 32 29 20 62 65 63 61 75 73 65 20   in (2) because 
13e20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a  it originates.**
13e30 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73   in the ON claus
13e40 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73 20  e.  The term is 
13e50 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20  disabled in (3) 
13e60 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f  because it is no
13e70 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c  t part.** of a L
13e80 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20  EFT OUTER JOIN. 
13e90 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72   In (1), the ter
13ea0 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65  m is not disable
13eb0 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69  d..**.** Disabli
13ec0 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73 65 73  ng a term causes
13ed0 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f   that term to no
13ee0 74 20 62 65 20 74 65 73 74 65 64 20 69 6e 20 74  t be tested in t
13ef0 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
13f00 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44   of the join.  D
13f10 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f  isabling is an o
13f20 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68  ptimization.  Wh
13f30 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61 74  en terms are sat
13f40 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64  isfied.** by ind
13f50 69 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65  ices, we disable
13f60 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74   them to prevent
13f70 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73   redundant tests
13f80 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a   in the inner.**
13f90 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64   loop.  We would
13fa0 20 67 65 74 20 74 68 65 20 63 6f 72 72 65 63 74   get the correct
13fb0 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68   results if noth
13fc0 69 6e 67 20 77 65 72 65 20 65 76 65 72 20 64 69  ing were ever di
13fd0 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a  sabled,.** but j
13fe0 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61  oins might run a
13ff0 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20   little slower. 
14000 20 54 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f   The trick is to
14010 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68   disable as much
14020 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69  .** as we can wi
14030 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20  thout disabling 
14040 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65  too much.  If we
14050 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29   disabled in (1)
14060 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68  , we'd get.** th
14070 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20  e wrong answer. 
14080 20 53 65 65 20 74 69 63 6b 65 74 20 23 38 31 33   See ticket #813
14090 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
140a0 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65   disableTerm(Whe
140b0 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
140c0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
140d0 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a  m){.  if( pTerm.
140e0 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d        && (pTerm-
140f0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
14100 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20  CODED)==0.      
14110 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  && (pLevel->iLef
14120 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72  tJoin==0 || Expr
14130 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
14140 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
14150 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 26 26  mJoin)).      &&
14160 20 28 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61   (pLevel->notRea
14170 64 79 20 26 20 70 54 65 72 6d 2d 3e 70 72 65 72  dy & pTerm->prer
14180 65 71 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20  eqAll)==0.  ){. 
14190 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
141a0 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
141b0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
141c0 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20  iParent>=0 ){.  
141d0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
141e0 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e  Other = &pTerm->
141f0 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50  pWC->a[pTerm->iP
14200 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66  arent];.      if
14210 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68  ( (--pOther->nCh
14220 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ild)==0 ){.     
14230 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
14240 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a  Level, pOther);.
14250 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14260 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  }.}../*.** Code 
14270 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f  an OP_Affinity o
14280 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79 20 74  pcode to apply t
14290 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  he column affini
142a0 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a  ty string zAff.*
142b0 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67 69 73  * to the n regis
142c0 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74  ters starting at
142d0 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73   base. .**.** As
142e0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
142f0 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  , SQLITE_AFF_NON
14300 45 20 65 6e 74 72 69 65 73 20 28 77 68 69 63 68  E entries (which
14310 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20   are no-ops) at 
14320 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67  the.** beginning
14330 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66 66   and end of zAff
14340 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20 20 49   are ignored.  I
14350 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  f all entries in
14360 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c   zAff are.** SQL
14370 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74 68  ITE_AFF_NONE, th
14380 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74 73 20  en no code gets 
14390 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  generated..**.**
143a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
143b0 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f 70 79  kes its own copy
143c0 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68 61 74   of zAff so that
143d0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 66   the caller is f
143e0 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79  ree.** to modify
143f0 20 7a 41 66 66 20 61 66 74 65 72 20 74 68 69 73   zAff after this
14400 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
14410 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14420 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69   codeApplyAffini
14430 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ty(Parse *pParse
14440 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e 74 20  , int base, int 
14450 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a  n, char *zAff){.
14460 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
14470 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
14480 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20   zAff==0 ){.    
14490 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
144a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
144b0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
144c0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 76 21    }.  assert( v!
144d0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75  =0 );..  /* Adju
144e0 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20 74 6f  st base and n to
144f0 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c 49 54   skip over SQLIT
14500 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69  E_AFF_NONE entri
14510 65 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  es at the beginn
14520 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64  ing.  ** and end
14530 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69 74 79   of the affinity
14540 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20   string..  */.  
14550 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41  while( n>0 && zA
14560 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46  ff[0]==SQLITE_AF
14570 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d  F_NONE ){.    n-
14580 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20  -;.    base++;. 
14590 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20     zAff++;.  }. 
145a0 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a   while( n>1 && z
145b0 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45  Aff[n-1]==SQLITE
145c0 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
145d0 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   n--;.  }..  /* 
145e0 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66 66 69  Code the OP_Affi
145f0 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66 20 74  nity opcode if t
14600 68 65 72 65 20 69 73 20 61 6e 79 74 68 69 6e 67  here is anything
14610 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a   left to do. */.
14620 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
14630 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14640 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74  p2(v, OP_Affinit
14650 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20  y, base, n);.   
14660 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
14670 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66 66  geP4(v, -1, zAff
14680 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , n);.    sqlite
14690 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
146a0 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
146b0 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d   base, n);.  }.}
146c0 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
146d0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e  e code for a sin
146e0 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65 72  gle equality ter
146f0 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
14700 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61 6c  lause.  An equal
14710 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20  ity.** term can 
14720 62 65 20 65 69 74 68 65 72 20 58 3d 65 78 70 72  be either X=expr
14730 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20   or X IN (...). 
14740 20 20 70 54 65 72 6d 20 69 73 20 74 68 65 20 74    pTerm is the t
14750 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f  erm to be .** co
14760 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ded..**.** The c
14770 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f 72  urrent value for
14780 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
14790 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73  is left in regis
147a0 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20  ter iReg..**.** 
147b0 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e 74  For a constraint
147c0 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 65   of the form X=e
147d0 78 70 72 2c 20 74 68 65 20 65 78 70 72 65 73 73  xpr, the express
147e0 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64  ion is evaluated
147f0 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73 75   and its.** resu
14800 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68  lt is left on th
14810 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f  e stack.  For co
14820 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65  nstraints of the
14830 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29   form X IN (...)
14840 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
14850 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70 20   sets up a loop 
14860 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61 74  that will iterat
14870 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65  e over all value
14880 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69  s of X..*/.stati
14890 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61 6c 69  c int codeEquali
148a0 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20  tyTerm(.  Parse 
148b0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
148c0 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
148d0 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  text */.  WhereT
148e0 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a  erm *pTerm,   /*
148f0 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68 65   The term of the
14900 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
14910 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57   be coded */.  W
14920 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
14930 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76 65 6c 20  l, /* The level 
14940 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
14950 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  se we are workin
14960 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 45  g on */.  int iE
14970 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  q,            /*
14980 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 65 71   Index of the eq
14990 75 61 6c 69 74 79 20 74 65 72 6d 20 77 69 74 68  uality term with
149a0 69 6e 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f  in this level */
149b0 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20  .  int bRev,    
149c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
149d0 6f 72 20 72 65 76 65 72 73 65 2d 6f 72 64 65 72  or reverse-order
149e0 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a   IN operations *
149f0 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65 74 20  /.  int iTarget 
14a00 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d          /* Attem
14a10 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65 73 75  pt to leave resu
14a20 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65 67 69  lts in this regi
14a30 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  ster */.){.  Exp
14a40 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
14a50 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20  Expr;.  Vdbe *v 
14a60 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
14a70 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 20  .  int iReg;    
14a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14a90 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
14aa0 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20  g results */..  
14ab0 61 73 73 65 72 74 28 20 69 54 61 72 67 65 74 3e  assert( iTarget>
14ac0 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f  0 );.  if( pX->o
14ad0 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20  p==TK_EQ ){.    
14ae0 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  iReg = sqlite3Ex
14af0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
14b00 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
14b10 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c   iTarget);.  }el
14b20 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54  se if( pX->op==T
14b30 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  K_ISNULL ){.    
14b40 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a  iReg = iTarget;.
14b50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14b60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
14b70 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e  , 0, iReg);.#ifn
14b80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14b90 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65  SUBQUERY.  }else
14ba0 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b  {.    int eType;
14bb0 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  .    int iTab;. 
14bc0 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70     struct InLoop
14bd0 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68 65 72 65   *pIn;.    Where
14be0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70 4c  Loop *pLoop = pL
14bf0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20  evel->pWLoop;.. 
14c00 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
14c10 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
14c20 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 0a  IRTUALTABLE)==0.
14c30 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e        && pLoop->
14c40 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d  u.btree.pIndex!=
14c50 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70  0.      && pLoop
14c60 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
14c70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 45 71  ->aSortOrder[iEq
14c80 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74  ].    ){.      t
14c90 65 73 74 63 61 73 65 28 20 69 45 71 3d 3d 30 20  estcase( iEq==0 
14ca0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14cb0 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20  e( bRev );.     
14cc0 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a 20   bRev = !bRev;. 
14cd0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
14ce0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29   pX->op==TK_IN )
14cf0 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61  ;.    iReg = iTa
14d00 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70 65 20  rget;.    eType 
14d10 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  = sqlite3FindInI
14d20 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c  ndex(pParse, pX,
14d30 20 30 29 3b 0a 20 20 20 20 69 66 28 20 65 54 79   0);.    if( eTy
14d40 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe==IN_INDEX_IND
14d50 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20  EX_DESC ){.     
14d60 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76 20   testcase( bRev 
14d70 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d 20  );.      bRev = 
14d80 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20  !bRev;.    }.   
14d90 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62   iTab = pX->iTab
14da0 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  le;.    sqlite3V
14db0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65  dbeAddOp2(v, bRe
14dc0 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50  v ? OP_Last : OP
14dd0 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30  _Rewind, iTab, 0
14de0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
14df0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
14e00 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29   WHERE_MULTI_OR)
14e10 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  ==0 );.    pLoop
14e20 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
14e30 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20 20 20  RE_IN_ABLE;.    
14e40 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  if( pLevel->u.in
14e50 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  .nIn==0 ){.     
14e60 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
14e70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
14e80 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
14e90 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  }.    pLevel->u.
14ea0 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c  in.nIn++;.    pL
14eb0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
14ec0 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69  op =.       sqli
14ed0 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
14ee0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
14ef0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
14f00 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  oop,.           
14f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c     sizeof(pLevel
14f30 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30  ->u.in.aInLoop[0
14f40 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  ])*pLevel->u.in.
14f50 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20  nIn);.    pIn = 
14f60 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
14f70 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49  Loop;.    if( pI
14f80 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b  n ){.      pIn +
14f90 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  = pLevel->u.in.n
14fa0 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49  In - 1;.      pI
14fb0 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a  n->iCur = iTab;.
14fc0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
14fd0 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20  =IN_INDEX_ROWID 
14fe0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e  ){.        pIn->
14ff0 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69  addrInTop = sqli
15000 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15010 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c   OP_Rowid, iTab,
15020 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65   iReg);.      }e
15030 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  lse{.        pIn
15040 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71  ->addrInTop = sq
15050 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15060 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
15070 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20  ab, 0, iReg);.  
15080 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 2d      }.      pIn-
15090 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62 52  >eEndLoopOp = bR
150a0 65 76 20 3f 20 4f 50 5f 50 72 65 76 49 66 4f 70  ev ? OP_PrevIfOp
150b0 65 6e 20 3a 20 4f 50 5f 4e 65 78 74 49 66 4f 70  en : OP_NextIfOp
150c0 65 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  en;.      sqlite
150d0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
150e0 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b  P_IsNull, iReg);
150f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15100 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e    pLevel->u.in.n
15110 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65  In = 0;.    }.#e
15120 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62  ndif.  }.  disab
15130 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
15140 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  Term);.  return 
15150 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  iReg;.}../*.** G
15160 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
15170 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
15180 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f  all == and IN co
15190 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e  nstraints for an
151a0 0a 2a 2a 20 69 6e 64 65 78 20 73 63 61 6e 2e 0a  .** index scan..
151b0 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
151c0 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c  e, consider tabl
151d0 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66  e t1(a,b,c,d,e,f
151e0 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31 28  ) with index i1(
151f0 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f  a,b,c)..** Suppo
15200 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  se the WHERE cla
15210 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d  use is this:  a=
15220 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32  =5 AND b IN (1,2
15230 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20  ,3) AND c>5 AND 
15240 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65  c<10.** The inde
15250 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73  x has as many as
15260 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79 20   three equality 
15270 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74  constraints, but
15280 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d   in this.** exam
15290 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20 22  ple, the third "
152a0 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69  c" value is an i
152b0 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f  nequality.  So o
152c0 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73  nly two .** cons
152d0 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65  traints are code
152e0 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
152f0 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63   will generate c
15300 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a  ode to evaluate.
15310 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e  ** a==5 and b IN
15320 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63   (1,2,3).  The c
15330 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f  urrent values fo
15340 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62  r a and b will b
15350 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63  e stored.** in c
15360 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73  onsecutive regis
15370 74 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64  ters and the ind
15380 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ex of the first 
15390 72 65 67 69 73 74 65 72 20 69 73 20 72 65 74 75  register is retu
153a0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  rned..**.** In t
153b0 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
153c0 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68   nEq==2.  But th
153d0 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f  is subroutine wo
153e0 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75  rks for any valu
153f0 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c  e.** of nEq incl
15400 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71  uding 0.  If nEq
15410 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ==0, this routin
15420 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f  e is nearly a no
15430 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  -op..** The only
15440 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69   thing it does i
15450 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70  s allocate the p
15460 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f  Level->iMem memo
15470 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63  ry cell and.** c
15480 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66 69 6e  ompute the affin
15490 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ity string..**.*
154a0 2a 20 54 68 65 20 6e 45 78 74 72 61 52 65 67 20  * The nExtraReg 
154b0 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 6f  parameter is 0 o
154c0 72 20 31 2e 20 20 49 74 20 69 73 20 30 20 69 66  r 1.  It is 0 if
154d0 20 61 6c 6c 20 57 48 45 52 45 20 63 6c 61 75 73   all WHERE claus
154e0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  e constraints.**
154f0 20 61 72 65 20 3d 3d 20 6f 72 20 49 4e 20 61 6e   are == or IN an
15500 64 20 61 72 65 20 63 6f 76 65 72 65 64 20 62 79  d are covered by
15510 20 74 68 65 20 6e 45 71 2e 20 20 6e 45 78 74 72   the nEq.  nExtr
15520 61 52 65 67 20 69 73 20 31 20 69 66 20 74 68 65  aReg is 1 if the
15530 72 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 65 71  re is.** an ineq
15540 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
15550 74 20 28 73 75 63 68 20 61 73 20 74 68 65 20 22  t (such as the "
15560 63 3e 3d 35 20 41 4e 44 20 63 3c 31 30 22 20 69  c>=5 AND c<10" i
15570 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20 74  n the example) t
15580 68 61 74 0a 2a 2a 20 6f 63 63 75 72 73 20 61 66  hat.** occurs af
15590 74 65 72 20 74 68 65 20 6e 45 71 20 71 75 61 6c  ter the nEq qual
155a0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ity constraints.
155b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
155c0 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ine allocates a 
155d0 72 61 6e 67 65 20 6f 66 20 6e 45 71 2b 6e 45 78  range of nEq+nEx
155e0 74 72 61 52 65 67 20 6d 65 6d 6f 72 79 20 63 65  traReg memory ce
155f0 6c 6c 73 20 61 6e 64 20 72 65 74 75 72 6e 73 0a  lls and returns.
15600 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  ** the index of 
15610 74 68 65 20 66 69 72 73 74 20 6d 65 6d 6f 72 79  the first memory
15620 20 63 65 6c 6c 20 69 6e 20 74 68 61 74 20 72 61   cell in that ra
15630 6e 67 65 2e 20 54 68 65 20 63 6f 64 65 20 74 68  nge. The code th
15640 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73  at.** calls this
15650 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73   routine will us
15660 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 72 61  e that memory ra
15670 6e 67 65 20 74 6f 20 73 74 6f 72 65 20 6b 65 79  nge to store key
15680 73 20 66 6f 72 0a 2a 2a 20 73 74 61 72 74 20 61  s for.** start a
15690 6e 64 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  nd termination c
156a0 6f 6e 64 69 74 69 6f 6e 73 20 6f 66 20 74 68 65  onditions of the
156b0 20 6c 6f 6f 70 2e 0a 2a 2a 20 6b 65 79 20 76 61   loop..** key va
156c0 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  lue of the loop.
156d0 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65    If one or more
156e0 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70   IN operators ap
156f0 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  pear, then.** th
15700 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
15710 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e  ates an addition
15720 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65  al nEq memory ce
15730 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  lls for internal
15740 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42  .** use..**.** B
15750 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
15760 20 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20 74   *pzAff is set t
15770 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
15780 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
15790 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20  .** copy of the 
157a0 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  column affinity 
157b0 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69 6e  string of the in
157c0 64 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  dex allocated us
157d0 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62  ing.** sqlite3Db
157e0 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70 74  Malloc(). Except
157f0 2c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  , entries in the
15800 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72   copy of the str
15810 69 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ing associated.*
15820 2a 20 77 69 74 68 20 65 71 75 61 6c 69 74 79 20  * with equality 
15830 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74  constraints that
15840 20 75 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69   use NONE affini
15850 74 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a  ty are set to.**
15860 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
15870 2e 20 54 68 69 73 20 69 73 20 74 6f 20 64 65 61  . This is to dea
15880 6c 20 77 69 74 68 20 53 51 4c 20 73 75 63 68 20  l with SQL such 
15890 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  as the following
158a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  :.**.**   CREATE
158b0 20 54 41 42 4c 45 20 74 31 28 61 20 54 45 58 54   TABLE t1(a TEXT
158c0 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
158d0 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e  ;.**   SELECT ..
158e0 2e 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c  . FROM t1 AS t2,
158f0 20 74 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d   t1 WHERE t1.a =
15900 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20   t2.b;.**.** In 
15910 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
15920 65 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  e, the index on 
15930 74 31 28 61 29 20 68 61 73 20 54 45 58 54 20 61  t1(a) has TEXT a
15940 66 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e  ffinity. But sin
15950 63 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20  ce.** the right 
15960 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
15970 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
15980 61 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20  aint (t2.b) has 
15990 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a  NONE affinity,.*
159a0 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20  * no conversion 
159b0 73 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d 70  should be attemp
159c0 74 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e 67  ted before using
159d0 20 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61 73   a t2.b value as
159e0 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65   part of.** a ke
159f0 79 20 74 6f 20 73 65 61 72 63 68 20 74 68 65 20  y to search the 
15a00 69 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68 65  index. Hence the
15a10 20 66 69 72 73 74 20 62 79 74 65 20 69 6e 20 74   first byte in t
15a20 68 65 20 72 65 74 75 72 6e 65 64 20 61 66 66 69  he returned affi
15a30 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69  nity.** string i
15a40 6e 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20 77  n this example w
15a50 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 53  ould be set to S
15a60 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a  QLITE_AFF_NONE..
15a70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
15a80 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72  deAllEqualityTer
15a90 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ms(.  Parse *pPa
15aa0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
15ab0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
15ac0 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
15ad0 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69  pLevel,   /* Whi
15ae0 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f  ch nested loop o
15af0 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72  f the FROM we ar
15b00 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e  e coding */.  in
15b10 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20  t bRev,         
15b20 20 20 20 20 2f 2a 20 52 65 76 65 72 73 65 20 74      /* Reverse t
15b30 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 6f  he order of IN o
15b40 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
15b50 74 20 6e 45 78 74 72 61 52 65 67 2c 20 20 20 20  t nExtraReg,    
15b60 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15b70 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73   extra registers
15b80 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
15b90 20 20 63 68 61 72 20 2a 2a 70 7a 41 66 66 20 20    char **pzAff  
15ba0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
15bb0 53 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  Set to point to 
15bc0 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
15bd0 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 45 71 3b  */.){.  u16 nEq;
15be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bf0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
15c00 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20  ber of == or IN 
15c10 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63  constraints to c
15c20 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6e 53 6b  ode */.  u16 nSk
15c30 69 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ip;             
15c40 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
15c50 20 6f 66 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f   of left-most co
15c60 6c 75 6d 6e 73 20 74 6f 20 73 6b 69 70 20 2a 2f  lumns to skip */
15c70 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
15c80 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
15c90 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72   /* The vm under
15ca0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
15cb0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cd0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65   /* The index be
15ce0 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69  ing used for thi
15cf0 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72  s loop */.  Wher
15d00 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
15d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
15d20 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74  ingle constraint
15d30 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65   term */.  Where
15d40 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
15d50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15d60 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
15d70 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
15d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d90 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
15da0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
15db0 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Base;           
15dc0 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72         /* Base r
15dd0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
15de0 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20   nReg;          
15df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
15e00 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72  mber of register
15e10 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
15e20 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20  .  char *zAff;  
15e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e40 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72   /* Affinity str
15e50 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ing to return */
15e60 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75  ..  /* This modu
15e70 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  le is only calle
15e80 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73  d on query plans
15e90 20 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64   that use an ind
15ea0 65 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d  ex. */.  pLoop =
15eb0 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
15ec0 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f  .  assert( (pLoo
15ed0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
15ee0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
15ef0 3d 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70  ==0 );.  nEq = p
15f00 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
15f10 71 3b 0a 20 20 6e 53 6b 69 70 20 3d 20 70 4c 6f  q;.  nSkip = pLo
15f20 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  op->u.btree.nSki
15f30 70 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f  p;.  pIdx = pLoo
15f40 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
15f50 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  x;.  assert( pId
15f60 78 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  x!=0 );..  /* Fi
15f70 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
15f80 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77  y memory cells w
15f90 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e  e will need then
15fa0 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a   allocate them..
15fb0 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20 3d    */.  regBase =
15fc0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
15fd0 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f  1;.  nReg = pLoo
15fe0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b  p->u.btree.nEq +
15ff0 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70 50   nExtraReg;.  pP
16000 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
16010 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71  eg;..  zAff = sq
16020 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50  lite3DbStrDup(pP
16030 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65  arse->db, sqlite
16040 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
16050 72 28 76 2c 20 70 49 64 78 29 29 3b 0a 20 20 69  r(v, pIdx));.  i
16060 66 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20 20  f( !zAff ){.    
16070 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
16080 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
16090 7d 0a 0a 20 20 69 66 28 20 6e 53 6b 69 70 20 29  }..  if( nSkip )
160a0 7b 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75  {.    int iIdxCu
160b0 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
160c0 43 75 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Cur;.    sqlite3
160d0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 28 62  VdbeAddOp1(v, (b
160e0 52 65 76 3f 4f 50 5f 4c 61 73 74 3a 4f 50 5f 52  Rev?OP_Last:OP_R
160f0 65 77 69 6e 64 29 2c 20 69 49 64 78 43 75 72 29  ewind), iIdxCur)
16100 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
16110 74 28 28 76 2c 20 22 62 65 67 69 6e 20 73 6b 69  t((v, "begin ski
16120 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70  p-scan on %s", p
16130 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
16140 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 56 64 62    j = sqlite3Vdb
16150 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
16160 74 6f 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  to);.    pLevel-
16170 3e 61 64 64 72 53 6b 69 70 20 3d 20 73 71 6c 69  >addrSkip = sqli
16180 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
16190 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f 53 65 65  (v, (bRev?OP_See
161a0 6b 4c 74 3a 4f 50 5f 53 65 65 6b 47 74 29 2c 0a  kLt:OP_SeekGt),.
161b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161c0 20 20 20 20 20 20 20 20 20 20 20 20 69 49 64 78              iIdx
161d0 43 75 72 2c 20 30 2c 20 72 65 67 42 61 73 65 2c  Cur, 0, regBase,
161e0 20 6e 53 6b 69 70 29 3b 0a 20 20 20 20 73 71 6c   nSkip);.    sql
161f0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
16200 28 76 2c 20 6a 29 3b 0a 20 20 20 20 66 6f 72 28  (v, j);.    for(
16210 6a 3d 30 3b 20 6a 3c 6e 53 6b 69 70 3b 20 6a 2b  j=0; j<nSkip; j+
16220 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
16230 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
16240 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75  P_Column, iIdxCu
16250 72 2c 20 6a 2c 20 72 65 67 42 61 73 65 2b 6a 29  r, j, regBase+j)
16260 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16270 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
16280 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 56 64  ]>=0 );.      Vd
16290 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
162a0 73 22 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  s", pIdx->pTable
162b0 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43  ->aCol[pIdx->aiC
162c0 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 29  olumn[j]].zName)
162d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 20  );.    }.  }    
162e0 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20  ..  /* Evaluate 
162f0 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  the equality con
16300 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20  straints.  */.  
16310 61 73 73 65 72 74 28 20 7a 41 66 66 3d 3d 30 20  assert( zAff==0 
16320 7c 7c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  || (int)strlen(z
16330 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 66  Aff)>=nEq );.  f
16340 6f 72 28 6a 3d 6e 53 6b 69 70 3b 20 6a 3c 6e 45  or(j=nSkip; j<nE
16350 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  q; j++){.    int
16360 20 72 31 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d   r1;.    pTerm =
16370 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
16380 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
16390 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 2f  Term!=0 );.    /
163a0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
163b0 74 65 73 74 63 61 73 65 20 69 73 20 74 72 75 65  testcase is true
163c0 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74   for indices wit
163d0 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75  h redundant colu
163e0 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a  mns. .    ** Ex:
163f0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
16400 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53   ON t1(a,b,a); S
16410 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
16420 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d  WHERE a=0 AND b=
16430 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61  0; */.    testca
16440 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  se( (pTerm->wtFl
16450 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
16460 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  )!=0 );.    test
16470 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
16480 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
16490 55 41 4c 20 29 3b 0a 20 20 20 20 72 31 20 3d 20  UAL );.    r1 = 
164a0 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
164b0 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
164c0 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c  pLevel, j, bRev,
164d0 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20   regBase+j);.   
164e0 20 69 66 28 20 72 31 21 3d 72 65 67 42 61 73 65   if( r1!=regBase
164f0 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  +j ){.      if( 
16500 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nReg==1 ){.     
16510 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
16520 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
16530 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20   regBase);.     
16540 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b     regBase = r1;
16550 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16560 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16570 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
16580 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65  opy, r1, regBase
16590 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +j);.      }.   
165a0 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
165b0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
165c0 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
165d0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
165e0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
165f0 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69  & WO_IN );.    i
16600 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
16610 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c  ator & (WO_ISNUL
16620 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a  L|WO_IN))==0 ){.
16630 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
16640 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  ht = pTerm->pExp
16650 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
16660 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16670 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52  IsNullJump(v, pR
16680 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6a 2c  ight, regBase+j,
16690 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
166a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66  );.      if( zAf
166b0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  f ){.        if(
166c0 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
166d0 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20  ffinity(pRight, 
166e0 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45  zAff[j])==SQLITE
166f0 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
16700 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d         zAff[j] =
16710 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
16720 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16730 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
16740 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
16750 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c  tyChange(pRight,
16760 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20   zAff[j]) ){.   
16770 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d         zAff[j] =
16780 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
16790 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
167a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
167b0 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20  *pzAff = zAff;. 
167c0 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b   return regBase;
167d0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
167e0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
167f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
16800 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72 20 66  ne is a helper f
16810 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52  or explainIndexR
16820 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a  ange() below.**.
16830 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74 68  ** pStr holds th
16840 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78 70  e text of an exp
16850 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65 20  ression that we 
16860 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70 20  are building up 
16870 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61  one term.** at a
16880 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f 75   time.  This rou
16890 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77 20  tine adds a new 
168a0 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64 20  term to the end 
168b0 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
168c0 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65 20  n..** Terms are 
168d0 73 65 70 61 72 61 74 65 64 20 62 79 20 41 4e 44  separated by AND
168e0 20 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e 44   so add the "AND
168f0 22 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f 6e  " text for secon
16900 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
16910 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a  .** terms only..
16920 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
16930 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
16940 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70 53  (.  StrAccum *pS
16950 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
16960 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78 70 72  /* The text expr
16970 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75 69  ession being bui
16980 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72  lt */.  int iTer
16990 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
169a0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
169b0 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72 73  this term.  Firs
169c0 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63  t is zero */.  c
169d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75  onst char *zColu
169e0 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  mn,        /* Na
169f0 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
16a00 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
16a10 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20 20   *zOp           
16a20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
16a30 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a   operator */.){.
16a40 20 20 69 66 28 20 69 54 65 72 6d 20 29 20 73 71    if( iTerm ) sq
16a50 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
16a60 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44 20  end(pStr, " AND 
16a70 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65 33  ", 5);.  sqlite3
16a80 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c  StrAccumAppendAl
16a90 6c 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 29  l(pStr, zColumn)
16aa0 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
16ab0 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
16ac0 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  zOp, 1);.  sqlit
16ad0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
16ae0 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a  (pStr, "?", 1);.
16af0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
16b00 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72 69 62  t pLevel describ
16b10 65 73 20 61 20 73 74 72 61 74 65 67 79 20 66 6f  es a strategy fo
16b20 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65  r scanning table
16b30 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20   pTab. This .** 
16b40 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
16b50 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
16b60 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 63 6f  string buffer co
16b70 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73 63 72  ntaining a descr
16b80 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  iption.** of the
16b90 20 73 75 62 73 65 74 20 6f 66 20 74 61 62 6c 65   subset of table
16ba0 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79   rows scanned by
16bb0 20 74 68 65 20 73 74 72 61 74 65 67 79 20 69 6e   the strategy in
16bc0 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 0a   the form of an.
16bd0 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f  ** SQL expressio
16be0 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72 6f  n. Or, if all ro
16bf0 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64 2c 20  ws are scanned, 
16c00 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
16c10 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
16c20 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72  ple, if the quer
16c30 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  y:.**.**   SELEC
16c40 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
16c50 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a  E a=1 AND b>2;.*
16c60 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64 20  *.** is run and 
16c70 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65  there is an inde
16c80 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65  x on (a, b), the
16c90 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
16ca0 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72  returns a.** str
16cb0 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a  ing similar to:.
16cc0 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44  **.**   "a=? AND
16cd0 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20   b>?".**.** The 
16ce0 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72  returned pointer
16cf0 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f 72   points to memor
16d00 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
16d10 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
16d20 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  )..** It is the 
16d30 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
16d40 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
16d50 66 72 65 65 20 74 68 65 20 62 75 66 66 65 72 20  free the buffer 
16d60 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e 6f  when it is.** no
16d70 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64   longer required
16d80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
16d90 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61   *explainIndexRa
16da0 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  nge(sqlite3 *db,
16db0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
16dc0 70 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  p, Table *pTab){
16dd0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
16de0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
16df0 65 2e 70 49 6e 64 65 78 3b 0a 20 20 75 31 36 20  e.pIndex;.  u16 
16e00 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  nEq = pLoop->u.b
16e10 74 72 65 65 2e 6e 45 71 3b 0a 20 20 75 31 36 20  tree.nEq;.  u16 
16e20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75  nSkip = pLoop->u
16e30 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3b 0a 20 20  .btree.nSkip;.  
16e40 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75  int i, j;.  Colu
16e50 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62 2d  mn *aCol = pTab-
16e60 3e 61 43 6f 6c 3b 0a 20 20 69 31 36 20 2a 61 69  >aCol;.  i16 *ai
16e70 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d  Column = pIndex-
16e80 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72  >aiColumn;.  Str
16e90 41 63 63 75 6d 20 74 78 74 3b 0a 0a 20 20 69 66  Accum txt;..  if
16ea0 28 20 6e 45 71 3d 3d 30 20 26 26 20 28 70 4c 6f  ( nEq==0 && (pLo
16eb0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  op->wsFlags & (W
16ec0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57  HERE_BTM_LIMIT|W
16ed0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29  HERE_TOP_LIMIT))
16ee0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
16ef0 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
16f00 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
16f10 74 78 74 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54  txt, 0, 0, SQLIT
16f20 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20  E_MAX_LENGTH);. 
16f30 20 74 78 74 2e 64 62 20 3d 20 64 62 3b 0a 20 20   txt.db = db;.  
16f40 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
16f50 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20 28 22  ppend(&txt, " ("
16f60 2c 20 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  , 2);.  for(i=0;
16f70 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20   i<nEq; i++){.  
16f80 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 69 3d 3d    char *z = (i==
16f90 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20  pIndex->nKeyCol 
16fa0 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43  ) ? "rowid" : aC
16fb0 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e  ol[aiColumn[i]].
16fc0 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 69  zName;.    if( i
16fd0 3e 3d 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  >=nSkip ){.     
16fe0 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
16ff0 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20 22  rm(&txt, i, z, "
17000 3d 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  =");.    }else{.
17010 20 20 20 20 20 20 69 66 28 20 69 20 29 20 73 71        if( i ) sq
17020 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
17030 65 6e 64 28 26 74 78 74 2c 20 22 20 41 4e 44 20  end(&txt, " AND 
17040 22 2c 20 35 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", 5);.      sql
17050 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
17060 6e 64 28 26 74 78 74 2c 20 22 41 4e 59 28 22 2c  nd(&txt, "ANY(",
17070 20 34 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   4);.      sqlit
17080 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
17090 41 6c 6c 28 26 74 78 74 2c 20 7a 29 3b 0a 20 20  All(&txt, z);.  
170a0 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
170b0 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20  cumAppend(&txt, 
170c0 22 29 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ")", 1);.    }. 
170d0 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69   }..  j = i;.  i
170e0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
170f0 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  s&WHERE_BTM_LIMI
17100 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  T ){.    char *z
17110 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e   = (j==pIndex->n
17120 4b 65 79 43 6f 6c 20 29 20 3f 20 22 72 6f 77 69  KeyCol ) ? "rowi
17130 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75  d" : aCol[aiColu
17140 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  mn[j]].zName;.  
17150 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54    explainAppendT
17160 65 72 6d 28 26 74 78 74 2c 20 69 2b 2b 2c 20 7a  erm(&txt, i++, z
17170 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a 20 20 69 66  , ">");.  }.  if
17180 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
17190 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  &WHERE_TOP_LIMIT
171a0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20   ){.    char *z 
171b0 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 4b  = (j==pIndex->nK
171c0 65 79 43 6f 6c 20 29 20 3f 20 22 72 6f 77 69 64  eyCol ) ? "rowid
171d0 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d  " : aCol[aiColum
171e0 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  n[j]].zName;.   
171f0 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
17200 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20 22  rm(&txt, i, z, "
17210 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  <");.  }.  sqlit
17220 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
17230 28 26 74 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a  (&txt, ")", 1);.
17240 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
17250 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26  StrAccumFinish(&
17260 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  txt);.}../*.** T
17270 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
17280 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63  a no-op unless c
17290 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73  urrently process
172a0 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e 20 51  ing an EXPLAIN Q
172b0 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d  UERY PLAN.** com
172c0 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 71 75 65  mand. If the que
172d0 72 79 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c 65  ry being compile
172e0 64 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20  d is an EXPLAIN 
172f0 51 55 45 52 59 20 50 4c 41 4e 2c 20 61 20 73 69  QUERY PLAN, a si
17300 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69  ngle.** record i
17310 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6f  s added to the o
17320 75 74 70 75 74 20 74 6f 20 64 65 73 63 72 69 62  utput to describ
17330 65 20 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e  e the table scan
17340 20 73 74 72 61 74 65 67 79 20 69 6e 20 0a 2a 2a   strategy in .**
17350 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74   pLevel..*/.stat
17360 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f  ic void explainO
17370 6e 65 53 63 61 6e 28 0a 20 20 50 61 72 73 65 20  neScan(.  Parse 
17380 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
17390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
173a0 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
173b0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
173c0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
173d0 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74 20 74 68  /* Table list th
173e0 69 73 20 6c 6f 6f 70 20 72 65 66 65 72 73 20 74  is loop refers t
173f0 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  o */.  WhereLeve
17400 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20 20  l *pLevel,      
17410 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 74         /* Scan t
17420 6f 20 77 72 69 74 65 20 4f 50 5f 45 78 70 6c 61  o write OP_Expla
17430 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a 2f  in opcode for */
17440 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20  .  int iLevel,  
17450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17460 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
17470 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f  "level" column o
17480 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e  f output */.  in
17490 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
174a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
174b0 20 56 61 6c 75 65 20 66 6f 72 20 22 66 72 6f 6d   Value for "from
174c0 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70  " column of outp
174d0 75 74 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  ut */.  u16 wctr
174e0 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  lFlags          
174f0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
17500 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
17510 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
17520 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
17530 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
17540 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
17550 3d 32 20 29 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  =2 ).#endif.  {.
17560 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
17570 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
17580 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
17590 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
175a0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
175b0 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
175c0 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73  /* VM being cons
175d0 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20 20 73  tructed */.    s
175e0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
175f0 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20  rse->db;     /* 
17600 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
17610 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  */.    char *zMs
17620 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
17630 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20       /* Text to 
17640 61 64 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75  add to EQP outpu
17650 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  t */.    int iId
17660 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65   = pParse->iSele
17670 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74  ctId;  /* Select
17680 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f   id (left-most o
17690 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f  utput column) */
176a0 0a 20 20 20 20 69 6e 74 20 69 73 53 65 61 72 63  .    int isSearc
176b0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
176c0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
176d0 20 53 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66   SEARCH. False f
176e0 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 20 20 20 20  or SCAN. */.    
176f0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
17700 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
17710 20 54 68 65 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67   The controlling
17720 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
17730 74 20 2a 2f 0a 20 20 20 20 75 33 32 20 66 6c 61  t */.    u32 fla
17740 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
17750 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
17760 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68  that describe th
17770 69 73 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20  is loop */..    
17780 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
17790 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 66 6c 61 67  pWLoop;.    flag
177a0 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  s = pLoop->wsFla
177b0 67 73 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61  gs;.    if( (fla
177c0 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f  gs&WHERE_MULTI_O
177d0 52 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67  R) || (wctrlFlag
177e0 73 26 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  s&WHERE_ONETABLE
177f0 5f 4f 4e 4c 59 29 20 29 20 72 65 74 75 72 6e 3b  _ONLY) ) return;
17800 0a 0a 20 20 20 20 69 73 53 65 61 72 63 68 20 3d  ..    isSearch =
17810 20 28 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42   (flags&(WHERE_B
17820 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54  TM_LIMIT|WHERE_T
17830 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20  OP_LIMIT))!=0.  
17840 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66            || ((f
17850 6c 61 67 73 26 57 48 45 52 45 5f 56 49 52 54 55  lags&WHERE_VIRTU
17860 41 4c 54 41 42 4c 45 29 3d 3d 30 20 26 26 20 28  ALTABLE)==0 && (
17870 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
17880 45 71 3e 30 29 29 0a 20 20 20 20 20 20 20 20 20  Eq>0)).         
17890 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67     || (wctrlFlag
178a0 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59  s&(WHERE_ORDERBY
178b0 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52  _MIN|WHERE_ORDER
178c0 42 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a  BY_MAX));..    z
178d0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
178e0 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 69  intf(db, "%s", i
178f0 73 53 65 61 72 63 68 3f 22 53 45 41 52 43 48 22  sSearch?"SEARCH"
17900 3a 22 53 43 41 4e 22 29 3b 0a 20 20 20 20 69 66  :"SCAN");.    if
17910 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
17920 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d   ){.      zMsg =
17930 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
17940 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53  (db, zMsg, "%s S
17950 55 42 51 55 45 52 59 20 25 64 22 2c 20 7a 4d 73  UBQUERY %d", zMs
17960 67 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74  g,pItem->iSelect
17970 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Id);.    }else{.
17980 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
17990 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
179a0 20 7a 4d 73 67 2c 20 22 25 73 20 54 41 42 4c 45   zMsg, "%s TABLE
179b0 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65   %s", zMsg, pIte
179c0 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  m->zName);.    }
179d0 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ..    if( pItem-
179e0 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
179f0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
17a00 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
17a10 2c 20 22 25 73 20 41 53 20 25 73 22 2c 20 7a 4d  , "%s AS %s", zM
17a20 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  sg, pItem->zAlia
17a30 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  s);.    }.    if
17a40 28 20 28 66 6c 61 67 73 20 26 20 28 57 48 45 52  ( (flags & (WHER
17a50 45 5f 49 50 4b 7c 57 48 45 52 45 5f 56 49 52 54  E_IPK|WHERE_VIRT
17a60 55 41 4c 54 41 42 4c 45 29 29 3d 3d 30 0a 20 20  UALTABLE))==0.  
17a70 20 20 20 26 26 20 41 4c 57 41 59 53 28 70 4c 6f     && ALWAYS(pLo
17a80 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
17a90 65 78 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  ex!=0).    ){.  
17aa0 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65      char *zWhere
17ab0 20 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52   = explainIndexR
17ac0 61 6e 67 65 28 64 62 2c 20 70 4c 6f 6f 70 2c 20  ange(db, pLoop, 
17ad0 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  pItem->pTab);.  
17ae0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
17af0 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
17b00 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Msg,.           
17b10 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48      ((flags & WH
17b20 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20  ERE_AUTO_INDEX) 
17b30 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ? .             
17b40 20 20 20 20 20 20 22 25 73 20 55 53 49 4e 47 20        "%s USING 
17b50 41 55 54 4f 4d 41 54 49 43 20 25 73 49 4e 44 45  AUTOMATIC %sINDE
17b60 58 25 2e 30 73 25 73 22 20 3a 0a 20 20 20 20 20  X%.0s%s" :.     
17b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25                "%
17b80 73 20 55 53 49 4e 47 20 25 73 49 4e 44 45 58 20  s USING %sINDEX 
17b90 25 73 25 73 22 29 2c 20 0a 20 20 20 20 20 20 20  %s%s"), .       
17ba0 20 20 20 20 20 20 20 20 7a 4d 73 67 2c 20 28 28          zMsg, ((
17bb0 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  flags & WHERE_ID
17bc0 58 5f 4f 4e 4c 59 29 20 3f 20 22 43 4f 56 45 52  X_ONLY) ? "COVER
17bd0 49 4e 47 20 22 20 3a 20 22 22 29 2c 0a 20 20 20  ING " : ""),.   
17be0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
17bf0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
17c00 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 57 68 65 72 65  x->zName, zWhere
17c10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17c20 44 62 46 72 65 65 28 64 62 2c 20 7a 57 68 65 72  DbFree(db, zWher
17c30 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  e);.    }else if
17c40 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45  ( (flags & WHERE
17c50 5f 49 50 4b 29 21 3d 30 20 26 26 20 28 66 6c 61  _IPK)!=0 && (fla
17c60 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54  gs & WHERE_CONST
17c70 52 41 49 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20  RAINT)!=0 ){.   
17c80 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
17c90 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
17ca0 73 67 2c 20 22 25 73 20 55 53 49 4e 47 20 49 4e  sg, "%s USING IN
17cb0 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
17cc0 59 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20  Y", zMsg);..    
17cd0 20 20 69 66 28 20 66 6c 61 67 73 26 28 57 48 45    if( flags&(WHE
17ce0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
17cf0 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b  RE_COLUMN_IN) ){
17d00 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
17d10 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
17d20 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72  db, zMsg, "%s (r
17d30 6f 77 69 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b  owid=?)", zMsg);
17d40 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
17d50 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 42 4f   (flags&WHERE_BO
17d60 54 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45  TH_LIMIT)==WHERE
17d70 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20  _BOTH_LIMIT ){. 
17d80 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
17d90 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
17da0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77  , zMsg, "%s (row
17db0 69 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f  id>? AND rowid<?
17dc0 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
17dd0 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
17de0 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  &WHERE_BTM_LIMIT
17df0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
17e00 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
17e10 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
17e20 20 28 72 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73   (rowid>?)", zMs
17e30 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
17e40 69 66 28 20 41 4c 57 41 59 53 28 66 6c 61 67 73  if( ALWAYS(flags
17e50 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  &WHERE_TOP_LIMIT
17e60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  ) ){.        zMs
17e70 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
17e80 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
17e90 73 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d  s (rowid<?)", zM
17ea0 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sg);.      }.   
17eb0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
17ec0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
17ed0 42 4c 45 0a 20 20 20 20 65 6c 73 65 20 69 66 28  BLE.    else if(
17ee0 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f   (flags & WHERE_
17ef0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
17f00 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d   ){.      zMsg =
17f10 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
17f20 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56  (db, zMsg, "%s V
17f30 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44  IRTUAL TABLE IND
17f40 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c  EX %d:%s", zMsg,
17f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17f60 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62     pLoop->u.vtab
17f70 2e 69 64 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e  .idxNum, pLoop->
17f80 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
17f90 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
17fa0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
17fb0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
17fc0 2c 20 22 25 73 22 2c 20 7a 4d 73 67 29 3b 0a 20  , "%s", zMsg);. 
17fd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17fe0 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
17ff0 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c  in, iId, iLevel,
18000 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34   iFrom, zMsg, P4
18010 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
18020 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
18030 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75  explainOneScan(u
18040 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64  ,v,w,x,y,z).#end
18050 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
18060 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f  T_EXPLAIN */.../
18070 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
18080 64 65 20 66 6f 72 20 74 68 65 20 73 74 61 72 74  de for the start
18090 20 6f 66 20 74 68 65 20 69 4c 65 76 65 6c 2d 74   of the iLevel-t
180a0 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57 48  h loop in the WH
180b0 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d  ERE clause.** im
180c0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73  plementation des
180d0 63 72 69 62 65 64 20 62 79 20 70 57 49 6e 66 6f  cribed by pWInfo
180e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d  ..*/.static Bitm
180f0 61 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53  ask codeOneLoopS
18100 74 61 72 74 28 0a 20 20 57 68 65 72 65 49 6e 66  tart(.  WhereInf
18110 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20  o *pWInfo,   /* 
18120 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61  Complete informa
18130 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57  tion about the W
18140 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
18150 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20   int iLevel,    
18160 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c        /* Which l
18170 65 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e  evel of pWInfo->
18180 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  a[] should be co
18190 64 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ded */.  Bitmask
181a0 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a   notReady     /*
181b0 20 57 68 69 63 68 20 74 61 62 6c 65 73 20 61 72   Which tables ar
181c0 65 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  e currently avai
181d0 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lable */.){.  in
181e0 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20  t j, k;         
181f0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
18200 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ers */.  int iCu
18210 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
18220 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
18230 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a   for the table *
18240 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b  /.  int addrNxt;
18250 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
18260 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e  e to jump to con
18270 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e  tinue with the n
18280 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20  ext IN case */. 
18290 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20   int omitTable; 
182a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
182b0 20 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65   we use the inde
182c0 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  x only */.  int 
182d0 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  bRev;           
182e0 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e   /* True if we n
182f0 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72  eed to scan in r
18300 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
18310 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
18320 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68  evel;  /* The wh
18330 65 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20  ere level to be 
18340 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  coded */.  Where
18350 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
18360 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70  /* The WhereLoop
18370 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 63 6f   object being co
18380 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ded */.  WhereCl
18390 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a  ause *pWC;    /*
183a0 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f   Decomposition o
183b0 66 20 74 68 65 20 65 6e 74 69 72 65 20 57 48 45  f the entire WHE
183c0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
183d0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
183e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
183f0 2a 20 41 20 57 48 45 52 45 20 63 6c 61 75 73 65  * A WHERE clause
18400 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65   term */.  Parse
18410 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
18420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
18430 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
18440 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
18450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18460 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
18470 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56  onnection */.  V
18480 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
18490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
184a0 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
184b0 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tmt under constr
184c0 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72  uctions */.  str
184d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
184e0 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20   *pTabItem;  /* 
184f0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
18500 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
18510 20 20 69 6e 74 20 61 64 64 72 42 72 6b 3b 20 20    int addrBrk;  
18520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18530 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
18540 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
18550 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
18560 20 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20 20   addrCont;      
18570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18580 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
18590 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20  tinue with next 
185a0 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  cycle */.  int i
185b0 52 6f 77 69 64 52 65 67 20 3d 20 30 3b 20 20 20  RowidReg = 0;   
185c0 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 73       /* Rowid is
185d0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 69 73 20   stored in this 
185e0 72 65 67 69 73 74 65 72 2c 20 69 66 20 6e 6f 74  register, if not
185f0 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69   zero */.  int i
18600 52 65 6c 65 61 73 65 52 65 67 20 3d 20 30 3b 20  ReleaseReg = 0; 
18610 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67       /* Temp reg
18620 69 73 74 65 72 20 74 6f 20 66 72 65 65 20 62 65  ister to free be
18630 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 2a  fore returning *
18640 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  /..  pParse = pW
18650 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
18660 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
18670 65 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e  e;.  pWC = &pWIn
18680 66 6f 2d 3e 73 57 43 3b 0a 20 20 64 62 20 3d 20  fo->sWC;.  db = 
18690 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4c  pParse->db;.  pL
186a0 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
186b0 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f  a[iLevel];.  pLo
186c0 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
186d0 6f 6f 70 3b 0a 20 20 70 54 61 62 49 74 65 6d 20  oop;.  pTabItem 
186e0 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  = &pWInfo->pTabL
186f0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
18700 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20  From];.  iCur = 
18710 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
18720 72 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  r;.  pLevel->not
18730 52 65 61 64 79 20 3d 20 6e 6f 74 52 65 61 64 79  Ready = notReady
18740 20 26 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49   & ~getMask(&pWI
18750 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69  nfo->sMaskSet, i
18760 43 75 72 29 3b 0a 20 20 62 52 65 76 20 3d 20 28  Cur);.  bRev = (
18770 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 3e  pWInfo->revMask>
18780 3e 69 4c 65 76 65 6c 29 26 31 3b 0a 20 20 6f 6d  >iLevel)&1;.  om
18790 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 6f 6f 70  itTable = (pLoop
187a0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
187b0 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a  E_IDX_ONLY)!=0 .
187c0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
187d0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
187e0 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f  s & WHERE_FORCE_
187f0 54 41 42 4c 45 29 3d 3d 30 3b 0a 20 20 56 64 62  TABLE)==0;.  Vdb
18800 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
18810 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52 45 2d  v, "Begin WHERE-
18820 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 69 4c 65 76  loop%d: %s",iLev
18830 65 6c 2c 70 54 61 62 49 74 65 6d 2d 3e 70 54 61  el,pTabItem->pTa
18840 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f  b->zName));..  /
18850 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20  * Create labels 
18860 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22 20  for the "break" 
18870 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69  and "continue" i
18880 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a  nstructions.  **
18890 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
188a0 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20   loop.  Jump to 
188b0 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b  addrBrk to break
188c0 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a   out of a loop..
188d0 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e    ** Jump to con
188e0 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74  t to go immediat
188f0 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ely to the next 
18900 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
18910 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  .  ** loop..  **
18920 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65  .  ** When there
18930 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   is an IN operat
18940 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65  or, we also have
18950 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62   a "addrNxt" lab
18960 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61  el that.  ** mea
18970 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  ns to continue w
18980 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20  ith the next IN 
18990 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f  value combinatio
189a0 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68  n.  When.  ** th
189b0 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70  ere are no IN op
189c0 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63  erators in the c
189d0 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20  onstraints, the 
189e0 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a  "addrNxt" label.
189f0 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65    ** is the same
18a00 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20   as "addrBrk".. 
18a10 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20   */.  addrBrk = 
18a20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20  pLevel->addrBrk 
18a30 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
18a40 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
18a50 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61  akeLabel(v);.  a
18a60 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c  ddrCont = pLevel
18a70 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c  ->addrCont = sql
18a80 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
18a90 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  l(v);..  /* If t
18aa0 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68 74  his is the right
18ab0 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
18ac0 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c   OUTER JOIN, all
18ad0 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69  ocate and.  ** i
18ae0 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f  nitialize a memo
18af0 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63  ry cell that rec
18b00 6f 72 64 73 20 69 66 20 74 68 69 73 20 74 61 62  ords if this tab
18b10 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20  le matches any. 
18b20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c   ** row of the l
18b30 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65  eft table of the
18b40 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66   join..  */.  if
18b50 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e  ( pLevel->iFrom>
18b60 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30  0 && (pTabItem[0
18b70 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
18b80 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  LEFT)!=0 ){.    
18b90 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
18ba0 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
18bb0 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
18bc0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18bd0 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76  Integer, 0, pLev
18be0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
18bf0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
18c00 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a  (v, "init LEFT J
18c10 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61  OIN no-match fla
18c20 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  g"));.  }..  /* 
18c30 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20  Special case of 
18c40 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 73 75  a FROM clause su
18c50 62 71 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e 74  bquery implement
18c60 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69  ed as a co-routi
18c70 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  ne */.  if( pTab
18c80 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69  Item->viaCorouti
18c90 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  ne ){.    int re
18ca0 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65  gYield = pTabIte
18cb0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20  m->regReturn;.  
18cc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18cd0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
18ce0 72 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64  r, pTabItem->add
18cf0 72 46 69 6c 6c 53 75 62 2d 31 2c 20 72 65 67 59  rFillSub-1, regY
18d00 69 65 6c 64 29 3b 0a 20 20 20 20 70 4c 65 76 65  ield);.    pLeve
18d10 6c 2d 3e 70 32 20 3d 20 20 73 71 6c 69 74 65 33  l->p2 =  sqlite3
18d20 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
18d30 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64  _Yield, regYield
18d40 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
18d50 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77  nt((v, "next row
18d60 20 6f 66 20 63 6f 2d 72 6f 75 74 69 6e 65 20 25   of co-routine %
18d70 73 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  s", pTabItem->pT
18d80 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
18d90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18da0 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
18db0 59 69 65 6c 64 2b 31 2c 20 61 64 64 72 42 72 6b  Yield+1, addrBrk
18dc0 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
18dd0 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d  p = OP_Goto;.  }
18de0 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
18df0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
18e00 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70  LTABLE.  if(  (p
18e10 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
18e20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
18e30 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  LE)!=0 ){.    /*
18e40 20 43 61 73 65 20 31 3a 20 20 54 68 65 20 74 61   Case 1:  The ta
18e50 62 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c  ble is a virtual
18e60 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65  -table.  Use the
18e70 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65   VFilter and VNe
18e80 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  xt.    **       
18e90 20 20 20 74 6f 20 61 63 63 65 73 73 20 74 68 65     to access the
18ea0 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
18eb0 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a    int iReg;   /*
18ec0 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50   P3 Value for OP
18ed0 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20  _VFilter */.    
18ee0 69 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64  int addrNotFound
18ef0 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74  ;.    int nConst
18f00 72 61 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e  raint = pLoop->n
18f10 4c 54 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69  LTerm;..    sqli
18f20 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
18f30 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52  (pParse);.    iR
18f40 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
18f50 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
18f60 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b   nConstraint+2);
18f70 0a 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e  .    addrNotFoun
18f80 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  d = pLevel->addr
18f90 42 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  Brk;.    for(j=0
18fa0 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; j<nConstraint;
18fb0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   j++){.      int
18fc0 20 69 54 61 72 67 65 74 20 3d 20 69 52 65 67 2b   iTarget = iReg+
18fd0 6a 2b 32 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  j+2;.      pTerm
18fe0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
18ff0 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [j];.      if( p
19000 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Term==0 ) contin
19010 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ue;.      if( pT
19020 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
19030 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20   WO_IN ){.      
19040 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65    codeEqualityTe
19050 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
19060 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65  , pLevel, j, bRe
19070 76 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20  v, iTarget);.   
19080 20 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e       addrNotFoun
19090 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  d = pLevel->addr
190a0 4e 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Nxt;.      }else
190b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
190c0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
190d0 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  , pTerm->pExpr->
190e0 70 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29  pRight, iTarget)
190f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19100 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19110 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
19120 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74  ger, pLoop->u.vt
19130 61 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29  ab.idxNum, iReg)
19140 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19150 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
19160 74 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69  teger, nConstrai
19170 6e 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20  nt, iReg+1);.   
19180 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19190 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72  p4(v, OP_VFilter
191a0 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46  , iCur, addrNotF
191b0 6f 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20 20  ound, iReg,.    
191c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191d0 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
191e0 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20  idxStr,.        
191f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
19200 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  oop->u.vtab.need
19210 46 72 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54  Free ? P4_MPRINT
19220 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  F : P4_STATIC);.
19230 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61      pLoop->u.vta
19240 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
19250 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
19260 43 6f 6e 73 74 72 61 69 6e 74 20 26 26 20 6a 3c  Constraint && j<
19270 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  16; j++){.      
19280 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74  if( (pLoop->u.vt
19290 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26  ab.omitMask>>j)&
192a0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73  1 ){.        dis
192b0 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
192c0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
192d0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
192e0 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  }.    pLevel->op
192f0 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20   = OP_VNext;.   
19300 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
19310 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ur;.    pLevel->
19320 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p2 = sqlite3Vdbe
19330 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
19340 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
19350 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
19360 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74  se, iReg, nConst
19370 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71  raint+2);.    sq
19380 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
19390 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20  p(pParse, 1);.  
193a0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
193b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
193c0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69  UALTABLE */..  i
193d0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
193e0 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21  gs & WHERE_IPK)!
193f0 3d 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d  =0.   && (pLoop-
19400 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
19410 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52  E_COLUMN_IN|WHER
19420 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30  E_COLUMN_EQ))!=0
19430 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  .  ){.    /* Cas
19440 65 20 32 3a 20 20 57 65 20 63 61 6e 20 64 69 72  e 2:  We can dir
19450 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20  ectly reference 
19460 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69  a single row usi
19470 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20  ng an.    **    
19480 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63        equality c
19490 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
194a0 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
194b0 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20  d.  Or.    **   
194c0 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65         we refere
194d0 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  nce multiple row
194e0 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64  s using a "rowid
194f0 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a   IN (...)".    *
19500 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  *          const
19510 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ruct..    */.   
19520 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
19530 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29  u.btree.nEq==1 )
19540 3b 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52 65  ;.    iReleaseRe
19550 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
19560 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
19570 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70     pTerm = pLoop
19580 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20  ->aLTerm[0];.   
19590 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
195a0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
195b0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30   pTerm->pExpr!=0
195c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
195d0 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
195e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
195f0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
19600 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
19610 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 63     iRowidReg = c
19620 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
19630 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
19640 4c 65 76 65 6c 2c 20 30 2c 20 62 52 65 76 2c 20  Level, 0, bRev, 
19650 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20  iReleaseReg);.  
19660 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76    addrNxt = pLev
19670 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20  el->addrNxt;.   
19680 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19690 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
196a0 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 61  nt, iRowidReg, a
196b0 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 73 71 6c  ddrNxt);.    sql
196c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
196d0 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
196e0 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 69  iCur, addrNxt, i
196f0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 73  RowidReg);.    s
19700 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
19710 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
19720 61 72 73 65 2c 20 69 52 6f 77 69 64 52 65 67 2c  arse, iRowidReg,
19730 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
19740 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
19750 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
19760 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
19770 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
19780 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65   "pk"));.    pLe
19790 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f  vel->op = OP_Noo
197a0 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  p;.  }else if( (
197b0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
197c0 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20   WHERE_IPK)!=0. 
197d0 20 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f          && (pLoo
197e0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
197f0 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29  RE_COLUMN_RANGE)
19800 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  !=0.  ){.    /* 
19810 43 61 73 65 20 33 3a 20 20 57 65 20 68 61 76 65  Case 3:  We have
19820 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63   an inequality c
19830 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
19840 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
19850 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
19860 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f  t testOp = OP_No
19870 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  op;.    int star
19880 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e  t;.    int memEn
19890 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20  dValue = 0;.    
198a0 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72  WhereTerm *pStar
198b0 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61  t, *pEnd;..    a
198c0 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
198d0 3d 3d 30 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30  ==0 );.    j = 0
198e0 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70  ;.    pStart = p
198f0 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  End = 0;.    if(
19900 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
19910 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
19920 54 20 29 20 70 53 74 61 72 74 20 3d 20 70 4c 6f  T ) pStart = pLo
19930 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
19940 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
19950 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
19960 54 4f 50 5f 4c 49 4d 49 54 20 29 20 70 45 6e 64  TOP_LIMIT ) pEnd
19970 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
19980 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61 73 73 65 72  [j++];.    asser
19990 74 28 20 70 53 74 61 72 74 21 3d 30 20 7c 7c 20  t( pStart!=0 || 
199a0 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 69  pEnd!=0 );.    i
199b0 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
199c0 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b   pTerm = pStart;
199d0 0a 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20  .      pStart = 
199e0 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64  pEnd;.      pEnd
199f0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   = pTerm;.    }.
19a00 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29      if( pStart )
19a10 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  {.      Expr *pX
19a20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
19a30 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
19a40 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
19a50 20 73 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a   start bound */.
19a60 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54        int r1, rT
19a70 65 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  emp;        /* R
19a80 65 67 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c  egisters for hol
19a90 64 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 62  ding the start b
19aa0 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20  oundary */..    
19ab0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
19ac0 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73  ng constant maps
19ad0 20 54 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74   TK_xx codes int
19ae0 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  o corresponding 
19af0 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f  .      ** seek o
19b00 70 63 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65  pcodes.  It depe
19b10 6e 64 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75  nds on a particu
19b20 6c 61 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20  lar ordering of 
19b30 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20  TK_xx.      */. 
19b40 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d       const u8 aM
19b50 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  oveOp[] = {.    
19b60 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20         /* TK_GT 
19b70 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20  */  OP_SeekGt,. 
19b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
19b90 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65  LE */  OP_SeekLe
19ba0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
19bb0 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_LT */  OP_See
19bc0 6b 4c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  kLt,.           
19bd0 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f  /* TK_GE */  OP_
19be0 53 65 65 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a  SeekGe.      };.
19bf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
19c00 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20  _LE==TK_GT+1 ); 
19c10 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
19c20 65 20 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e  e the ordering..
19c30 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
19c40 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32  ( TK_LT==TK_GT+2
19c50 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e   );      /*  ...
19c60 20 6f 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61   of the TK_xx va
19c70 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20  lues... */.     
19c80 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
19c90 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20  TK_GT+3 );      
19ca0 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65  /*  ... is corre
19cb0 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 61  cct. */..      a
19cc0 73 73 65 72 74 28 20 28 70 53 74 61 72 74 2d 3e  ssert( (pStart->
19cd0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
19ce0 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  NULL)==0 );.    
19cf0 20 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61    testcase( pSta
19d00 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
19d10 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
19d20 20 20 20 20 70 58 20 3d 20 70 53 74 61 72 74 2d      pX = pStart-
19d30 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
19d40 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20  sert( pX!=0 );. 
19d50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
19d60 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f  Start->leftCurso
19d70 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 74 72  r!=iCur ); /* tr
19d80 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61  ansitive constra
19d90 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 72 31  ints */.      r1
19da0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
19db0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
19dc0 58 2d 3e 70 52 69 67 68 74 2c 20 26 72 54 65 6d  X->pRight, &rTem
19dd0 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
19de0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61  3VdbeAddOp3(v, a
19df0 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b  MoveOp[pX->op-TK
19e00 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61 64 64 72  _GT], iCur, addr
19e10 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Brk, r1);.      
19e20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
19e30 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 73 71  "pk"));.      sq
19e40 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
19e50 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
19e60 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  rse, r1, 1);.   
19e70 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
19e80 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
19e90 20 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 64   rTemp);.      d
19ea0 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
19eb0 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20  l, pStart);.    
19ec0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
19ed0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19ee0 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74  , bRev ? OP_Last
19ef0 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43   : OP_Rewind, iC
19f00 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20  ur, addrBrk);.  
19f10 20 20 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64    }.    if( pEnd
19f20 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
19f30 70 58 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70  pX;.      pX = p
19f40 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  End->pExpr;.    
19f50 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
19f60 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
19f70 20 28 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20   (pEnd->wtFlags 
19f80 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
19f90 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
19fa0 73 65 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75  se( pEnd->leftCu
19fb0 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a  rsor!=iCur ); /*
19fc0 20 54 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73   Transitive cons
19fd0 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20  traints */.     
19fe0 20 74 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d   testcase( pEnd-
19ff0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1a000 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
1a010 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b   memEndValue = +
1a020 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1a030 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1a040 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d  Code(pParse, pX-
1a050 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56  >pRight, memEndV
1a060 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28  alue);.      if(
1a070 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c   pX->op==TK_LT |
1a080 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  | pX->op==TK_GT 
1a090 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  ){.        testO
1a0a0 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65  p = bRev ? OP_Le
1a0b0 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20   : OP_Ge;.      
1a0c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74  }else{.        t
1a0d0 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
1a0e0 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20  P_Lt : OP_Gt;.  
1a0f0 20 20 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61      }.      disa
1a100 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1a110 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pEnd);.    }.   
1a120 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
1a130 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1a140 76 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  v);.    pLevel->
1a150 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50  op = bRev ? OP_P
1a160 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20  rev : OP_Next;. 
1a170 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1a180 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
1a190 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20  ->p2 = start;.  
1a1a0 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
1a1b0 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ->p5==0 );.    i
1a1c0 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f  f( testOp!=OP_No
1a1d0 6f 70 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77  op ){.      iRow
1a1e0 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65  idReg = iRelease
1a1f0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
1a200 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1a210 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a220 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
1a230 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77  owid, iCur, iRow
1a240 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  idReg);.      sq
1a250 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
1a260 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72  ore(pParse, iCur
1a270 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29  , -1, iRowidReg)
1a280 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1a290 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73  dbeAddOp3(v, tes
1a2a0 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65  tOp, memEndValue
1a2b0 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f 77 69  , addrBrk, iRowi
1a2c0 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
1a2d0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
1a2e0 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  (v, SQLITE_AFF_N
1a2f0 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f  UMERIC | SQLITE_
1a300 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
1a310 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
1a320 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1a330 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b  WHERE_INDEXED ){
1a340 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20  .    /* Case 4: 
1a350 41 20 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20  A scan using an 
1a360 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  index..    **.  
1a370 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65    **         The
1a380 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61   WHERE clause ma
1a390 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f  y contain zero o
1a3a0 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20  r more equality 
1a3b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1a3c0 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22  terms ("==" or "
1a3d0 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74  IN" operators) t
1a3e0 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
1a3f0 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   N.    **       
1a400 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75    left-most colu
1a410 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
1a420 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f  . It may also co
1a430 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20  ntain.    **    
1a440 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20       inequality 
1a450 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20  constraints (>, 
1a460 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20  <, >= or <=) on 
1a470 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20  the indexed.    
1a480 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  **         colum
1a490 6e 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65  n that immediate
1a4a0 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e  ly follows the N
1a4b0 20 65 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c   equalities. Onl
1a4c0 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  y .    **       
1a4d0 20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74    the right-most
1a4e0 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61   column can be a
1a4f0 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74  n inequality - t
1a500 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20  he rest must.   
1a510 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65 20   **         use 
1a520 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e  the "==" and "IN
1a530 22 20 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72  " operators. For
1a540 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
1a550 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
1a560 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c   index is on (x,
1a570 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66  y,z), then the f
1a580 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73  ollowing clauses
1a590 20 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a   are all .    **
1a5a0 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a           optimiz
1a5b0 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed:.    **.    *
1a5c0 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1a5d0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1a5e0 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a     x=5 AND y=10.
1a5f0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1a600 20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20    x=5 AND y<10. 
1a610 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1a620 20 78 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44   x=5 AND y>5 AND
1a630 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20   y<10.    **    
1a640 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
1a650 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20  y=5 AND z<=10.  
1a660 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1a670 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72      The z<10 ter
1a680 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  m of the followi
1a690 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  ng cannot be use
1a6a0 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20  d, only.    **  
1a6b0 20 20 20 20 20 20 20 74 68 65 20 78 3d 35 20 74         the x=5 t
1a6c0 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  erm:.    **.    
1a6d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
1a6e0 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a  5 AND z<10.    *
1a6f0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1a700 20 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69   N may be zero i
1a710 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71  f there are ineq
1a720 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1a730 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ts..    **      
1a740 20 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20     If there are 
1a750 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  no inequality co
1a760 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20  nstraints, then 
1a770 4e 20 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20  N is at.    **  
1a780 20 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65         least one
1a790 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1a7a0 20 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73          This cas
1a7b0 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77  e is also used w
1a7c0 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
1a7d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20   WHERE clause.  
1a7e0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e    **         con
1a7f0 73 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20  straints but an 
1a800 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65  index is selecte
1a810 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64  d anyway, in ord
1a820 65 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  er.    **       
1a830 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f    to force the o
1a840 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63  utput order to c
1a850 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44  onform to an ORD
1a860 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a  ER BY..    */  .
1a870 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1a880 20 75 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d   u8 aStartOp[] =
1a890 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20   {.      0,.    
1a8a0 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65    0,.      OP_Re
1a8b0 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  wind,           
1a8c0 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 2: (!start_co
1a8d0 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
1a8e0 72 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20  rtEq &&  !bRev) 
1a8f0 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74  */.      OP_Last
1a900 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1a910 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73   3: (!start_cons
1a920 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74  traints && start
1a930 45 71 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f  Eq &&   bRev) */
1a940 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 74  .      OP_SeekGt
1a950 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  ,           /* 4
1a960 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
1a970 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45  ints  && !startE
1a980 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  q && !bRev) */. 
1a990 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20       OP_SeekLt, 
1a9a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20            /* 5: 
1a9b0 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1a9c0 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20  ts  && !startEq 
1a9d0 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &&  bRev) */.   
1a9e0 20 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20     OP_SeekGe,   
1a9f0 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73          /* 6: (s
1aa00 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1aa10 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26    &&  startEq &&
1aa20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
1aa30 20 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20 20 20   OP_SeekLe      
1aa40 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61        /* 7: (sta
1aa50 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
1aa60 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20  &&  startEq &&  
1aa70 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a  bRev) */.    };.
1aa80 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1aa90 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b   u8 aEndOp[] = {
1aaa0 0a 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20  .      OP_Noop, 
1aab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
1aac0 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69  : (!end_constrai
1aad0 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  nts) */.      OP
1aae0 5f 49 64 78 47 45 2c 20 20 20 20 20 20 20 20 20  _IdxGE,         
1aaf0 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f     /* 1: (end_co
1ab00 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21 62 52  nstraints && !bR
1ab10 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1ab20 49 64 78 4c 54 20 20 20 20 20 20 20 20 20 20 20  IdxLT           
1ab30 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e    /* 2: (end_con
1ab40 73 74 72 61 69 6e 74 73 20 26 26 20 62 52 65 76  straints && bRev
1ab50 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  ) */.    };.    
1ab60 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  u16 nEq = pLoop-
1ab70 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20 20 20  >u.btree.nEq;   
1ab80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d    /* Number of =
1ab90 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f  = or IN terms */
1aba0 0a 20 20 20 20 69 6e 74 20 69 73 4d 69 6e 51 75  .    int isMinQu
1abb0 65 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ery = 0;        
1abc0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1abd0 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c  an optimized SEL
1abe0 45 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a  ECT min(x).. */.
1abf0 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b      int regBase;
1ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac10 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
1ac20 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72  r holding constr
1ac30 61 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20  aint values */. 
1ac40 20 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20     int r1;      
1ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac60 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72  /* Temp register
1ac70 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
1ac80 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d  m *pRangeStart =
1ac90 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69   0;  /* Inequali
1aca0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74  ty constraint at
1acb0 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a   range start */.
1acc0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1acd0 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20  RangeEnd = 0;   
1ace0 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63   /* Inequality c
1acf0 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e  onstraint at ran
1ad00 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e  ge end */.    in
1ad10 74 20 73 74 61 72 74 45 71 3b 20 20 20 20 20 20  t startEq;      
1ad20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1ad30 75 65 20 69 66 20 72 61 6e 67 65 20 73 74 61 72  ue if range star
1ad40 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72  t uses ==, >= or
1ad50 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65   <= */.    int e
1ad60 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  ndEq;           
1ad70 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1ad80 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65  if range end use
1ad90 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a  s ==, >= or <= *
1ada0 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f  /.    int start_
1adb0 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20  constraints;    
1adc0 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72     /* Start of r
1add0 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69  ange is constrai
1ade0 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ned */.    int n
1adf0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20  Constraint;     
1ae00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ae10 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20  r of constraint 
1ae20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64  terms */.    Ind
1ae30 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
1ae40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ae50 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62   index we will b
1ae60 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69  e using */.    i
1ae70 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20  nt iIdxCur;     
1ae80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ae90 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
1aea0 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  or the index */.
1aeb0 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65      int nExtraRe
1aec0 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
1aed0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
1aee0 74 72 61 20 72 65 67 69 73 74 65 72 73 20 6e 65  tra registers ne
1aef0 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  eded */.    int 
1af00 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
1af10 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74           /* Inst
1af20 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ruction opcode *
1af30 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61  /.    char *zSta
1af40 72 74 41 66 66 3b 20 20 20 20 20 20 20 20 20 20  rtAff;          
1af50 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66     /* Affinity f
1af60 6f 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67  or start of rang
1af70 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
1af80 20 20 20 20 63 68 61 72 20 63 45 6e 64 41 66 66      char cEndAff
1af90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1afa0 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72   /* Affinity for
1afb0 20 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f   end of range co
1afc0 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 0a 20 20 20  nstraint */..   
1afd0 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75   pIdx = pLoop->u
1afe0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
1aff0 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65     iIdxCur = pLe
1b000 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
1b010 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 70    assert( nEq>=p
1b020 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53  Loop->u.btree.nS
1b030 6b 69 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  kip );..    /* I
1b040 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74 69  f this loop sati
1b050 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72 64  sfies a sort ord
1b060 65 72 20 28 70 4f 72 64 65 72 42 79 29 20 72 65  er (pOrderBy) re
1b070 71 75 65 73 74 20 74 68 61 74 20 0a 20 20 20 20  quest that .    
1b080 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20 74 6f  ** was passed to
1b090 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74   this function t
1b0a0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53  o implement a "S
1b0b0 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e  ELECT min(x) ...
1b0c0 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2c  " .    ** query,
1b0d0 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
1b0e0 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77   will only allow
1b0f0 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e   the loop to run
1b100 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73 69   for.    ** a si
1b110 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20  ngle iteration. 
1b120 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
1b130 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 72 65  the first row re
1b140 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68  turned.    ** sh
1b150 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20  ould not have a 
1b160 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65  NULL value store
1b170 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c  d in 'x'. If col
1b180 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20 2a  umn 'x' is.    *
1b190 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20  * the first one 
1b1a0 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 65 71  after the nEq eq
1b1b0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1b1c0 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c  ts in the index,
1b1d0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71  .    ** this req
1b1e0 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69  uires some speci
1b1f0 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20  al handling..   
1b200 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 57 49   */.    if( (pWI
1b210 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26  nfo->wctrlFlags&
1b220 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
1b230 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  N)!=0.     && (p
1b240 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 21 3d 30  WInfo->bOBSat!=0
1b250 29 0a 20 20 20 20 20 26 26 20 28 70 49 64 78 2d  ).     && (pIdx-
1b260 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 71 29 0a 20 20  >nKeyCol>nEq).  
1b270 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72    ){.      asser
1b280 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  t( pLoop->u.btre
1b290 65 2e 6e 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20  e.nSkip==0 );.  
1b2a0 20 20 20 20 69 73 4d 69 6e 51 75 65 72 79 20 3d      isMinQuery =
1b2b0 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   1;.      nExtra
1b2c0 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Reg = 1;.    }..
1b2d0 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20      /* Find any 
1b2e0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1b2f0 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20  raint terms for 
1b300 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e  the start and en
1b310 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  d .    ** of the
1b320 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a   range. .    */.
1b330 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20 20      j = nEq;.   
1b340 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1b350 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
1b360 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70  LIMIT ){.      p
1b370 52 61 6e 67 65 53 74 61 72 74 20 3d 20 70 4c 6f  RangeStart = pLo
1b380 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
1b390 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
1b3a0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
1b3b0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1b3c0 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
1b3d0 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52  IMIT ){.      pR
1b3e0 61 6e 67 65 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d  angeEnd = pLoop-
1b3f0 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
1b400 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
1b410 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
1b420 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1b430 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63  o evaluate all c
1b440 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
1b450 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20  using == or IN. 
1b460 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20     ** and store 
1b470 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68  the values of th
1b480 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20  ose terms in an 
1b490 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
1b4a0 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  rs.    ** starti
1b4b0 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a 20  ng at regBase.. 
1b4c0 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 42 61 73     */.    regBas
1b4d0 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c  e = codeAllEqual
1b4e0 69 74 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c  ityTerms(pParse,
1b4f0 70 4c 65 76 65 6c 2c 62 52 65 76 2c 6e 45 78 74  pLevel,bRev,nExt
1b500 72 61 52 65 67 2c 26 7a 53 74 61 72 74 41 66 66  raReg,&zStartAff
1b510 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  );.    assert( z
1b520 53 74 61 72 74 41 66 66 3d 3d 30 20 7c 7c 20 73  StartAff==0 || s
1b530 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1b540 53 74 61 72 74 41 66 66 29 3e 3d 6e 45 71 20 29  StartAff)>=nEq )
1b550 3b 0a 20 20 20 20 69 66 28 20 7a 53 74 61 72 74  ;.    if( zStart
1b560 41 66 66 20 29 20 63 45 6e 64 41 66 66 20 3d 20  Aff ) cEndAff = 
1b570 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 3b 0a  zStartAff[nEq];.
1b580 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c      addrNxt = pL
1b590 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a  evel->addrNxt;..
1b5a0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
1b5b0 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65   doing a reverse
1b5c0 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61   order scan on a
1b5d0 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
1b5e0 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66  x, or.    ** a f
1b5f0 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73 63 61  orward order sca
1b600 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e  n on a descendin
1b610 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68  g index, interch
1b620 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  ange the .    **
1b630 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74   start and end t
1b640 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72  erms (pRangeStar
1b650 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29  t and pRangeEnd)
1b660 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1b670 20 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 4b 65 79   (nEq<pIdx->nKey
1b680 43 6f 6c 20 26 26 20 62 52 65 76 3d 3d 28 70 49  Col && bRev==(pI
1b690 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  dx->aSortOrder[n
1b6a0 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  Eq]==SQLITE_SO_A
1b6b0 53 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52  SC)).     || (bR
1b6c0 65 76 20 26 26 20 70 49 64 78 2d 3e 6e 4b 65 79  ev && pIdx->nKey
1b6d0 43 6f 6c 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b  Col==nEq).    ){
1b6e0 0a 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72  .      SWAP(Wher
1b6f0 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45  eTerm *, pRangeE
1b700 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29  nd, pRangeStart)
1b710 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73  ;.    }..    tes
1b720 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
1b730 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74 61  rt && (pRangeSta
1b740 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
1b750 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20  WO_LE)!=0 );.   
1b760 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
1b770 65 53 74 61 72 74 20 26 26 20 28 70 52 61 6e 67  eStart && (pRang
1b780 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
1b790 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b  r & WO_GE)!=0 );
1b7a0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1b7b0 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61  RangeEnd && (pRa
1b7c0 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
1b7d0 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b  r & WO_LE)!=0 );
1b7e0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1b7f0 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61  RangeEnd && (pRa
1b800 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
1b810 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b  r & WO_GE)!=0 );
1b820 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 21  .    startEq = !
1b830 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 70  pRangeStart || p
1b840 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
1b850 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57  rator & (WO_LE|W
1b860 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45 71  O_GE);.    endEq
1b870 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64 20   =   !pRangeEnd 
1b880 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  || pRangeEnd->eO
1b890 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45  perator & (WO_LE
1b8a0 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74 61  |WO_GE);.    sta
1b8b0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d  rt_constraints =
1b8c0 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20   pRangeStart || 
1b8d0 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  nEq>0;..    /* S
1b8e0 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63 75  eek the index cu
1b8f0 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rsor to the star
1b900 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  t of the range. 
1b910 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  */.    nConstrai
1b920 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66  nt = nEq;.    if
1b930 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 29 7b  ( pRangeStart ){
1b940 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
1b950 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74 61 72  ght = pRangeStar
1b960 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t->pExpr->pRight
1b970 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1b980 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1b990 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
1b9a0 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nEq);.      if( 
1b9b0 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74  (pRangeStart->wt
1b9c0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
1b9d0 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LL)==0 ){.      
1b9e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1b9f0 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70  eIsNullJump(v, p
1ba00 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e  Right, regBase+n
1ba10 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  Eq, addrNxt);.  
1ba20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1ba30 7a 53 74 61 72 74 41 66 66 20 29 7b 0a 20 20 20  zStartAff ){.   
1ba40 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1ba50 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
1ba60 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66  pRight, zStartAf
1ba70 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f  f[nEq])==SQLITE_
1ba80 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20  AFF_NONE){.     
1ba90 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68       /* Since th
1baa0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  e comparison is 
1bab0 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  to be performed 
1bac0 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69  with no conversi
1bad0 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ons.          **
1bae0 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20   applied to the 
1baf0 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68  operands, set th
1bb00 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70  e affinity to ap
1bb10 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f  ply to pRight to
1bb20 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53   .          ** S
1bb30 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20  QLITE_AFF_NONE. 
1bb40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 53   */.          zS
1bb50 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53  tartAff[nEq] = S
1bb60 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
1bb70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bb80 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1bb90 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79  rNeedsNoAffinity
1bba0 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a  Change(pRight, z
1bbb0 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 20 29  StartAff[nEq]) )
1bbc0 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61  {.          zSta
1bbd0 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c  rtAff[nEq] = SQL
1bbe0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
1bbf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
1bc00 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61   .      nConstra
1bc10 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73  int++;.      tes
1bc20 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
1bc30 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
1bc40 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
1bc50 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4d 69    }else if( isMi
1bc60 6e 51 75 65 72 79 20 29 7b 0a 20 20 20 20 20 20  nQuery ){.      
1bc70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bc80 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1bc90 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
1bca0 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
1bcb0 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45  ++;.      startE
1bcc0 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61  q = 0;.      sta
1bcd0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d  rt_constraints =
1bce0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f   1;.    }.    co
1bcf0 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
1bd00 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
1bd10 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 7a 53   nConstraint, zS
1bd20 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 6f 70  tartAff);.    op
1bd30 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61   = aStartOp[(sta
1bd40 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c  rt_constraints<<
1bd50 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31  2) + (startEq<<1
1bd60 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61  ) + bRev];.    a
1bd70 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a  ssert( op!=0 );.
1bd80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1bd90 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20  ==OP_Rewind );. 
1bda0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1bdb0 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20  =OP_Last );.    
1bdc0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
1bdd0 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 74  _SeekGt );.    t
1bde0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1bdf0 53 65 65 6b 47 65 20 29 3b 0a 20 20 20 20 74 65  SeekGe );.    te
1be00 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
1be10 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65 73  eekLe );.    tes
1be20 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
1be30 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c 69  ekLt );.    sqli
1be40 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
1be50 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c  (v, op, iIdxCur,
1be60 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73   addrNxt, regBas
1be70 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  e, nConstraint);
1be80 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
1be90 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
1bea0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1beb0 72 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64  raint at the end
1bec0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   of the.    ** r
1bed0 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20  ange (if any).. 
1bee0 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74     */.    nConst
1bef0 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20  raint = nEq;.   
1bf00 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29   if( pRangeEnd )
1bf10 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
1bf20 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e 64  ight = pRangeEnd
1bf30 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
1bf40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1bf50 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
1bf60 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45  arse, regBase+nE
1bf70 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  q, 1);.      sql
1bf80 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1bf90 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67  rse, pRight, reg
1bfa0 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
1bfb0 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64 2d   if( (pRangeEnd-
1bfc0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1bfd0 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VNULL)==0 ){.   
1bfe0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1bff0 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76  CodeIsNullJump(v
1c000 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
1c010 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b  e+nEq, addrNxt);
1c020 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1c030 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
1c040 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
1c050 2c 20 63 45 6e 64 41 66 66 29 21 3d 53 51 4c 49  , cEndAff)!=SQLI
1c060 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 20 20 20 20  TE_AFF_NONE.    
1c070 20 20 20 26 26 20 21 73 71 6c 69 74 65 33 45 78     && !sqlite3Ex
1c080 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
1c090 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
1c0a0 63 45 6e 64 41 66 66 29 0a 20 20 20 20 20 20 29  cEndAff).      )
1c0b0 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 41 70  {.        codeAp
1c0c0 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72  plyAffinity(pPar
1c0d0 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  se, regBase+nEq,
1c0e0 20 31 2c 20 26 63 45 6e 64 41 66 66 29 3b 0a 20   1, &cEndAff);. 
1c0f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 6f       }.      nCo
1c100 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20  nstraint++;.    
1c110 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
1c120 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26  geEnd->wtFlags &
1c130 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1c140 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1c150 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74  e3DbFree(db, zSt
1c160 61 72 74 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a  artAff);..    /*
1c170 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   Top of the loop
1c180 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65   body */.    pLe
1c190 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65  vel->p2 = sqlite
1c1a0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1c1b0 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (v);..    /* Che
1c1c0 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ck if the index 
1c1d0 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74  cursor is past t
1c1e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61  he end of the ra
1c1f0 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d  nge. */.    op =
1c200 20 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45   aEndOp[(pRangeE
1c210 6e 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20  nd || nEq) * (1 
1c220 2b 20 62 52 65 76 29 5d 3b 0a 20 20 20 20 74 65  + bRev)];.    te
1c230 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e  stcase( op==OP_N
1c240 6f 6f 70 20 29 3b 0a 20 20 20 20 74 65 73 74 63  oop );.    testc
1c250 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47  ase( op==OP_IdxG
1c260 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
1c270 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20  e( op==OP_IdxLT 
1c280 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 4f  );.    if( op!=O
1c290 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
1c2a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c2b0 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
1c2c0 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
1c2d0 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
1c2e0 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
1c2f0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1c300 2c 20 65 6e 64 45 71 21 3d 62 52 65 76 20 3f 31  , endEq!=bRev ?1
1c310 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  :0);.    }..    
1c320 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
1c330 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1c340 72 61 69 6e 74 73 2c 20 63 68 65 63 6b 20 74 68  raints, check th
1c350 61 74 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20  at the value.   
1c360 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
1c370 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
1c380 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 74   inequality cont
1c390 72 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c  rains is not NUL
1c3a0 4c 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69 74 20  L..    ** If it 
1c3b0 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  is, jump to the 
1c3c0 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
1c3d0 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20  f the loop..    
1c3e0 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69  */.    r1 = sqli
1c3f0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
1c400 61 72 73 65 29 3b 0a 20 20 20 20 74 65 73 74 63  arse);.    testc
1c410 61 73 65 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  ase( pLoop->wsFl
1c420 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
1c430 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 74 65 73  LIMIT );.    tes
1c440 74 63 61 73 65 28 20 70 4c 6f 6f 70 2d 3e 77 73  tcase( pLoop->ws
1c450 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
1c460 50 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 69  P_LIMIT );.    i
1c470 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
1c480 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f  gs & (WHERE_BTM_
1c490 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
1c4a0 4c 49 4d 49 54 29 29 21 3d 30 20 0a 20 20 20 20  LIMIT))!=0 .    
1c4b0 20 26 26 20 28 6a 20 3d 20 70 49 64 78 2d 3e 61   && (j = pIdx->a
1c4c0 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 3e 3d 30  iColumn[nEq])>=0
1c4d0 20 0a 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e   .     && pIdx->
1c4e0 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e  pTable->aCol[j].
1c4f0 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 0a 20 20 20 20  notNull==0 .    
1c500 20 26 26 20 28 6e 45 71 20 7c 7c 20 28 70 4c 6f   && (nEq || (pLo
1c510 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1c520 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 3d 3d  ERE_BTM_LIMIT)==
1c530 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
1c540 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c550 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
1c560 69 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72 31  iIdxCur, nEq, r1
1c570 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1c580 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
1c590 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
1c5a0 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20  l[j].zName));.  
1c5b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c5c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
1c5d0 6c 6c 2c 20 72 31 2c 20 61 64 64 72 43 6f 6e 74  ll, r1, addrCont
1c5e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1c5f0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1c600 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
1c610 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65  .    /* Seek the
1c620 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69   table cursor, i
1c630 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
1c640 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
1c650 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72  evel, pRangeStar
1c660 74 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54  t);.    disableT
1c670 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e  erm(pLevel, pRan
1c680 67 65 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20  geEnd);.    if( 
1c690 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20  omitTable ){.   
1c6a0 20 20 20 2f 2a 20 70 49 64 78 20 69 73 20 61 20     /* pIdx is a 
1c6b0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20  covering index. 
1c6c0 20 4e 6f 20 6e 65 65 64 20 74 6f 20 61 63 63 65   No need to acce
1c6d0 73 73 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  ss the main tabl
1c6e0 65 2e 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20  e. */.    }else 
1c6f0 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 49 64  if( HasRowid(pId
1c700 78 2d 3e 70 54 61 62 6c 65 29 20 29 7b 0a 20 20  x->pTable) ){.  
1c710 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
1c720 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71  iReleaseReg = sq
1c730 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1c740 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
1c750 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1c760 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
1c770 20 69 49 64 78 43 75 72 2c 20 69 52 6f 77 69 64   iIdxCur, iRowid
1c780 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
1c790 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
1c7a0 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
1c7b0 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
1c7c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c7d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
1c7e0 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64  ek, iCur, iRowid
1c7f0 52 65 67 29 3b 20 20 2f 2a 20 44 65 66 65 72 72  Reg);  /* Deferr
1c800 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d  ed seek */.    }
1c810 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
1c820 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33  x *pPk = sqlite3
1c830 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
1c840 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 3b 0a 20  pIdx->pTable);. 
1c850 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d       iRowidReg =
1c860 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1c870 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 50 6b  ange(pParse, pPk
1c880 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20  ->nKeyCol);.    
1c890 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b    for(j=0; j<pPk
1c8a0 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b  ->nKeyCol; j++){
1c8b0 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 73 71 6c  .        k = sql
1c8c0 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
1c8d0 78 28 70 49 64 78 2c 20 70 50 6b 2d 3e 61 69 43  x(pIdx, pPk->aiC
1c8e0 6f 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20 20 20 20 20  olumn[j]);.     
1c8f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c900 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
1c910 6e 2c 20 69 49 64 78 43 75 72 2c 20 6b 2c 20 69  n, iIdxCur, k, i
1c920 52 6f 77 69 64 52 65 67 2b 6a 29 3b 0a 20 20 20  RowidReg+j);.   
1c930 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1c940 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1c950 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
1c960 69 43 75 72 2c 20 61 64 64 72 43 6f 6e 74 2c 0a  iCur, addrCont,.
1c970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c980 20 20 20 20 20 20 20 20 20 20 20 69 52 6f 77 69             iRowi
1c990 64 52 65 67 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43  dReg, pPk->nKeyC
1c9a0 6f 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ol);.    }..    
1c9b0 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e  /* Record the in
1c9c0 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74  struction used t
1c9d0 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
1c9e0 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20  loop. Disable . 
1c9f0 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75     ** WHERE clau
1ca00 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65  se terms made re
1ca10 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69  dundant by the i
1ca20 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e  ndex range scan.
1ca30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1ca40 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1ca50 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 29 7b   WHERE_ONEROW ){
1ca60 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
1ca70 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
1ca80 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20   }else if( bRev 
1ca90 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
1caa0 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20  >op = OP_Prev;. 
1cab0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cac0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
1cad0 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
1cae0 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64  pLevel->p1 = iId
1caf0 78 43 75 72 3b 0a 20 20 20 20 69 66 28 20 28 70  xCur;.    if( (p
1cb00 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1cb10 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54  WHERE_CONSTRAINT
1cb20 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  )==0 ){.      pL
1cb30 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54  evel->p5 = SQLIT
1cb40 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
1cb50 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20  LSCAN_STEP;.    
1cb60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1cb70 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d  ert( pLevel->p5=
1cb80 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  =0 );.    }.  }e
1cb90 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  lse..#ifndef SQL
1cba0 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
1cbb0 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 70  MIZATION.  if( p
1cbc0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1cbd0 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29  WHERE_MULTI_OR )
1cbe0 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a  {.    /* Case 5:
1cbf0 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65    Two or more se
1cc00 70 61 72 61 74 65 6c 79 20 69 6e 64 65 78 65 64  parately indexed
1cc10 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64   terms connected
1cc20 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20   by OR.    **.  
1cc30 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
1cc40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52    **.    **   CR
1cc50 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
1cc60 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20  b,c,d);.    **  
1cc70 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
1cc80 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20 20 2a   ON t1(a);.    *
1cc90 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
1cca0 20 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20   i2 ON t1(b);.  
1ccb0 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e    **   CREATE IN
1ccc0 44 45 58 20 69 33 20 4f 4e 20 74 31 28 63 29 3b  DEX i3 ON t1(c);
1ccd0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1cce0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1ccf0 31 20 57 48 45 52 45 20 61 3d 35 20 4f 52 20 62  1 WHERE a=5 OR b
1cd00 3d 37 20 4f 52 20 28 63 3d 31 31 20 41 4e 44 20  =7 OR (c=11 AND 
1cd10 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20  d=13).    **.   
1cd20 20 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70   ** In the examp
1cd30 6c 65 2c 20 74 68 65 72 65 20 61 72 65 20 74 68  le, there are th
1cd40 72 65 65 20 69 6e 64 65 78 65 64 20 74 65 72 6d  ree indexed term
1cd50 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f  s connected by O
1cd60 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 6f  R..    ** The to
1cd70 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f  p of the loop lo
1cd80 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  oks like this:. 
1cd90 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1cda0 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20        Null      
1cdb0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
1cdc0 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77    # Zero the row
1cdd0 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20  set in reg 1.   
1cde0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c   **.    ** Then,
1cdf0 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 65   for each indexe
1ce00 64 20 74 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c  d term, the foll
1ce10 6f 77 69 6e 67 2e 20 54 68 65 20 61 72 67 75 6d  owing. The argum
1ce20 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52  ents to.    ** R
1ce30 6f 77 53 65 74 54 65 73 74 20 61 72 65 20 73 75  owSetTest are su
1ce40 63 68 20 74 68 61 74 20 74 68 65 20 72 6f 77 69  ch that the rowi
1ce50 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
1ce60 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64   row is inserted
1ce70 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
1ce80 20 52 6f 77 53 65 74 2e 20 49 66 20 69 74 20 69   RowSet. If it i
1ce90 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  s already presen
1cea0 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73  t, control skips
1ceb0 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75   the.    ** Gosu
1cec0 62 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d  b opcode and jum
1ced0 70 73 20 73 74 72 61 69 67 68 74 20 74 6f 20 74  ps straight to t
1cee0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
1cef0 64 20 62 79 20 57 68 65 72 65 45 6e 64 28 29 2e  d by WhereEnd().
1cf00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1cf10 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
1cf20 72 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a  reBegin(<term>).
1cf30 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1cf40 52 6f 77 53 65 74 54 65 73 74 20 20 20 20 20 20  RowSetTest      
1cf50 20 20 20 20 20 20 20 20 20 20 20 20 23 20 49 6e              # In
1cf60 73 65 72 74 20 72 6f 77 69 64 20 69 6e 74 6f 20  sert rowid into 
1cf70 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20 20 20  rowset.    **   
1cf80 20 20 20 20 20 20 20 47 6f 73 75 62 20 20 20 20         Gosub    
1cf90 20 20 32 20 41 0a 20 20 20 20 2a 2a 20 20 20 20    2 A.    **    
1cfa0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
1cfb0 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20  End().    **.   
1cfc0 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68   ** Following th
1cfd0 65 20 61 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f  e above, code to
1cfe0 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
1cff0 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68  oop. Label A, th
1d000 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a 2a 20  e target.    ** 
1d010 6f 66 20 74 68 65 20 47 6f 73 75 62 20 61 62 6f  of the Gosub abo
1d020 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74 68 65  ve, jumps to the
1d030 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 72 69 67   instruction rig
1d040 68 74 20 61 66 74 65 72 20 74 68 65 20 47 6f 74  ht after the Got
1d050 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  o..    **.    **
1d060 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20            Null  
1d070 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
1d080 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65        # Zero the
1d090 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31   rowset in reg 1
1d0a0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1d0b0 20 47 6f 74 6f 20 20 20 20 20 20 20 42 20 20 20   Goto       B   
1d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 54               # T
1d0d0 68 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73  he loop is finis
1d0e0 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  hed..    **.    
1d0f0 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f  **       A: <loo
1d100 70 20 62 6f 64 79 3e 20 20 20 20 20 20 20 20 20  p body>         
1d110 20 20 20 20 20 20 20 20 23 20 52 65 74 75 72 6e          # Return
1d120 20 64 61 74 61 2c 20 77 68 61 74 65 76 65 72 2e   data, whatever.
1d130 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1d140 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 20          Return  
1d150 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
1d160 20 20 20 20 23 20 4a 75 6d 70 20 62 61 63 6b 20      # Jump back 
1d170 74 6f 20 74 68 65 20 47 6f 73 75 62 0a 20 20 20  to the Gosub.   
1d180 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1d190 20 42 3a 20 3c 61 66 74 65 72 20 74 68 65 20 6c   B: <after the l
1d1a0 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oop>.    **.    
1d1b0 2a 2f 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75  */.    WhereClau
1d1c0 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a  se *pOrWc;    /*
1d1d0 20 54 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 62   The OR-clause b
1d1e0 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73  roken out into s
1d1f0 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53  ubterms */.    S
1d200 72 63 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b 20  rcList *pOrTab; 
1d210 20 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e        /* Shorten
1d220 65 64 20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72  ed table list or
1d230 20 4f 52 2d 63 6c 61 75 73 65 20 67 65 6e 65 72   OR-clause gener
1d240 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64  ation */.    Ind
1d250 65 78 20 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20  ex *pCov = 0;   
1d260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 74            /* Pot
1d270 65 6e 74 69 61 6c 20 63 6f 76 65 72 69 6e 67 20  ential covering 
1d280 69 6e 64 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20  index (or NULL) 
1d290 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 76 43  */.    int iCovC
1d2a0 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
1d2b0 62 2b 2b 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20  b++;  /* Cursor 
1d2c0 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 20 73  used for index s
1d2d0 63 61 6e 73 20 28 69 66 20 61 6e 79 29 20 2a 2f  cans (if any) */
1d2e0 0a 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 74  ..    int regRet
1d2f0 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
1d300 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nMem;           
1d310 2f 2a 20 52 65 67 69 73 74 65 72 20 75 73 65 64  /* Register used
1d320 20 77 69 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a   with OP_Gosub *
1d330 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77  /.    int regRow
1d340 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  set = 0;        
1d350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d360 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20  /* Register for 
1d370 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f  RowSet object */
1d380 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69  .    int regRowi
1d390 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
1d3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d3b0 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
1d3c0 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20  ng rowid */.    
1d3d0 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20  int iLoopBody = 
1d3e0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1d3f0 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61  abel(v);  /* Sta
1d400 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20  rt of loop body 
1d410 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 74 49  */.    int iRetI
1d420 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
1d430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d440 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72   /* Address of r
1d450 65 67 52 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f  egReturn init */
1d460 0a 20 20 20 20 69 6e 74 20 75 6e 74 65 73 74 65  .    int unteste
1d470 64 54 65 72 6d 73 20 3d 20 30 3b 20 20 20 20 20  dTerms = 0;     
1d480 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20          /* Some 
1d490 74 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65  terms not comple
1d4a0 74 65 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a 20  tely tested */. 
1d4b0 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20     int ii;      
1d4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4d0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1d4e0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 45 78 70  unter */.    Exp
1d4f0 72 20 2a 70 41 6e 64 45 78 70 72 20 3d 20 30 3b  r *pAndExpr = 0;
1d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d510 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e  /* An ".. AND (.
1d520 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20  ..)" expression 
1d530 2a 2f 0a 20 20 20 0a 20 20 20 20 70 54 65 72 6d  */.   .    pTerm
1d540 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
1d550 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [0];.    assert(
1d560 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
1d570 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
1d580 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f  eOperator & WO_O
1d590 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  R );.    assert(
1d5a0 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
1d5b0 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21   & TERM_ORINFO)!
1d5c0 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20  =0 );.    pOrWc 
1d5d0 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  = &pTerm->u.pOrI
1d5e0 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65  nfo->wc;.    pLe
1d5f0 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74  vel->op = OP_Ret
1d600 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  urn;.    pLevel-
1d610 3e 70 31 20 3d 20 72 65 67 52 65 74 75 72 6e 3b  >p1 = regReturn;
1d620 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20  ..    /* Set up 
1d630 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 6e  a new SrcList in
1d640 20 70 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e 69   pOrTab containi
1d650 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ng the table bei
1d660 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a  ng scanned.    *
1d670 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69  * by this loop i
1d680 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20  n the a[0] slot 
1d690 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79  and all notReady
1d6a0 20 74 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e   tables in a[1..
1d6b0 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20  ] slots..    ** 
1d6c0 54 68 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65  This becomes the
1d6d0 20 53 72 63 4c 69 73 74 20 69 6e 20 74 68 65 20   SrcList in the 
1d6e0 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 20 74  recursive call t
1d6f0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
1d700 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  gin()..    */.  
1d710 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c    if( pWInfo->nL
1d720 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20  evel>1 ){.      
1d730 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20  int nNotReady;  
1d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d750 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
1d760 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73 20  notReady tables 
1d770 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
1d780 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72  SrcList_item *or
1d790 69 67 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72  igSrc;     /* Or
1d7a0 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74  iginal list of t
1d7b0 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e  ables */.      n
1d7c0 4e 6f 74 52 65 61 64 79 20 3d 20 70 57 49 6e 66  NotReady = pWInf
1d7d0 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76  o->nLevel - iLev
1d7e0 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f  el - 1;.      pO
1d7f0 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 74  rTab = sqlite3St
1d800 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c 0a  ackAllocRaw(db,.
1d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d820 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
1d830 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f  of(*pOrTab)+ nNo
1d840 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f  tReady*sizeof(pO
1d850 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  rTab->a[0]));.  
1d860 20 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d      if( pOrTab==
1d870 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65  0 ) return notRe
1d880 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61  ady;.      pOrTa
1d890 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29  b->nAlloc = (u8)
1d8a0 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29 3b  (nNotReady + 1);
1d8b0 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e  .      pOrTab->n
1d8c0 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41  Src = pOrTab->nA
1d8d0 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63  lloc;.      memc
1d8e0 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54  py(pOrTab->a, pT
1d8f0 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a  abItem, sizeof(*
1d900 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20 20  pTabItem));.    
1d910 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49 6e    origSrc = pWIn
1d920 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b  fo->pTabList->a;
1d930 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20  .      for(k=1; 
1d940 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b  k<=nNotReady; k+
1d950 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  +){.        memc
1d960 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d  py(&pOrTab->a[k]
1d970 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76 65  , &origSrc[pLeve
1d980 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a  l[k].iFrom], siz
1d990 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d  eof(pOrTab->a[k]
1d9a0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
1d9b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 72  }else{.      pOr
1d9c0 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Tab = pWInfo->pT
1d9d0 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20  abList;.    }.. 
1d9e0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
1d9f0 20 74 68 65 20 72 6f 77 73 65 74 20 72 65 67 69   the rowset regi
1da00 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ster to contain 
1da10 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c  NULL. An SQL NUL
1da20 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75  L is .    ** equ
1da30 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d  ivalent to an em
1da40 70 74 79 20 72 6f 77 73 65 74 2e 0a 20 20 20 20  pty rowset..    
1da50 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69  **.    ** Also i
1da60 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74  nitialize regRet
1da70 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  urn to contain t
1da80 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
1da90 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20  e instruction . 
1daa0 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c     ** immediatel
1dab0 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
1dac0 4f 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65  OP_Return at the
1dad0 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c   bottom of the l
1dae0 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a  oop. This.    **
1daf0 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
1db00 61 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45  a few obscure LE
1db10 46 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68  FT JOIN cases wh
1db20 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70  ere control jump
1db30 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68  s.    ** over th
1db40 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  e top of the loo
1db50 70 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20  p into the body 
1db60 6f 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63  of it. In this c
1db70 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ase the .    ** 
1db80 63 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65  correct response
1db90 20 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d   for the end-of-
1dba0 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f  loop code (the O
1dbb0 50 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20  P_Return) is to 
1dbc0 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72  .    ** fall thr
1dbd0 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
1dbe0 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75   instruction, ju
1dbf0 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74  st as an OP_Next
1dc00 20 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20   does if.    ** 
1dc10 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69  called on an uni
1dc20 6e 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f  nitialized curso
1dc30 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
1dc40 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
1dc50 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55  Flags & WHERE_DU
1dc60 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20  PLICATES_OK)==0 
1dc70 29 7b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 73  ){.      regRows
1dc80 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
1dc90 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f  Mem;.      regRo
1dca0 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  wid = ++pParse->
1dcb0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
1dcc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1dcd0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
1dce0 52 6f 77 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20  Rowset);.    }. 
1dcf0 20 20 20 69 52 65 74 49 6e 69 74 20 3d 20 73 71     iRetInit = sq
1dd00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1dd10 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
1dd20 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20  , regReturn);.. 
1dd30 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 72 69     /* If the ori
1dd40 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75  ginal WHERE clau
1dd50 73 65 20 69 73 20 7a 20 6f 66 20 74 68 65 20 66  se is z of the f
1dd60 6f 72 6d 3a 20 20 28 78 31 20 4f 52 20 78 32 20  orm:  (x1 OR x2 
1dd70 4f 52 20 2e 2e 2e 29 20 41 4e 44 20 79 0a 20 20  OR ...) AND y.  
1dd80 20 20 2a 2a 20 54 68 65 6e 20 66 6f 72 20 65 76    ** Then for ev
1dd90 65 72 79 20 74 65 72 6d 20 78 4e 2c 20 65 76 61  ery term xN, eva
1dda0 6c 75 61 74 65 20 61 73 20 74 68 65 20 73 75 62  luate as the sub
1ddb0 65 78 70 72 65 73 73 69 6f 6e 3a 20 78 4e 20 41  expression: xN A
1ddc0 4e 44 20 7a 0a 20 20 20 20 2a 2a 20 54 68 61 74  ND z.    ** That
1ddd0 20 77 61 79 2c 20 74 65 72 6d 73 20 69 6e 20 79   way, terms in y
1dde0 20 74 68 61 74 20 61 72 65 20 66 61 63 74 6f 72   that are factor
1ddf0 65 64 20 69 6e 74 6f 20 74 68 65 20 64 69 73 6a  ed into the disj
1de00 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20  unction will.   
1de10 20 2a 2a 20 62 65 20 70 69 63 6b 65 64 20 75 70   ** be picked up
1de20 20 62 79 20 74 68 65 20 72 65 63 75 72 73 69 76   by the recursiv
1de30 65 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  e calls to sqlit
1de40 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 62  e3WhereBegin() b
1de50 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  elow..    **.   
1de60 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 65 61   ** Actually, ea
1de70 63 68 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ch subexpression
1de80 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f   is converted to
1de90 20 22 78 4e 20 41 4e 44 20 77 22 20 77 68 65 72   "xN AND w" wher
1dea0 65 20 77 20 69 73 0a 20 20 20 20 2a 2a 20 74 68  e w is.    ** th
1deb0 65 20 22 69 6e 74 65 72 65 73 74 69 6e 67 22 20  e "interesting" 
1dec0 74 65 72 6d 73 20 6f 66 20 7a 20 2d 20 74 65 72  terms of z - ter
1ded0 6d 73 20 74 68 61 74 20 64 69 64 20 6e 6f 74 20  ms that did not 
1dee0 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65  originate in the
1def0 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f 72 20 55 53  .    ** ON or US
1df00 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ING clause of a 
1df10 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 20 74  LEFT JOIN, and t
1df20 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 75 73  erms that are us
1df30 61 62 6c 65 20 61 73 20 0a 20 20 20 20 2a 2a 20  able as .    ** 
1df40 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a  indices..    **.
1df50 20 20 20 20 2a 2a 20 54 68 69 73 20 6f 70 74 69      ** This opti
1df60 6d 69 7a 61 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e  mization also on
1df70 6c 79 20 61 70 70 6c 69 65 73 20 69 66 20 74 68  ly applies if th
1df80 65 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e  e (x1 OR x2 OR .
1df90 2e 2e 29 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20  ..) term.    ** 
1dfa0 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
1dfb0 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73   in the ON claus
1dfc0 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
1dfd0 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 69 63  ..    ** See tic
1dfe0 6b 65 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73  ket http://www.s
1dff0 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e  qlite.org/src/in
1e000 66 6f 2f 66 32 33 36 39 33 30 34 65 34 0a 20 20  fo/f2369304e4.  
1e010 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 43    */.    if( pWC
1e020 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a 20 20 20  ->nTerm>1 ){.   
1e030 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20     int iTerm;.  
1e040 20 20 20 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b      for(iTerm=0;
1e050 20 69 54 65 72 6d 3c 70 57 43 2d 3e 6e 54 65 72   iTerm<pWC->nTer
1e060 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  m; iTerm++){.   
1e070 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
1e080 20 3d 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d   = pWC->a[iTerm]
1e090 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
1e0a0 69 66 28 20 26 70 57 43 2d 3e 61 5b 69 54 65 72  if( &pWC->a[iTer
1e0b0 6d 5d 20 3d 3d 20 70 54 65 72 6d 20 29 20 63 6f  m] == pTerm ) co
1e0c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1e0d0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1e0e0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
1e0f0 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e 74 69 6e  omJoin) ) contin
1e100 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
1e110 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74  pWC->a[iTerm].wt
1e120 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 4f 52  Flags & (TERM_OR
1e130 49 4e 46 4f 29 20 29 20 63 6f 6e 74 69 6e 75 65  INFO) ) continue
1e140 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
1e150 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70  WC->a[iTerm].eOp
1e160 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29  erator & WO_ALL)
1e170 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1e180 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
1e190 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1e1a0 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  b, pExpr, 0);.  
1e1b0 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d        pAndExpr =
1e1c0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
1e1d0 64 62 2c 20 70 41 6e 64 45 78 70 72 2c 20 70 45  db, pAndExpr, pE
1e1e0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
1e1f0 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72      if( pAndExpr
1e200 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 6e 64   ){.        pAnd
1e210 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
1e220 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 41  xpr(pParse, TK_A
1e230 4e 44 2c 20 30 2c 20 70 41 6e 64 45 78 70 72 2c  ND, 0, pAndExpr,
1e240 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1e250 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   }..    for(ii=0
1e260 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72  ; ii<pOrWc->nTer
1e270 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  m; ii++){.      
1e280 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
1e290 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69  rm = &pOrWc->a[i
1e2a0 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  i];.      if( pO
1e2b0 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
1e2c0 72 3d 3d 69 43 75 72 20 7c 7c 20 28 70 4f 72 54  r==iCur || (pOrT
1e2d0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1e2e0 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20   WO_AND)!=0 ){. 
1e2f0 20 20 20 20 20 20 20 57 68 65 72 65 49 6e 66 6f         WhereInfo
1e300 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20   *pSubWInfo;    
1e310 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f        /* Info fo
1e320 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d  r single OR-term
1e330 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20   scan */.       
1e340 20 45 78 70 72 20 2a 70 4f 72 45 78 70 72 20 3d   Expr *pOrExpr =
1e350 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b   pOrTerm->pExpr;
1e360 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 6e  .        if( pAn
1e370 64 45 78 70 72 20 26 26 20 21 45 78 70 72 48 61  dExpr && !ExprHa
1e380 73 50 72 6f 70 65 72 74 79 28 70 4f 72 45 78 70  sProperty(pOrExp
1e390 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
1e3a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e  ){.          pAn
1e3b0 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70  dExpr->pLeft = p
1e3c0 4f 72 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  OrExpr;.        
1e3d0 20 20 70 4f 72 45 78 70 72 20 3d 20 70 41 6e 64    pOrExpr = pAnd
1e3e0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Expr;.        }.
1e3f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1e400 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e  through table en
1e410 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68  tries that match
1e420 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a   term pOrTerm. *
1e430 2f 0a 20 20 20 20 20 20 20 20 70 53 75 62 57 49  /.        pSubWI
1e440 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
1e450 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
1e460 70 4f 72 54 61 62 2c 20 70 4f 72 45 78 70 72 2c  pOrTab, pOrExpr,
1e470 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
1e480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
1e490 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43  HERE_OMIT_OPEN_C
1e4a0 4c 4f 53 45 20 7c 20 57 48 45 52 45 5f 41 4e 44  LOSE | WHERE_AND
1e4b0 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20 20 20 20 20  _ONLY |.        
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4d0 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c  WHERE_FORCE_TABL
1e4e0 45 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  E | WHERE_ONETAB
1e4f0 4c 45 5f 4f 4e 4c 59 2c 20 69 43 6f 76 43 75 72  LE_ONLY, iCovCur
1e500 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1e510 74 28 20 70 53 75 62 57 49 6e 66 6f 20 7c 7c 20  t( pSubWInfo || 
1e520 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
1e530 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1e540 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1e550 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20  pSubWInfo ){.   
1e560 20 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70         WhereLoop
1e570 20 2a 70 53 75 62 4c 6f 6f 70 3b 0a 20 20 20 20   *pSubLoop;.    
1e580 20 20 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65        explainOne
1e590 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20 20 20  Scan(.          
1e5a0 20 20 20 20 70 50 61 72 73 65 2c 20 70 4f 72 54      pParse, pOrT
1e5b0 61 62 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e  ab, &pSubWInfo->
1e5c0 61 5b 30 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c  a[0], iLevel, pL
1e5d0 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20  evel->iFrom, 0. 
1e5e0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
1e5f0 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66        if( (pWInf
1e600 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
1e610 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53  WHERE_DUPLICATES
1e620 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _OK)==0 ){.     
1e630 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 74 20         int iSet 
1e640 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e  = ((ii==pOrWc->n
1e650 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a  Term-1)?-1:ii);.
1e660 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1e670 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  r;.            r
1e680 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e690 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
1e6a0 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  se, pTabItem->pT
1e6b0 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c 20 0a 20  ab, -1, iCur, . 
1e6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6e0 20 20 20 20 20 20 20 20 72 65 67 52 6f 77 69 64          regRowid
1e6f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1e700 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e710 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77  Op4Int(v, OP_Row
1e720 53 65 74 54 65 73 74 2c 20 72 65 67 52 6f 77 73  SetTest, regRows
1e730 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
1e740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e750 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e760 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
1e770 2c 20 72 2c 20 69 53 65 74 29 3b 0a 20 20 20 20  , r, iSet);.    
1e780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e790 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e7a0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1e7b0 20 72 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f   regReturn, iLoo
1e7c0 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20 20  pBody);..       
1e7d0 20 20 20 2f 2a 20 54 68 65 20 70 53 75 62 57 49     /* The pSubWI
1e7e0 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
1e7f0 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68  ms flag means th
1e800 61 74 20 74 68 69 73 20 4f 52 20 74 65 72 6d 0a  at this OR term.
1e810 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
1e820 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f  tained one or mo
1e830 72 65 20 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d  re AND term from
1e840 20 61 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c   a notReady tabl
1e850 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20  e.  The.        
1e860 20 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20    ** terms from 
1e870 74 68 65 20 6e 6f 74 52 65 61 64 79 20 74 61 62  the notReady tab
1e880 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  le could not be 
1e890 74 65 73 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a  tested and will.
1e8a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65            ** nee
1e8b0 64 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 6c  d to be tested l
1e8c0 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20 20 20  ater..          
1e8d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1e8e0 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65   pSubWInfo->unte
1e8f0 73 74 65 64 54 65 72 6d 73 20 29 20 75 6e 74 65  stedTerms ) unte
1e900 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a  stedTerms = 1;..
1e910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1e920 61 6c 6c 20 6f 66 20 74 68 65 20 4f 52 2d 63 6f  all of the OR-co
1e930 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 61 72  nnected terms ar
1e940 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e  e optimized usin
1e950 67 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20  g the same.     
1e960 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 2c 20 61       ** index, a
1e970 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  nd the index is 
1e980 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65  opened using the
1e990 20 73 61 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d   same cursor num
1e9a0 62 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ber.          **
1e9b0 20 62 79 20 65 61 63 68 20 63 61 6c 6c 20 74 6f   by each call to
1e9c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1e9d0 69 6e 28 29 20 6d 61 64 65 20 62 79 20 74 68 69  in() made by thi
1e9e0 73 20 6c 6f 6f 70 2c 20 69 74 20 6d 61 79 0a 20  s loop, it may. 
1e9f0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 70           ** be p
1ea00 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 74  ossible to use t
1ea10 68 61 74 20 69 6e 64 65 78 20 61 73 20 61 20 63  hat index as a c
1ea20 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20  overing index.. 
1ea30 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
1ea40 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
1ea50 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
1ea60 68 65 72 65 42 65 67 69 6e 28 29 20 61 62 6f 76  hereBegin() abov
1ea70 65 20 72 65 73 75 6c 74 65 64 20 69 6e 20 61 20  e resulted in a 
1ea80 73 63 61 6e 20 74 68 61 74 0a 20 20 20 20 20 20  scan that.      
1ea90 20 20 20 20 2a 2a 20 75 73 65 73 20 61 6e 20 69      ** uses an i
1eaa0 6e 64 65 78 2c 20 61 6e 64 20 74 68 69 73 20 69  ndex, and this i
1eab0 73 20 65 69 74 68 65 72 20 74 68 65 20 66 69 72  s either the fir
1eac0 73 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  st OR-connected 
1ead0 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a  term.          *
1eae0 2a 20 70 72 6f 63 65 73 73 65 64 20 6f 72 20 74  * processed or t
1eaf0 68 65 20 69 6e 64 65 78 20 69 73 20 74 68 65 20  he index is the 
1eb00 73 61 6d 65 20 61 73 20 74 68 61 74 20 75 73 65  same as that use
1eb10 64 20 62 79 20 61 6c 6c 20 70 72 65 76 69 6f 75  d by all previou
1eb20 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  s.          ** t
1eb30 65 72 6d 73 2c 20 73 65 74 20 70 43 6f 76 20 74  erms, set pCov t
1eb40 6f 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  o the candidate 
1eb50 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20  covering index. 
1eb60 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 0a  Otherwise, set .
1eb70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 43 6f            ** pCo
1eb80 76 20 74 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e 64  v to NULL to ind
1eb90 69 63 61 74 65 20 74 68 61 74 20 6e 6f 20 63 61  icate that no ca
1eba0 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67  ndidate covering
1ebb0 20 69 6e 64 65 78 20 77 69 6c 6c 20 0a 20 20 20   index will .   
1ebc0 20 20 20 20 20 20 20 2a 2a 20 62 65 20 61 76 61         ** be ava
1ebd0 69 6c 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20  ilable..        
1ebe0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70    */.          p
1ebf0 53 75 62 4c 6f 6f 70 20 3d 20 70 53 75 62 57 49  SubLoop = pSubWI
1ec00 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70  nfo->a[0].pWLoop
1ec10 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1ec20 72 74 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77  rt( (pSubLoop->w
1ec30 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
1ec40 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b  UTO_INDEX)==0 );
1ec50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
1ec60 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  pSubLoop->wsFlag
1ec70 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
1ec80 44 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  D)!=0.          
1ec90 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70 53   && (ii==0 || pS
1eca0 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  ubLoop->u.btree.
1ecb0 70 49 6e 64 65 78 3d 3d 70 43 6f 76 29 0a 20 20  pIndex==pCov).  
1ecc0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
1ecd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1ece0 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69  SubWInfo->a[0].i
1ecf0 49 64 78 43 75 72 3d 3d 69 43 6f 76 43 75 72 20  IdxCur==iCovCur 
1ed00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
1ed10 43 6f 76 20 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e  Cov = pSubLoop->
1ed20 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
1ed30 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1ed40 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
1ed50 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  v = 0;.         
1ed60 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
1ed70 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70   Finish the loop
1ed80 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65   through table e
1ed90 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63  ntries that matc
1eda0 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20  h term pOrTerm. 
1edb0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
1edc0 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 53 75  ite3WhereEnd(pSu
1edd0 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  bWInfo);.       
1ede0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1edf0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 70  .    pLevel->u.p
1ee00 43 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a 20  Covidx = pCov;. 
1ee10 20 20 20 69 66 28 20 70 43 6f 76 20 29 20 70 4c     if( pCov ) pL
1ee20 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
1ee30 69 43 6f 76 43 75 72 3b 0a 20 20 20 20 69 66 28  iCovCur;.    if(
1ee40 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20   pAndExpr ){.   
1ee50 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65     pAndExpr->pLe
1ee60 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ft = 0;.      sq
1ee70 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1ee80 64 62 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a 20  db, pAndExpr);. 
1ee90 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1eea0 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
1eeb0 69 52 65 74 49 6e 69 74 2c 20 73 71 6c 69 74 65  iRetInit, sqlite
1eec0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1eed0 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (v));.    sqlite
1eee0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1eef0 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65  P_Goto, 0, pLeve
1ef00 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  l->addrBrk);.   
1ef10 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1ef20 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f  lveLabel(v, iLoo
1ef30 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66 28  pBody);..    if(
1ef40 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e   pWInfo->nLevel>
1ef50 31 20 29 20 73 71 6c 69 74 65 33 53 74 61 63 6b  1 ) sqlite3Stack
1ef60 46 72 65 65 28 64 62 2c 20 70 4f 72 54 61 62 29  Free(db, pOrTab)
1ef70 3b 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65 73  ;.    if( !untes
1ef80 74 65 64 54 65 72 6d 73 20 29 20 64 69 73 61 62  tedTerms ) disab
1ef90 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
1efa0 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  Term);.  }else.#
1efb0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1efc0 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
1efd0 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20  TION */..  {.   
1efe0 20 2f 2a 20 43 61 73 65 20 36 3a 20 20 54 68 65   /* Case 6:  The
1eff0 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20  re is no usable 
1f000 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20  index.  We must 
1f010 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20  do a complete.  
1f020 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63    **          sc
1f030 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  an of the entire
1f040 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
1f050 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1f060 75 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f  u8 aStep[] = { O
1f070 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20  P_Next, OP_Prev 
1f080 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  };.    static co
1f090 6e 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20  nst u8 aStart[] 
1f0a0 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f  = { OP_Rewind, O
1f0b0 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73  P_Last };.    as
1f0c0 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c  sert( bRev==0 ||
1f0d0 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20   bRev==1 );.    
1f0e0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74  pLevel->op = aSt
1f0f0 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20 70 4c  ep[bRev];.    pL
1f100 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
1f110 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1f120 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
1f130 65 41 64 64 4f 70 32 28 76 2c 20 61 53 74 61 72  eAddOp2(v, aStar
1f140 74 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c 20 61  t[bRev], iCur, a
1f150 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65  ddrBrk);.    pLe
1f160 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45  vel->p5 = SQLITE
1f170 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
1f180 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a 0a  SCAN_STEP;.  }..
1f190 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65    /* Insert code
1f1a0 20 74 6f 20 74 65 73 74 20 65 76 65 72 79 20 73   to test every s
1f1b0 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  ubexpression tha
1f1c0 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74  t can be complet
1f1d0 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65  ely.  ** compute
1f1e0 64 20 75 73 69 6e 67 20 74 68 65 20 63 75 72 72  d using the curr
1f1f0 65 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65  ent set of table
1f200 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54  s..  */.  for(pT
1f210 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57  erm=pWC->a, j=pW
1f220 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a  C->nTerm; j>0; j
1f230 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  --, pTerm++){.  
1f240 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20    Expr *pE;.    
1f250 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
1f260 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1f270 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 74  VIRTUAL );.    t
1f280 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
1f290 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
1f2a0 4f 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ODED );.    if( 
1f2b0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1f2c0 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
1f2d0 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
1f2e0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
1f2f0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
1f300 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65   & pLevel->notRe
1f310 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ady)!=0 ){.     
1f320 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66   testcase( pWInf
1f330 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
1f340 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
1f350 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
1f360 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1f370 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
1f380 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49  !=0 );.      pWI
1f390 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
1f3a0 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f  ms = 1;.      co
1f3b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
1f3c0 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45    pE = pTerm->pE
1f3d0 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
1f3e0 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 69 66   pE!=0 );.    if
1f3f0 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
1f400 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61 73 50  oin && !ExprHasP
1f410 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
1f420 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
1f430 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1f440 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
1f450 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1f460 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53   pE, addrCont, S
1f470 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1f480 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  );.    pTerm->wt
1f490 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
1f4a0 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  DED;.  }..  /* I
1f4b0 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65  nsert code to te
1f4c0 73 74 20 66 6f 72 20 69 6d 70 6c 69 65 64 20 63  st for implied c
1f4d0 6f 6e 73 74 72 61 69 6e 74 73 20 62 61 73 65 64  onstraints based
1f4e0 20 6f 6e 20 74 72 61 6e 73 69 74 69 76 69 74 79   on transitivity
1f4f0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 22 3d 3d  .  ** of the "==
1f500 22 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a  " operator..  **
1f510 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 49  .  ** Example: I
1f520 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
1f530 73 65 20 63 6f 6e 74 61 69 6e 73 20 22 74 31 2e  se contains "t1.
1f540 61 3d 74 32 2e 62 22 20 61 6e 64 20 22 74 32 2e  a=t2.b" and "t2.
1f550 62 3d 31 32 33 22 0a 20 20 2a 2a 20 61 6e 64 20  b=123".  ** and 
1f560 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 74 68  we are coding th
1f570 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 74 68  e t1 loop and th
1f580 65 20 74 32 20 6c 6f 6f 70 20 68 61 73 20 6e 6f  e t2 loop has no
1f590 74 20 79 65 74 20 63 6f 64 65 64 2c 0a 20 20 2a  t yet coded,.  *
1f5a0 2a 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74  * then we cannot
1f5b0 20 75 73 65 20 74 68 65 20 22 74 31 2e 61 3d 74   use the "t1.a=t
1f5c0 32 2e 62 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c  2.b" constraint,
1f5d0 20 62 75 74 20 77 65 20 63 61 6e 20 63 6f 64 65   but we can code
1f5e0 0a 20 20 2a 2a 20 74 68 65 20 69 6d 70 6c 69 65  .  ** the implie
1f5f0 64 20 22 74 31 2e 61 3d 31 32 33 22 20 63 6f 6e  d "t1.a=123" con
1f600 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20  straint..  */.  
1f610 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
1f620 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , j=pWC->nTerm; 
1f630 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b  j>0; j--, pTerm+
1f640 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
1f650 2c 20 2a 70 45 41 6c 74 3b 0a 20 20 20 20 57 68  , *pEAlt;.    Wh
1f660 65 72 65 54 65 72 6d 20 2a 70 41 6c 74 3b 0a 20  ereTerm *pAlt;. 
1f670 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
1f680 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
1f690 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
1f6a0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
1f6b0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
1f6c0 65 72 61 74 6f 72 21 3d 28 57 4f 5f 45 51 55 49  erator!=(WO_EQUI
1f6d0 56 7c 57 4f 5f 45 51 29 20 29 20 63 6f 6e 74 69  V|WO_EQ) ) conti
1f6e0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
1f6f0 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rm->leftCursor!=
1f700 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
1f710 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
1f720 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 20 63 6f 6e  >iLeftJoin ) con
1f730 74 69 6e 75 65 3b 0a 20 20 20 20 70 45 20 3d 20  tinue;.    pE = 
1f740 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
1f750 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1f760 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
1f770 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20  P_FromJoin) );. 
1f780 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
1f790 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
1f7a0 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64   pLevel->notRead
1f7b0 79 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c  y)!=0 );.    pAl
1f7c0 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  t = findTerm(pWC
1f7d0 2c 20 69 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75  , iCur, pTerm->u
1f7e0 2e 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74  .leftColumn, not
1f7f0 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f  Ready, WO_EQ|WO_
1f800 49 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  IN, 0);.    if( 
1f810 70 41 6c 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  pAlt==0 ) contin
1f820 75 65 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74  ue;.    if( pAlt
1f830 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
1f840 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
1f850 6e 75 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73  nue;.    testcas
1f860 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74  e( pAlt->eOperat
1f870 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
1f880 20 20 74 65 73 74 63 61 73 65 28 20 70 41 6c 74    testcase( pAlt
1f890 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1f8a0 5f 49 4e 20 29 3b 0a 20 20 20 20 56 64 62 65 4d  _IN );.    VdbeM
1f8b0 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
1f8c0 20 22 62 65 67 69 6e 20 74 72 61 6e 73 69 74 69   "begin transiti
1f8d0 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 22 29 29  ve constraint"))
1f8e0 3b 0a 20 20 20 20 70 45 41 6c 74 20 3d 20 73 71  ;.    pEAlt = sq
1f8f0 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52  lite3StackAllocR
1f900 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
1f910 45 41 6c 74 29 29 3b 0a 20 20 20 20 69 66 28 20  EAlt));.    if( 
1f920 70 45 41 6c 74 20 29 7b 0a 20 20 20 20 20 20 2a  pEAlt ){.      *
1f930 70 45 41 6c 74 20 3d 20 2a 70 41 6c 74 2d 3e 70  pEAlt = *pAlt->p
1f940 45 78 70 72 3b 0a 20 20 20 20 20 20 70 45 41 6c  Expr;.      pEAl
1f950 74 2d 3e 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70  t->pLeft = pE->p
1f960 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Left;.      sqli
1f970 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1f980 50 61 72 73 65 2c 20 70 45 41 6c 74 2c 20 61 64  Parse, pEAlt, ad
1f990 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a  drCont, SQLITE_J
1f9a0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1f9b0 20 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72    sqlite3StackFr
1f9c0 65 65 28 64 62 2c 20 70 45 41 6c 74 29 3b 0a 20  ee(db, pEAlt);. 
1f9d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1f9e0 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  or a LEFT OUTER 
1f9f0 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63  JOIN, generate c
1fa00 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ode that will re
1fa10 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
1fa20 61 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74  at.  ** at least
1fa30 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
1fa40 72 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20  right table has 
1fa50 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74  matched the left
1fa60 20 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20   table.  .  */. 
1fa70 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
1fa80 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c  ftJoin ){.    pL
1fa90 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 20  evel->addrFirst 
1faa0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1fab0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
1fac0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fad0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1fae0 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  , 1, pLevel->iLe
1faf0 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62  ftJoin);.    Vdb
1fb00 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
1fb10 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68  cord LEFT JOIN h
1fb20 69 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  it"));.    sqlit
1fb30 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
1fb40 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66 6f  (pParse);.    fo
1fb50 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20  r(pTerm=pWC->a, 
1fb60 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72  j=0; j<pWC->nTer
1fb70 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; j++, pTerm++)
1fb80 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1fb90 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
1fba0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1fbb0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1fbc0 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
1fbd0 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29  s & TERM_CODED )
1fbe0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
1fbf0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
1fc00 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
1fc10 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
1fc20 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  e;.      if( (pT
1fc30 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
1fc40 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64   pLevel->notRead
1fc50 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  y)!=0 ){.       
1fc60 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
1fc70 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29  >untestedTerms )
1fc80 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
1fc90 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
1fca0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
1fcb0 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >pExpr );.      
1fcc0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1fcd0 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  se(pParse, pTerm
1fce0 2d 3e 70 45 78 70 72 2c 20 61 64 64 72 43 6f 6e  ->pExpr, addrCon
1fcf0 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  t, SQLITE_JUMPIF
1fd00 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 65  NULL);.      pTe
1fd10 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
1fd20 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d  ERM_CODED;.    }
1fd30 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
1fd40 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1fd50 72 73 65 2c 20 69 52 65 6c 65 61 73 65 52 65 67  rse, iReleaseReg
1fd60 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 65  );..  return pLe
1fd70 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 3b 0a 7d  vel->notReady;.}
1fd80 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48  ..#if defined(WH
1fd90 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
1fda0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
1fdb0 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f  ITE_ENABLE_TREE_
1fdc0 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47  EXPLAIN)./*.** G
1fdd0 65 6e 65 72 61 74 65 20 22 45 78 70 6c 61 6e 61  enerate "Explana
1fde0 74 69 6f 6e 22 20 74 65 78 74 20 66 6f 72 20 61  tion" text for a
1fdf0 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2f 0a 73   WhereTerm..*/.s
1fe00 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
1fe10 45 78 70 6c 61 69 6e 54 65 72 6d 28 56 64 62 65  ExplainTerm(Vdbe
1fe20 20 2a 76 2c 20 57 68 65 72 65 54 65 72 6d 20 2a   *v, WhereTerm *
1fe30 70 54 65 72 6d 29 7b 0a 20 20 63 68 61 72 20 7a  pTerm){.  char z
1fe40 54 79 70 65 5b 34 5d 3b 0a 20 20 6d 65 6d 63 70  Type[4];.  memcp
1fe50 79 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c 20  y(zType, "...", 
1fe60 34 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d  4);.  if( pTerm-
1fe70 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1fe80 56 49 52 54 55 41 4c 20 29 20 7a 54 79 70 65 5b  VIRTUAL ) zType[
1fe90 30 5d 20 3d 20 27 56 27 3b 0a 20 20 69 66 28 20  0] = 'V';.  if( 
1fea0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1feb0 20 26 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a   & WO_EQUIV  ) z
1fec0 54 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20  Type[1] = 'E';. 
1fed0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1fee0 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
1fef0 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
1ff00 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27  ) zType[2] = 'L'
1ff10 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  ;.  sqlite3Expla
1ff20 69 6e 50 72 69 6e 74 66 28 76 2c 20 22 25 73 20  inPrintf(v, "%s 
1ff30 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20 73 71 6c  ", zType);.  sql
1ff40 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1ff50 76 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29  v, pTerm->pExpr)
1ff60 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 57 48  ;.}.#endif /* WH
1ff70 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
1ff80 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
1ff90 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 20 2a  E_TREE_EXPLAIN *
1ffa0 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45  /...#ifdef WHERE
1ffb0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
1ffc0 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72  .** Print a Wher
1ffd0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72  eLoop object for
1ffe0 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f   debugging purpo
1fff0 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ses.*/.static vo
20000 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e  id whereLoopPrin
20010 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  t(WhereLoop *p, 
20020 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
20030 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
20040 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57  pWInfo = pWC->pW
20050 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d  Info;.  int nb =
20060 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62   1+(pWInfo->pTab
20070 4c 69 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b  List->nSrc+7)/8;
20080 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
20090 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
200a0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
200b0 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20  ->a + p->iTab;. 
200c0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
200d0 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71  Item->pTab;.  sq
200e0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
200f0 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25  ("%c%2d.%0*llx.%
20100 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a  0*llx", p->cId,.
20110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20120 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62       p->iTab, nb
20130 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e  , p->maskSelf, n
20140 62 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20  b, p->prereq);. 
20150 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
20160 6e 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20  ntf(" %12s",.   
20170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20180 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20    pItem->zAlias 
20190 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ? pItem->zAlias 
201a0 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  : pTab->zName);.
201b0 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
201c0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
201d0 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  LTABLE)==0 ){.  
201e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
201f0 4e 61 6d 65 3b 0a 20 20 20 20 20 69 66 28 20 70  Name;.     if( p
20200 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
20210 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e   && (zName = p->
20220 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
20230 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
20240 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
20250 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75  Name, "sqlite_au
20260 74 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d  toindex_", 17)==
20270 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
20280 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   i = sqlite3Strl
20290 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b  en30(zName) - 1;
202a0 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
202b0 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20  zName[i]!='_' ) 
202c0 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  i--;.        zNa
202d0 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d  me += i;.      }
202e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
202f0 62 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31 36  bugPrintf(".%-16
20300 73 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70  s %2d", zName, p
20310 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a  ->u.btree.nEq);.
20320 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20330 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
20340 6e 74 66 28 22 25 32 30 73 22 2c 22 22 29 3b 0a  ntf("%20s","");.
20350 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
20360 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
20370 69 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64  if( p->u.vtab.id
20380 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a 20  xStr ){.      z 
20390 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
203a0 66 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78  f("(%d,\"%s\",%x
203b0 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
203c0 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64      p->u.vtab.id
203d0 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e  xNum, p->u.vtab.
203e0 69 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61  idxStr, p->u.vta
203f0 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20  b.omitMask);.   
20400 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20   }else{.      z 
20410 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
20420 66 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e  f("(%d,%x)", p->
20430 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70  u.vtab.idxNum, p
20440 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73  ->u.vtab.omitMas
20450 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  k);.    }.    sq
20460 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
20470 28 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20  (" %-19s", z);. 
20480 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
20490 7a 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  z);.  }.  sqlite
204a0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 66  3DebugPrintf(" f
204b0 20 25 30 34 78 20 4e 20 25 64 22 2c 20 70 2d 3e   %04x N %d", p->
204c0 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65  wsFlags, p->nLTe
204d0 72 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  rm);.  sqlite3De
204e0 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f 73 74  bugPrintf(" cost
204f0 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70 2d   %d,%d,%d\n", p-
20500 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75 6e  >rSetup, p->rRun
20510 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 64  , p->nOut);.#ifd
20520 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
20530 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 0a 20 20  _TREE_EXPLAIN.  
20540 2f 2a 20 49 66 20 74 68 65 20 30 78 31 30 30 20  /* If the 0x100 
20550 62 69 74 20 6f 66 20 77 68 65 72 65 74 72 61 63  bit of wheretrac
20560 69 6e 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  ing is set, then
20570 20 73 68 6f 77 20 61 6c 6c 20 6f 66 20 74 68 65   show all of the
20580 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a   constraint.  **
20590 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
205a0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 61 4c  the WhereLoop.aL
205b0 54 65 72 6d 5b 5d 20 61 72 72 61 79 2e 0a 20 20  Term[] array..  
205c0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65  */.  if( p->nLTe
205d0 72 6d 20 26 26 20 28 73 71 6c 69 74 65 33 57 68  rm && (sqlite3Wh
205e0 65 72 65 54 72 61 63 65 20 26 20 30 78 31 30 30  ereTrace & 0x100
205f0 29 21 3d 30 20 29 7b 20 20 2f 2a 20 57 48 45 52  )!=0 ){  /* WHER
20600 45 54 52 41 43 45 20 30 78 31 30 30 20 2a 2f 0a  ETRACE 0x100 */.
20610 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56      int i;.    V
20620 64 62 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f 2d  dbe *v = pWInfo-
20630 3e 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a  >pParse->pVdbe;.
20640 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
20650 69 6e 42 65 67 69 6e 28 76 29 3b 0a 20 20 20 20  inBegin(v);.    
20660 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4c  for(i=0; i<p->nL
20670 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Term; i++){.    
20680 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
20690 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 5b 69  rm = p->aLTerm[i
206a0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ];.      if( pTe
206b0 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  rm==0 ) continue
206c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
206d0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 76 2c 20  xplainPrintf(v, 
206e0 22 20 20 28 25 64 29 20 23 25 2d 32 64 20 22 2c  "  (%d) #%-2d ",
206f0 20 69 2b 31 2c 20 28 69 6e 74 29 28 70 54 65 72   i+1, (int)(pTer
20700 6d 2d 70 57 43 2d 3e 61 29 29 3b 0a 20 20 20 20  m-pWC->a));.    
20710 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
20720 50 75 73 68 28 76 29 3b 0a 20 20 20 20 20 20 77  Push(v);.      w
20730 68 65 72 65 45 78 70 6c 61 69 6e 54 65 72 6d 28  hereExplainTerm(
20740 76 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  v, pTerm);.     
20750 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
20760 6f 70 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  op(v);.      sql
20770 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 76 29  ite3ExplainNL(v)
20780 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
20790 74 65 33 45 78 70 6c 61 69 6e 46 69 6e 69 73 68  te3ExplainFinish
207a0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
207b0 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 73 22  DebugPrintf("%s"
207c0 2c 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  , sqlite3VdbeExp
207d0 6c 61 6e 61 74 69 6f 6e 28 76 29 29 3b 0a 20 20  lanation(v));.  
207e0 7d 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69  }.#endif.}.#endi
207f0 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
20800 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74   bulk memory int
20810 6f 20 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c  o a valid WhereL
20820 6f 6f 70 20 74 68 61 74 20 63 61 6e 20 62 65 20  oop that can be 
20830 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65  passed.** to whe
20840 72 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d  reLoopClear harm
20850 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  lessly..*/.stati
20860 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
20870 49 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a  Init(WhereLoop *
20880 70 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20  p){.  p->aLTerm 
20890 3d 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  = p->aLTermSpace
208a0 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  ;.  p->nLTerm = 
208b0 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d  0;.  p->nLSlot =
208c0 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c   ArraySize(p->aL
208d0 54 65 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d  TermSpace);.  p-
208e0 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a  >wsFlags = 0;.}.
208f0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
20900 20 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69   WhereLoop.u uni
20910 6f 6e 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65  on.  Leave Where
20920 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61  Loop.pLTerm inta
20930 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
20940 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  id whereLoopClea
20950 72 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  rUnion(sqlite3 *
20960 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
20970 29 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c  ){.  if( p->wsFl
20980 61 67 73 20 26 20 28 57 48 45 52 45 5f 56 49 52  ags & (WHERE_VIR
20990 54 55 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f  TUALTABLE|WHERE_
209a0 41 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20  AUTO_INDEX) ){. 
209b0 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
209c0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
209d0 41 4c 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70  ALTABLE)!=0 && p
209e0 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
209f0 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
20a00 65 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61  e3_free(p->u.vta
20a10 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  b.idxStr);.     
20a20 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46   p->u.vtab.needF
20a30 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ree = 0;.      p
20a40 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
20a50 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
20a60 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
20a70 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
20a80 58 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74  X)!=0 && p->u.bt
20a90 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b  ree.pIndex!=0 ){
20aa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
20ab0 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74  Free(db, p->u.bt
20ac0 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c  ree.pIndex->zCol
20ad0 41 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Aff);.      sqli
20ae0 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
20af0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
20b00 78 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  x->pKeyInfo);.  
20b10 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
20b20 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65  e(db, p->u.btree
20b30 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  .pIndex);.      
20b40 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
20b50 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
20b60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
20b70 63 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65  cate internal me
20b80 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 20 57  mory used by a W
20b90 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a  hereLoop object.
20ba0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
20bb0 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71  hereLoopClear(sq
20bc0 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
20bd0 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20  Loop *p){.  if( 
20be0 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c  p->aLTerm!=p->aL
20bf0 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69  TermSpace ) sqli
20c00 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
20c10 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72  >aLTerm);.  wher
20c20 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28  eLoopClearUnion(
20c30 64 62 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c  db, p);.  whereL
20c40 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f  oopInit(p);.}../
20c50 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68  *.** Increase th
20c60 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
20c70 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61  ion for pLoop->a
20c80 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74  LTerm[] to be at
20c90 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61   least n..*/.sta
20ca0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
20cb0 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20  pResize(sqlite3 
20cc0 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
20cd0 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65  p, int n){.  Whe
20ce0 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a  reTerm **paNew;.
20cf0 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e    if( p->nLSlot>
20d00 3d 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =n ) return SQLI
20d10 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b  TE_OK;.  n = (n+
20d20 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d  7)&~7;.  paNew =
20d30 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
20d40 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70  Raw(db, sizeof(p
20d50 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b  ->aLTerm[0])*n);
20d60 0a 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20  .  if( paNew==0 
20d70 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
20d80 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28  NOMEM;.  memcpy(
20d90 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d  paNew, p->aLTerm
20da0 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65  , sizeof(p->aLTe
20db0 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74  rm[0])*p->nLSlot
20dc0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65  );.  if( p->aLTe
20dd0 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61  rm!=p->aLTermSpa
20de0 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ce ) sqlite3DbFr
20df0 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d  ee(db, p->aLTerm
20e00 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d  );.  p->aLTerm =
20e10 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53   paNew;.  p->nLS
20e20 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72  lot = n;.  retur
20e30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
20e40 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63  /*.** Transfer c
20e50 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
20e60 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74  second pLoop int
20e70 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a  o the first..*/.
20e80 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
20e90 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33  LoopXfer(sqlite3
20ea0 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
20eb0 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20  *pTo, WhereLoop 
20ec0 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65  *pFrom){.  where
20ed0 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64  LoopClearUnion(d
20ee0 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77  b, pTo);.  if( w
20ef0 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
20f00 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e  b, pTo, pFrom->n
20f10 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65  LTerm) ){.    me
20f20 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c  mset(&pTo->u, 0,
20f30 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29   sizeof(pTo->u))
20f40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
20f50 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
20f60 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72   memcpy(pTo, pFr
20f70 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58  om, WHERE_LOOP_X
20f80 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70  FER_SZ);.  memcp
20f90 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70  y(pTo->aLTerm, p
20fa0 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54  From->aLTerm, pT
20fb0 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66  o->nLTerm*sizeof
20fc0 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29  (pTo->aLTerm[0])
20fd0 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  );.  if( pFrom->
20fe0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
20ff0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a  VIRTUALTABLE ){.
21000 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61      pFrom->u.vta
21010 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
21020 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72    }else if( (pFr
21030 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  om->wsFlags & WH
21040 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
21050 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d  =0 ){.    pFrom-
21060 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
21070 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
21080 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
21090 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57  /*.** Delete a W
210a0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a  hereLoop object.
210b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
210c0 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73  hereLoopDelete(s
210d0 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
210e0 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65  eLoop *p){.  whe
210f0 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20  reLoopClear(db, 
21100 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
21110 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
21120 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72  *.** Free a Wher
21130 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  eInfo structure.
21140 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
21150 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c  hereInfoFree(sql
21160 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49  ite3 *db, WhereI
21170 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
21180 69 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66  if( ALWAYS(pWInf
21190 6f 29 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43  o) ){.    whereC
211a0 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e  lauseClear(&pWIn
211b0 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68  fo->sWC);.    wh
211c0 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f  ile( pWInfo->pLo
211d0 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65  ops ){.      Whe
211e0 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e  reLoop *p = pWIn
211f0 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20  fo->pLoops;.    
21200 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73    pWInfo->pLoops
21210 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b   = p->pNextLoop;
21220 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
21230 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20  Delete(db, p);. 
21240 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
21250 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  DbFree(db, pWInf
21260 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  o);.  }.}../*.**
21270 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61   Insert or repla
21280 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65  ce a WhereLoop e
21290 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20 74  ntry using the t
212a0 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64  emplate supplied
212b0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74  ..**.** An exist
212c0 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  ing WhereLoop en
212d0 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65  try might be ove
212e0 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20  rwritten if the 
212f0 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20  new template.** 
21300 69 73 20 62 65 74 74 65 72 20 61 6e 64 20 68 61  is better and ha
21310 73 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  s fewer dependen
21320 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65  cies.  Or the te
21330 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69  mplate will be i
21340 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f  gnored.** and no
21350 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63   insert will occ
21360 75 72 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ur if an existin
21370 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66  g WhereLoop is f
21380 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a  aster and has.**
21390 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
213a0 69 65 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d  ies than the tem
213b0 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73  plate.  Otherwis
213c0 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f  e a new WhereLoo
213d0 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61  p is.** added ba
213e0 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c  sed on the templ
213f0 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42  ate..**.** If pB
21400 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69  uilder->pOrSet i
21410 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
21420 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  we only care abo
21430 75 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70  ut only the.** p
21440 72 65 72 65 71 75 69 73 69 74 65 73 20 61 6e 64  rerequisites and
21450 20 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63   rRun and nOut c
21460 6f 73 74 73 20 6f 66 20 74 68 65 20 4e 20 62 65  osts of the N be
21470 73 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a  st loops.  That.
21480 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ** information i
21490 73 20 67 61 74 68 65 72 65 64 20 69 6e 20 74 68  s gathered in th
214a0 65 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  e pBuilder->pOrS
214b0 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  et object.  This
214c0 20 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63   special.** proc
214d0 65 73 73 69 6e 67 20 6d 6f 64 65 20 69 73 20 75  essing mode is u
214e0 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20  sed only for OR 
214f0 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
21500 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63  g..**.** When ac
21510 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69  cumulating multi
21520 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20  ple loops (when 
21530 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
21540 20 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20   is NULL) we.** 
21550 73 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72  still might over
21560 77 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f  write similar lo
21570 6f 70 73 20 77 69 74 68 20 74 68 65 20 6e 65 77  ops with the new
21580 20 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65   template if the
21590 0a 2a 2a 20 74 65 6d 70 6c 61 74 65 20 69 73 20  .** template is 
215a0 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d  better.  Loops m
215b0 61 79 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ay be overwritte
215c0 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n if the followi
215d0 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ng .** condition
215e0 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a  s are met:.**.**
215f0 20 20 20 20 28 31 29 20 20 54 68 65 79 20 68 61      (1)  They ha
21600 76 65 20 74 68 65 20 73 61 6d 65 20 69 54 61 62  ve the same iTab
21610 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65  ..**    (2)  The
21620 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  y have the same 
21630 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20  iSortIdx..**    
21640 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74  (3)  The templat
21650 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65  e has same or fe
21660 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
21670 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
21680 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29  t loop.**    (4)
21690 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68    The template h
216a0 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c  as the same or l
216b0 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74  ower cost than t
216c0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a  he current loop.
216d0 2a 2a 20 20 20 20 28 35 29 20 20 54 68 65 20 74  **    (5)  The t
216e0 65 6d 70 6c 61 74 65 20 75 73 65 73 20 6d 6f 72  emplate uses mor
216f0 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 73  e terms of the s
21700 61 6d 65 20 69 6e 64 65 78 20 62 75 74 20 68 61  ame index but ha
21710 73 20 6e 6f 20 61 64 64 69 74 69 6f 6e 61 6c 0a  s no additional.
21720 2a 2a 20 20 20 20 20 20 20 20 20 64 65 70 65 6e  **         depen
21730 64 65 6e 63 69 65 73 20 20 20 20 20 20 20 20 20  dencies         
21740 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
21750 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
21760 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
21770 20 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72   *pBuilder, Wher
21780 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65  eLoop *pTemplate
21790 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  ){.  WhereLoop *
217a0 2a 70 70 50 72 65 76 2c 20 2a 70 2c 20 2a 70 4e  *ppPrev, *p, *pN
217b0 65 78 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65  ext = 0;.  Where
217c0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
217d0 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
217e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
217f0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
21800 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42  >db;..  /* If pB
21810 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69  uilder->pOrSet i
21820 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  s defined, then 
21830 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20  only keep track 
21840 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a  of the costs.  *
21850 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20  * and prereqs.. 
21860 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64   */.  if( pBuild
21870 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b  er->pOrSet!=0 ){
21880 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
21890 45 4e 41 42 4c 45 44 0a 20 20 20 20 75 31 36 20  ENABLED.    u16 
218a0 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  n = pBuilder->pO
218b0 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74  rSet->n;.    int
218c0 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20   x =.#endif.    
218d0 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70 42  whereOrInsert(pB
218e0 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20  uilder->pOrSet, 
218f0 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
21900 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  q, pTemplate->rR
21910 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  un,.            
21920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21930 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74          pTemplat
21940 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48  e->nOut);.#if WH
21950 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
21960 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69   /* 0x8 */.    i
21970 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
21980 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20  race & 0x8 ){.  
21990 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
219a0 50 72 69 6e 74 66 28 78 3f 22 20 20 20 6f 72 2d  Printf(x?"   or-
219b0 25 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58 3a  %d:  ":"   or-X:
219c0 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20 77    ", n);.      w
219d0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
219e0 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65  emplate, pBuilde
219f0 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23  r->pWC);.    }.#
21a00 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
21a10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
21a20 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
21a30 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   an existing Whe
21a40 72 65 4c 6f 6f 70 20 74 6f 20 6f 76 65 72 77 72  reLoop to overwr
21a50 69 74 65 2c 20 6f 72 20 77 68 69 63 68 20 74 61  ite, or which ta
21a60 6b 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 69 74  kes.  ** priorit
21a70 79 20 6f 76 65 72 20 70 54 65 6d 70 6c 61 74 65  y over pTemplate
21a80 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 70 50  ..  */.  for(ppP
21a90 72 65 76 3d 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f  rev=&pWInfo->pLo
21aa0 6f 70 73 2c 20 70 3d 2a 70 70 50 72 65 76 3b 20  ops, p=*ppPrev; 
21ab0 70 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e  p; ppPrev=&p->pN
21ac0 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72  extLoop, p=*ppPr
21ad0 65 76 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ev){.    if( p->
21ae0 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d  iTab!=pTemplate-
21af0 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72  >iTab || p->iSor
21b00 74 49 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d  tIdx!=pTemplate-
21b10 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20  >iSortIdx ){.   
21b20 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20     /* If either 
21b30 74 68 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72  the iTab or iSor
21b40 74 49 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20  tIdx values for 
21b50 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72  two WhereLoop ar
21b60 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20  e different.    
21b70 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20    ** then those 
21b80 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20  WhereLoops need 
21b90 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  to be considered
21ba0 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65   separately.  Ne
21bb0 69 74 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a  ither is.      *
21bc0 2a 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  * a candidate to
21bd0 20 72 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68   replace the oth
21be0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  er. */.      con
21bf0 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
21c00 20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65   /* In the curre
21c10 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
21c20 6e 2c 20 74 68 65 20 72 53 65 74 75 70 20 76 61  n, the rSetup va
21c30 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 7a 65  lue is either ze
21c40 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65  ro.    ** or the
21c50 20 63 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e   cost of buildin
21c60 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  g an automatic i
21c70 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64  ndex (NlogN) and
21c80 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a   the NlogN.    *
21c90 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f  * is the same fo
21ca0 72 20 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65  r compatible Whe
21cb0 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20  reLoops. */.    
21cc0 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
21cd0 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74  p==0 || pTemplat
21ce0 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20  e->rSetup==0 .  
21cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
21d00 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65  | p->rSetup==pTe
21d10 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
21d20 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72 65 4c  ;..    /* whereL
21d30 6f 6f 70 41 64 64 42 74 72 65 65 28 29 20 61 6c  oopAddBtree() al
21d40 77 61 79 73 20 67 65 6e 65 72 61 74 65 73 20 61  ways generates a
21d50 6e 64 20 69 6e 73 65 72 74 73 20 74 68 65 20 61  nd inserts the a
21d60 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20  utomatic index. 
21d70 20 20 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74     ** case first
21d80 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69  .  Hence compati
21d90 62 6c 65 20 63 61 6e 64 69 64 61 74 65 20 57 68  ble candidate Wh
21da0 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68  ereLoops never h
21db0 61 76 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20  ave a larger.   
21dc0 20 2a 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c   ** rSetup. Call
21dd0 20 74 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41   this SETUP-INVA
21de0 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73  RIANT */.    ass
21df0 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d  ert( p->rSetup>=
21e00 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
21e10 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 28 70  p );..    if( (p
21e20 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70  ->prereq & pTemp
21e30 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70  late->prereq)==p
21e40 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20 26 26  ->prereq.     &&
21e50 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d   p->rSetup<=pTem
21e60 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 0a 20 20  plate->rSetup.  
21e70 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70     && p->rRun<=p
21e80 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 0a 20  Template->rRun. 
21e90 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d      && p->nOut<=
21ea0 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 0a  pTemplate->nOut.
21eb0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
21ec0 54 68 69 73 20 62 72 61 6e 63 68 20 74 61 6b 65  This branch take
21ed0 6e 20 77 68 65 6e 20 70 20 69 73 20 65 71 75 61  n when p is equa
21ee0 6c 20 6f 72 20 62 65 74 74 65 72 20 74 68 61 6e  l or better than
21ef0 20 70 54 65 6d 70 6c 61 74 65 20 69 6e 20 0a 20   pTemplate in . 
21f00 20 20 20 20 20 2a 2a 20 61 6c 6c 20 6f 66 20 28       ** all of (
21f10 31 29 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  1) dependencies 
21f20 28 32 29 20 73 65 74 75 70 2d 63 6f 73 74 2c 20  (2) setup-cost, 
21f30 28 33 29 20 72 75 6e 2d 63 6f 73 74 2c 20 61 6e  (3) run-cost, an
21f40 64 0a 20 20 20 20 20 20 2a 2a 20 28 34 29 20 6e  d.      ** (4) n
21f50 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
21f60 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61  rows. */.      a
21f70 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
21f80 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  ==pTemplate->rSe
21f90 74 75 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28  tup );.      if(
21fa0 20 70 2d 3e 70 72 65 72 65 71 3d 3d 70 54 65 6d   p->prereq==pTem
21fb0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20  plate->prereq.  
21fc0 20 20 20 20 20 26 26 20 70 2d 3e 6e 4c 54 65 72       && p->nLTer
21fd0 6d 3c 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54  m<pTemplate->nLT
21fe0 65 72 6d 0a 20 20 20 20 20 20 20 26 26 20 28 70  erm.       && (p
21ff0 2d 3e 77 73 46 6c 61 67 73 20 26 20 70 54 65 6d  ->wsFlags & pTem
22000 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26  plate->wsFlags &
22010 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
22020 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70 2d  =0.       && (p-
22030 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3d  >u.btree.pIndex=
22040 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 75 2e 62 74  =pTemplate->u.bt
22050 72 65 65 2e 70 49 6e 64 65 78 0a 20 20 20 20 20  ree.pIndex.     
22060 20 20 20 20 20 7c 7c 20 70 54 65 6d 70 6c 61 74       || pTemplat
22070 65 2d 3e 72 52 75 6e 2b 70 2d 3e 6e 4c 54 65 72  e->rRun+p->nLTer
22080 6d 3c 3d 70 2d 3e 72 52 75 6e 2b 70 54 65 6d 70  m<=p->rRun+pTemp
22090 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 29 0a 20 20  late->nLTerm).  
220a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
220b0 2a 20 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65  * Overwrite an e
220c0 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
220d0 70 20 77 69 74 68 20 61 6e 20 73 69 6d 69 6c 61  p with an simila
220e0 72 20 6f 6e 65 20 74 68 61 74 20 75 73 65 73 0a  r one that uses.
220f0 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 72 65 20          ** more 
22100 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64  terms of the ind
22110 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  ex */.        pN
22120 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f  ext = p->pNextLo
22130 6f 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  op;.        brea
22140 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
22150 20 20 20 20 20 20 20 20 2f 2a 20 70 54 65 6d 70          /* pTemp
22160 6c 61 74 65 20 69 73 20 6e 6f 74 20 68 65 6c 70  late is not help
22170 66 75 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ful..        ** 
22180 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 63  Return without c
22190 68 61 6e 67 69 6e 67 20 6f 72 20 61 64 64 69 6e  hanging or addin
221a0 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  g anything */.  
221b0 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
221c0 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3b  LoopInsert_noop;
221d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
221e0 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
221f0 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q & pTemplate->p
22200 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74  rereq)==pTemplat
22210 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20 26  e->prereq.     &
22220 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70  & p->rRun>=pTemp
22230 6c 61 74 65 2d 3e 72 52 75 6e 0a 20 20 20 20 20  late->rRun.     
22240 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d  && p->nOut>=pTem
22250 70 6c 61 74 65 2d 3e 6e 4f 75 74 0a 20 20 20 20  plate->nOut.    
22260 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 76 65 72  ){.      /* Over
22270 77 72 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e  write an existin
22280 67 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68  g WhereLoop with
22290 20 61 20 62 65 74 74 65 72 20 6f 6e 65 3a 20 6f   a better one: o
222a0 6e 65 20 74 68 61 74 20 69 73 0a 20 20 20 20 20  ne that is.     
222b0 20 2a 2a 20 62 65 74 74 65 72 20 61 74 20 6f 6e   ** better at on
222c0 65 20 6f 66 20 28 31 29 20 64 65 70 65 6e 64 65  e of (1) depende
222d0 6e 63 69 65 73 2c 20 28 32 29 20 73 65 74 75 70  ncies, (2) setup
222e0 2d 63 6f 73 74 2c 20 28 33 29 20 72 75 6e 2d 63  -cost, (3) run-c
222f0 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  ost.      ** or 
22300 28 34 29 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  (4) number of ou
22310 74 70 75 74 20 72 6f 77 73 2c 20 61 6e 64 20 69  tput rows, and i
22320 73 20 6e 6f 20 77 6f 72 73 65 20 69 6e 20 61 6e  s no worse in an
22330 79 20 6f 66 20 74 68 6f 73 65 0a 20 20 20 20 20  y of those.     
22340 20 2a 2a 20 63 61 74 65 67 6f 72 69 65 73 2e 20   ** categories. 
22350 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
22360 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d   p->rSetup>=pTem
22370 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
22380 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41 52 49   /* SETUP-INVARI
22390 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20  ANT above */.   
223a0 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
223b0 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 62  extLoop;.      b
223c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
223d0 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
223e0 68 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  h this point it 
223f0 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65  means that eithe
22400 72 20 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  r p[] should be 
22410 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a  overwritten.  **
22420 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b   with pTemplate[
22430 5d 20 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c  ] if p[] exists,
22440 20 6f 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74   or if p==NULL t
22450 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e  hen allocate a n
22460 65 77 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f  ew.  ** WhereLoo
22470 70 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e  p and insert it.
22480 0a 20 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54  .  */.#if WHERET
22490 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
224a0 30 78 38 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  0x8 */.  if( sql
224b0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
224c0 20 30 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20   0x8 ){.    if( 
224d0 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p!=0 ){.      sq
224e0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
224f0 28 22 69 6e 73 2d 64 65 6c 3a 20 20 22 29 3b 0a  ("ins-del:  ");.
22500 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
22510 72 69 6e 74 28 70 2c 20 70 42 75 69 6c 64 65 72  rint(p, pBuilder
22520 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20  ->pWC);.    }.  
22530 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
22540 69 6e 74 66 28 22 69 6e 73 2d 6e 65 77 3a 20 20  intf("ins-new:  
22550 22 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f  ");.    whereLoo
22560 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65  pPrint(pTemplate
22570 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
22580 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
22590 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 70  f( p==0 ){.    p
225a0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
225b0 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
225c0 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20  (WhereLoop));.  
225d0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
225e0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
225f0 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49  ;.    whereLoopI
22600 6e 69 74 28 70 29 3b 0a 20 20 7d 0a 20 20 77 68  nit(p);.  }.  wh
22610 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20  ereLoopXfer(db, 
22620 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20  p, pTemplate);. 
22630 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20   p->pNextLoop = 
22640 70 4e 65 78 74 3b 0a 20 20 2a 70 70 50 72 65 76  pNext;.  *ppPrev
22650 20 3d 20 70 3b 0a 20 20 69 66 28 20 28 70 2d 3e   = p;.  if( (p->
22660 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
22670 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
22680 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
22690 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74 72  Index = p->u.btr
226a0 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  ee.pIndex;.    i
226b0 66 28 20 70 49 6e 64 65 78 20 26 26 20 70 49 6e  f( pIndex && pIn
226c0 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a  dex->tnum==0 ){.
226d0 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65        p->u.btree
226e0 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  .pIndex = 0;.   
226f0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
22700 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
22710 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68   Jump here if th
22720 65 20 69 6e 73 65 72 74 20 69 73 20 61 20 6e 6f  e insert is a no
22730 2d 6f 70 20 2a 2f 0a 77 68 65 72 65 4c 6f 6f 70  -op */.whereLoop
22740 49 6e 73 65 72 74 5f 6e 6f 6f 70 3a 0a 23 69 66  Insert_noop:.#if
22750 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
22760 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20  LED /* 0x8 */.  
22770 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
22780 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
22790 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
227a0 72 69 6e 74 66 28 22 69 6e 73 2d 6e 6f 6f 70 3a  rintf("ins-noop:
227b0 20 22 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f   ");.    whereLo
227c0 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
227d0 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  e, pBuilder->pWC
227e0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
227f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22800 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a  ;  .}../*.** Adj
22810 75 73 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  ust the WhereLoo
22820 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64 6f 77  p.nOut value dow
22830 6e 77 61 72 64 20 74 6f 20 61 63 63 6f 75 6e 74  nward to account
22840 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68   for terms of th
22850 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
22860 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  e that reference
22870 20 74 68 65 20 6c 6f 6f 70 20 62 75 74 20 77 68   the loop but wh
22880 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64  ich are not used
22890 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e   by an.** index.
228a0 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 75  .**.** In the cu
228b0 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
228c0 74 69 6f 6e 2c 20 74 68 65 20 66 69 72 73 74 20  tion, the first 
228d0 65 78 74 72 61 20 57 48 45 52 45 20 63 6c 61 75  extra WHERE clau
228e0 73 65 20 74 65 72 6d 20 72 65 64 75 63 65 73 0a  se term reduces.
228f0 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
22900 20 6f 75 74 70 75 74 20 72 6f 77 73 20 62 79 20   output rows by 
22910 61 20 66 61 63 74 6f 72 20 6f 66 20 31 30 20 61  a factor of 10 a
22920 6e 64 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e  nd each addition
22930 61 6c 20 74 65 72 6d 0a 2a 2a 20 72 65 64 75 63  al term.** reduc
22940 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
22950 20 6f 75 74 70 75 74 20 72 6f 77 73 20 62 79 20   output rows by 
22960 73 71 72 74 28 32 29 2e 0a 2a 2f 0a 73 74 61 74  sqrt(2)..*/.stat
22970 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
22980 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 57 68  pOutputAdjust(Wh
22990 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
229a0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
229b0 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
229c0 70 54 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69  pTerm, *pX;.  Bi
229d0 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64  tmask notAllowed
229e0 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72   = ~(pLoop->prer
229f0 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  eq|pLoop->maskSe
22a00 6c 66 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  lf);.  int i, j;
22a10 0a 0a 20 20 69 66 28 20 21 4f 70 74 69 6d 69 7a  ..  if( !Optimiz
22a20 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 43  ationEnabled(pWC
22a30 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
22a40 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 41 64 6a  ->db, SQLITE_Adj
22a50 75 73 74 4f 75 74 45 73 74 29 20 29 7b 0a 20 20  ustOutEst) ){.  
22a60 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
22a70 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d  for(i=pWC->nTerm
22a80 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
22a90 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b  i>0; i--, pTerm+
22aa0 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65  +){.    if( (pTe
22ab0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
22ac0 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 29  RM_VIRTUAL)!=0 )
22ad0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
22ae0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
22af0 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  l & pLoop->maskS
22b00 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  elf)==0 ) contin
22b10 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ue;.    if( (pTe
22b20 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
22b30 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29  notAllowed)!=0 )
22b40 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
22b50 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  or(j=pLoop->nLTe
22b60 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  rm-1; j>=0; j--)
22b70 7b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 4c 6f  {.      pX = pLo
22b80 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20  op->aLTerm[j];. 
22b90 20 20 20 20 20 69 66 28 20 70 58 3d 3d 30 20 29       if( pX==0 )
22ba0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
22bb0 20 69 66 28 20 70 58 3d 3d 70 54 65 72 6d 20 29   if( pX==pTerm )
22bc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
22bd0 28 20 70 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30  ( pX->iParent>=0
22be0 20 26 26 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d   && (&pWC->a[pX-
22bf0 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72  >iParent])==pTer
22c00 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  m ) break;.    }
22c10 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20 70  .    if( j<0 ) p
22c20 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54  Loop->nOut += pT
22c30 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a  erm->truthProb;.
22c40 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20    }.}../*.** We 
22c50 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63  have so far matc
22c60 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  hed pBuilder->pN
22c70 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
22c80 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64  terms of the ind
22c90 65 78 20 70 49 6e 64 65 78 2e 0a 2a 2a 20 54 72  ex pIndex..** Tr
22ca0 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d  y to match one m
22cb0 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50  ore..**.** If pP
22cc0 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74  robe->tnum==0, t
22cd0 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78  hat means pIndex
22ce0 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78   is a fake index
22cf0 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a   used for the.**
22d00 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
22d10 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   KEY..*/.static 
22d20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
22d30 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68  BtreeIndex(.  Wh
22d40 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
22d50 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a  pBuilder,     /*
22d60 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66   The WhereLoop f
22d70 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75  actory */.  stru
22d80 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
22d90 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46  *pSrc,      /* F
22da0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
22db0 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a  being analyzed *
22dc0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62  /.  Index *pProb
22dd0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
22de0 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
22df0 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67  on pSrc */.  Log
22e00 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20  Est nInMul      
22e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22e20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74  log(Number of it
22e30 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20  erations due to 
22e40 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  IN) */.){.  Wher
22e50 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
22e60 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
22e70 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c  ;  /* WHERE anal
22e80 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  yse context */. 
22e90 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
22ea0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
22eb0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
22ec0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
22ed0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
22ee0 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
22ef0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
22f00 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f  ection malloc co
22f10 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
22f20 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20  Loop *pNew;     
22f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
22f40 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  mplate WhereLoop
22f50 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
22f60 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ion */.  WhereTe
22f70 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
22f80 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68           /* A Wh
22f90 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f  ereTerm under co
22fa0 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  nsideration */. 
22fb0 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20   int opMask;    
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fd0 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74   /* Valid operat
22fe0 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69  ors for constrai
22ff0 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63  nts */.  WhereSc
23000 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20  an scan;        
23010 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
23020 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74  ator for WHERE t
23030 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  erms */.  Bitmas
23040 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20  k saved_prereq; 
23050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
23060 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
23070 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20  New->prereq */. 
23080 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72   u16 saved_nLTer
23090 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
230a0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
230b0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65  ue of pNew->nLTe
230c0 72 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  rm */.  u16 save
230d0 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20  d_nEq;          
230e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
230f0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
23100 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a  w->u.btree.nEq *
23110 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53  /.  u16 saved_nS
23120 6b 69 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  kip;            
23130 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
23140 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75  value of pNew->u
23150 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 2a 2f 0a  .btree.nSkip */.
23160 20 20 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c    u32 saved_wsFl
23170 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
23180 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
23190 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46  lue of pNew->wsF
231a0 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  lags */.  LogEst
231b0 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20   saved_nOut;    
231c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
231d0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
231e0 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69  New->nOut */.  i
231f0 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
23200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23210 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63  * Index of the c
23220 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62  olumn in the tab
23230 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  le */.  int rc =
23240 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
23250 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
23260 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45  n code */.  LogE
23270 73 74 20 6e 52 6f 77 45 73 74 3b 20 20 20 20 20  st nRowEst;     
23280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
23290 73 74 69 6d 61 74 65 64 20 69 6e 64 65 78 20 73  stimated index s
232a0 65 6c 65 63 74 69 76 69 74 79 20 2a 2f 0a 20 20  electivity */.  
232b0 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b  LogEst rLogSize;
232c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232d0 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20  /* Logarithm of 
232e0 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20  table size */.  
232f0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20  WhereTerm *pTop 
23300 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20  = 0, *pBtm = 0; 
23310 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f  /* Top and botto
23320 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  m range constrai
23330 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d  nts */..  pNew =
23340 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
23350 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
23360 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
23370 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a   SQLITE_NOMEM;..
23380 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d    assert( (pNew-
23390 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
233a0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
233b0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
233c0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
233d0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
233e0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ==0 );.  if( pNe
233f0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
23400 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a  RE_BTM_LIMIT ){.
23410 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
23420 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73  LT|WO_LE;.  }els
23430 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e  e if( pProbe->tn
23440 75 6d 3c 3d 30 20 7c 7c 20 28 70 53 72 63 2d 3e  um<=0 || (pSrc->
23450 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
23460 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70  FT)!=0 ){.    op
23470 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
23480 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57  IN|WO_GT|WO_GE|W
23490 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65  O_LT|WO_LE;.  }e
234a0 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  lse{.    opMask 
234b0 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  = WO_EQ|WO_IN|WO
234c0 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f  _ISNULL|WO_GT|WO
234d0 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  _GE|WO_LT|WO_LE;
234e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f 62  .  }.  if( pProb
234f0 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20  e->bUnordered ) 
23500 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47  opMask &= ~(WO_G
23510 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f  T|WO_GE|WO_LT|WO
23520 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  _LE);..  assert(
23530 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
23540 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  Eq<=pProbe->nKey
23550 43 6f 6c 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  Col );.  if( pNe
23560 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3c  w->u.btree.nEq <
23570 20 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c   pProbe->nKeyCol
23580 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
23590 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
235a0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
235b0 71 5d 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20  q];.    nRowEst 
235c0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
235d0 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74  pProbe->aiRowEst
235e0 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  [pNew->u.btree.n
235f0 45 71 2b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  Eq+1]);.    if( 
23600 6e 52 6f 77 45 73 74 3d 3d 30 20 26 26 20 70 50  nRowEst==0 && pP
23610 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  robe->onError==O
23620 45 5f 4e 6f 6e 65 20 29 20 6e 52 6f 77 45 73 74  E_None ) nRowEst
23630 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
23640 20 20 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20     iCol = -1;.  
23650 20 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b 0a 20    nRowEst = 0;. 
23660 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65   }.  pTerm = whe
23670 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
23680 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c  , pBuilder->pWC,
23690 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20   pSrc->iCursor, 
236a0 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  iCol,.          
236b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
236c0 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20  Mask, pProbe);. 
236d0 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65   saved_nEq = pNe
236e0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  w->u.btree.nEq;.
236f0 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20    saved_nSkip = 
23700 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53  pNew->u.btree.nS
23710 6b 69 70 3b 0a 20 20 73 61 76 65 64 5f 6e 4c 54  kip;.  saved_nLT
23720 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65  erm = pNew->nLTe
23730 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73 46 6c  rm;.  saved_wsFl
23740 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46 6c  ags = pNew->wsFl
23750 61 67 73 3b 0a 20 20 73 61 76 65 64 5f 70 72 65  ags;.  saved_pre
23760 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72  req = pNew->prer
23770 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75 74  eq;.  saved_nOut
23780 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20   = pNew->nOut;. 
23790 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
237a0 30 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20  0;.  rLogSize = 
237b0 65 73 74 4c 6f 67 28 73 71 6c 69 74 65 33 4c 6f  estLog(sqlite3Lo
237c0 67 45 73 74 28 70 50 72 6f 62 65 2d 3e 61 69 52  gEst(pProbe->aiR
237d0 6f 77 45 73 74 5b 30 5d 29 29 3b 0a 0a 20 20 2f  owEst[0]));..  /
237e0 2a 20 43 6f 6e 73 69 64 65 72 20 75 73 69 6e 67  * Consider using
237f0 20 61 20 73 6b 69 70 2d 73 63 61 6e 20 69 66 20   a skip-scan if 
23800 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45  there are no WHE
23810 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
23820 61 69 6e 74 73 0a 20 20 2a 2a 20 61 76 61 69 6c  aints.  ** avail
23830 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6c 65 66  able for the lef
23840 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 6f 66 20  t-most terms of 
23850 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 69  the index, and i
23860 66 20 74 68 65 20 61 76 65 72 61 67 65 0a 20 20  f the average.  
23870 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 70  ** number of rep
23880 65 61 74 73 20 69 6e 20 74 68 65 20 6c 65 66 74  eats in the left
23890 2d 6d 6f 73 74 20 74 65 72 6d 73 20 69 73 20 61  -most terms is a
238a0 74 20 6c 65 61 73 74 20 31 38 2e 20 20 54 68 65  t least 18.  The
238b0 20 6d 61 67 69 63 0a 20 20 2a 2a 20 6e 75 6d 62   magic.  ** numb
238c0 65 72 20 31 38 20 77 61 73 20 66 6f 75 6e 64 20  er 18 was found 
238d0 62 79 20 65 78 70 65 72 69 6d 65 6e 74 61 74 69  by experimentati
238e0 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 70 61 79  on to be the pay
238f0 6f 66 66 20 70 6f 69 6e 74 20 77 68 65 72 65 0a  off point where.
23900 20 20 2a 2a 20 73 6b 69 70 2d 73 63 61 6e 20 62    ** skip-scan b
23910 65 63 6f 6d 65 20 66 61 73 74 65 72 20 74 68 61  ecome faster tha
23920 6e 20 61 20 66 75 6c 6c 2d 73 63 61 6e 2e 0a 20  n a full-scan.. 
23930 20 2a 2f 0a 20 20 69 66 28 20 70 54 65 72 6d 3d   */.  if( pTerm=
23940 3d 30 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e  =0.   && saved_n
23950 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a  Eq==saved_nSkip.
23960 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71 2b     && saved_nEq+
23970 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  1<pProbe->nKeyCo
23980 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e  l.   && pProbe->
23990 61 69 52 6f 77 45 73 74 5b 73 61 76 65 64 5f 6e  aiRowEst[saved_n
239a0 45 71 2b 31 5d 3e 3d 31 38 20 20 2f 2a 20 54 55  Eq+1]>=18  /* TU
239b0 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f  NING: Minimum fo
239c0 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a 20  r skip-scan */. 
239d0 20 20 26 26 20 28 72 63 20 3d 20 77 68 65 72 65    && (rc = where
239e0 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
239f0 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  New, pNew->nLTer
23a00 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  m+1))==SQLITE_OK
23a10 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74  .  ){.    LogEst
23a20 20 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65 77   nIter;.    pNew
23a30 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b  ->u.btree.nEq++;
23a40 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
23a50 65 65 2e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20  ee.nSkip++;.    
23a60 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65  pNew->aLTerm[pNe
23a70 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30  w->nLTerm++] = 0
23a80 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ;.    pNew->wsFl
23a90 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49  ags |= WHERE_SKI
23aa0 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72  PSCAN;.    nIter
23ab0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
23ac0 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73  (pProbe->aiRowEs
23ad0 74 5b 30 5d 2f 70 50 72 6f 62 65 2d 3e 61 69 52  t[0]/pProbe->aiR
23ae0 6f 77 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b  owEst[saved_nEq+
23af0 31 5d 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f  1]);.    whereLo
23b00 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
23b10 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
23b20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72 29 3b 0a  pProbe, nIter);.
23b30 20 20 7d 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d    }.  for(; rc==
23b40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65  SQLITE_OK && pTe
23b50 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77  rm!=0; pTerm = w
23b60 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63  hereScanNext(&sc
23b70 61 6e 29 29 7b 0a 20 20 20 20 69 6e 74 20 6e 49  an)){.    int nI
23b80 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  n = 0;.#ifdef SQ
23b90 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
23ba0 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69  3_OR_STAT4.    i
23bb0 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70  nt nRecValid = p
23bc0 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
23bd0 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  id;.#endif.    i
23be0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
23bf0 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  ator==WO_ISNULL 
23c00 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  || (pTerm->wtFla
23c10 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d  gs&TERM_VNULL)!=
23c20 30 29 0a 20 20 20 20 20 26 26 20 28 69 43 6f 6c  0).     && (iCol
23c30 3c 30 20 7c 7c 20 70 53 72 63 2d 3e 70 54 61 62  <0 || pSrc->pTab
23c40 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74  ->aCol[iCol].not
23c50 4e 75 6c 6c 29 0a 20 20 20 20 29 7b 0a 20 20 20  Null).    ){.   
23c60 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20     continue; /* 
23c70 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20  ignore IS [NOT] 
23c80 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
23c90 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c   on NOT NULL col
23ca0 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  umns */.    }.  
23cb0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
23cc0 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
23cd0 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
23ce0 69 6e 75 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  inue;..    asser
23cf0 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73  t( pNew->nOut==s
23d00 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 0a 20 20  aved_nOut );..  
23d10 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
23d20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  = saved_wsFlags;
23d30 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
23d40 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e  ee.nEq = saved_n
23d50 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  Eq;.    pNew->nL
23d60 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54  Term = saved_nLT
23d70 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65  erm;.    if( whe
23d80 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
23d90 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54   pNew, pNew->nLT
23da0 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20  erm+1) ) break; 
23db0 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e  /* OOM */.    pN
23dc0 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
23dd0 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65  >nLTerm++] = pTe
23de0 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72  rm;.    pNew->pr
23df0 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72  ereq = (saved_pr
23e00 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72  ereq | pTerm->pr
23e10 65 72 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e  ereqRight) & ~pN
23e20 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  ew->maskSelf;.  
23e30 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72    pNew->rRun = r
23e40 4c 6f 67 53 69 7a 65 3b 20 2f 2a 20 42 61 73 65  LogSize; /* Base
23e50 6c 69 6e 65 20 63 6f 73 74 20 69 73 20 6c 6f 67  line cost is log
23e60 32 28 4e 29 2e 20 20 41 64 6a 75 73 74 6d 65 6e  2(N).  Adjustmen
23e70 74 73 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  ts below */.    
23e80 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
23e90 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a  ator & WO_IN ){.
23ea0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
23eb0 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
23ec0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
23ed0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
23ee0 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20  OLUMN_IN;.      
23ef0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
23f00 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
23f10 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
23f20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45      /* "x IN (SE
23f30 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e  LECT ...)":  TUN
23f40 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20  ING: the SELECT 
23f50 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20  returns 25 rows 
23f60 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d  */.        nIn =
23f70 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34 36   46;  assert( 46
23f80 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
23f90 32 35 29 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c  25) );.      }el
23fa0 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45  se if( ALWAYS(pE
23fb0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20  xpr->x.pList && 
23fc0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
23fd0 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  nExpr) ){.      
23fe0 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75    /* "x IN (valu
23ff0 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20  e, value, ...)" 
24000 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d  */.        nIn =
24010 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70   sqlite3LogEst(p
24020 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
24030 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
24040 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
24050 2b 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 70 4e  += nIn;.      pN
24060 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b  ew->u.btree.nEq+
24070 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  +;.      pNew->n
24080 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20  Out = nRowEst + 
24090 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20  nInMul + nIn;.  
240a0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72    }else if( pTer
240b0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
240c0 57 4f 5f 45 51 29 20 29 7b 0a 20 20 20 20 20 20  WO_EQ) ){.      
240d0 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 20  assert(.        
240e0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
240f0 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e   (WHERE_COLUMN_N
24100 55 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ULL|WHERE_COLUMN
24110 5f 49 4e 7c 57 48 45 52 45 5f 53 4b 49 50 53 43  _IN|WHERE_SKIPSC
24120 41 4e 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  AN))!=0.        
24130 7c 7c 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20  || nInMul==0.   
24140 20 20 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77     );.      pNew
24150 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
24160 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20  RE_COLUMN_EQ;.  
24170 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 20      if( iCol<0  
24180 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 72 6f  .       || (pPro
24190 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  be->onError!=OE_
241a0 4e 6f 6e 65 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d  None && nInMul==
241b0 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
241c0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
241d0 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43  q==pProbe->nKeyC
241e0 6f 6c 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20  ol-1).      ){. 
241f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
24200 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
24210 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
24220 3d 3d 30 20 7c 7c 20 69 43 6f 6c 3c 30 20 29 3b  ==0 || iCol<0 );
24230 0a 20 20 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 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 7d 0a  ONEROW;.      }.
24260 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
24270 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20  ree.nEq++;.     
24280 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52   pNew->nOut = nR
24290 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 3b 0a  owEst + nInMul;.
242a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
242b0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
242c0 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a   (WO_ISNULL) ){.
242d0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
242e0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
242f0 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  UMN_NULL;.      
24300 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
24310 71 2b 2b 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55  q++;.      /* TU
24320 4e 49 4e 47 3a 20 49 53 20 4e 55 4c 4c 20 73 65  NING: IS NULL se
24330 6c 65 63 74 73 20 32 20 72 6f 77 73 20 2a 2f 0a  lects 2 rows */.
24340 20 20 20 20 20 20 6e 49 6e 20 3d 20 31 30 3b 20        nIn = 10; 
24350 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c   assert( 10==sql
24360 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b  ite3LogEst(2) );
24370 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
24380 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49  t = nRowEst + nI
24390 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20  nMul + nIn;.    
243a0 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d  }else if( pTerm-
243b0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
243c0 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20  _GT|WO_GE) ){.  
243d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
243e0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
243f0 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20 20   WO_GT );.      
24400 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
24410 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
24420 47 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  GE );.      pNew
24430 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
24440 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
24450 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b  WHERE_BTM_LIMIT;
24460 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54  .      pBtm = pT
24470 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20  erm;.      pTop 
24480 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
24490 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
244a0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
244b0 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29   (WO_LT|WO_LE) )
244c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
244d0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
244e0 6f 72 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20  or & WO_LT );.  
244f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
24500 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
24510 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20   WO_LE );.      
24520 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
24530 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
24540 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49  NGE|WHERE_TOP_LI
24550 4d 49 54 3b 0a 20 20 20 20 20 20 70 54 6f 70 20  MIT;.      pTop 
24560 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  = pTerm;.      p
24570 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46  Btm = (pNew->wsF
24580 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
24590 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20  _LIMIT)!=0 ?.   
245a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245b0 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70    pNew->aLTerm[p
245c0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a  New->nLTerm-2] :
245d0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
245e0 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  ( pNew->wsFlags 
245f0 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  & WHERE_COLUMN_R
24600 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ANGE ){.      /*
24610 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 61 6e 64   Adjust nOut and
24620 20 72 52 75 6e 20 66 6f 72 20 53 54 41 54 33 20   rRun for STAT3 
24630 72 61 6e 67 65 20 76 61 6c 75 65 73 20 2a 2f 0a  range values */.
24640 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
24650 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f  ew->nOut==saved_
24660 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 77 68  nOut );.      wh
24670 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28  ereRangeScanEst(
24680 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
24690 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70 4e  , pBtm, pTop, pN
246a0 65 77 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  ew);.    }.#ifde
246b0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
246c0 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
246d0 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30     if( nInMul==0
246e0 20 0a 20 20 20 20 20 26 26 20 70 50 72 6f 62 65   .     && pProbe
246f0 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20  ->nSample .     
24700 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  && pNew->u.btree
24710 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53  .nEq<=pProbe->nS
24720 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20 26 26  ampleCol.     &&
24730 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
24740 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
24750 53 74 61 74 33 29 20 0a 20 20 20 20 29 7b 0a 20  Stat3) .    ){. 
24760 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
24770 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
24780 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e  .      tRowcnt n
24790 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  Out = 0;.      i
247a0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
247b0 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f  ator & (WO_EQ|WO
247c0 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a  _ISNULL))!=0 ){.
247d0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
247e0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
247f0 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
24800 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
24810 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
24820 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
24830 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
24840 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70  reEqualScanEst(p
24850 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
24860 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
24870 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65  &nOut);.      }e
24880 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  lse if( (pTerm->
24890 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
248a0 4e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  N).             
248b0 26 26 20 20 21 45 78 70 72 48 61 73 50 72 6f 70  &&  !ExprHasProp
248c0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
248d0 49 73 53 65 6c 65 63 74 29 20 20 29 7b 0a 20 20  IsSelect)  ){.  
248e0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
248f0 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  InScanEst(pParse
24900 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70  , pBuilder, pExp
24910 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75  r->x.pList, &nOu
24920 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
24930 20 20 61 73 73 65 72 74 28 20 6e 4f 75 74 3d 3d    assert( nOut==
24940 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
24950 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OK );.      if( 
24960 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  nOut ){.        
24970 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c  pNew->nOut = sql
24980 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29  ite3LogEst(nOut)
24990 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
249a0 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f 6e  ew->nOut>saved_n
249b0 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74  Out ) pNew->nOut
249c0 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20   = saved_nOut;. 
249d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
249e0 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4e 65  dif.    if( (pNe
249f0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  w->wsFlags & (WH
24a00 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45  ERE_IDX_ONLY|WHE
24a10 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20  RE_IPK))==0 ){. 
24a20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 72 6f 77       /* Each row
24a30 20 69 6e 76 6f 6c 76 65 73 20 61 20 73 74 65 70   involves a step
24a40 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20 74   of the index, t
24a50 68 65 6e 20 61 20 62 69 6e 61 72 79 20 73 65 61  hen a binary sea
24a60 72 63 68 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  rch of.      ** 
24a70 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 2a  the main table *
24a80 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52  /.      pNew->rR
24a90 75 6e 20 3d 20 20 73 71 6c 69 74 65 33 4c 6f 67  un =  sqlite3Log
24aa0 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75  EstAdd(pNew->rRu
24ab0 6e 2c 72 4c 6f 67 53 69 7a 65 3e 32 37 20 3f 20  n,rLogSize>27 ? 
24ac0 72 4c 6f 67 53 69 7a 65 2d 31 37 20 3a 20 31 30  rLogSize-17 : 10
24ad0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
24ae0 53 74 65 70 20 63 6f 73 74 20 66 6f 72 20 65 61  Step cost for ea
24af0 63 68 20 6f 75 74 70 75 74 20 72 6f 77 20 2a 2f  ch output row */
24b00 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20  .    pNew->rRun 
24b10 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
24b20 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  dd(pNew->rRun, p
24b30 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20  New->nOut);.    
24b40 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
24b50 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72 2d 3e  djust(pBuilder->
24b60 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  pWC, pNew);.    
24b70 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
24b80 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
24b90 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 28 70  New);.    if( (p
24ba0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
24bb0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d  HERE_TOP_LIMIT)=
24bc0 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d  =0.     && pNew-
24bd0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 28 70 50  >u.btree.nEq<(pP
24be0 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 20 2b 20  robe->nKeyCol + 
24bf0 28 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 21 3d  (pProbe->zName!=
24c00 30 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  0)).    ){.     
24c10 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
24c20 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72  eeIndex(pBuilder
24c30 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20  , pSrc, pProbe, 
24c40 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20  nInMul+nIn);.   
24c50 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75   }.    pNew->nOu
24c60 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
24c70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
24c80 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
24c90 41 54 34 0a 20 20 20 20 70 42 75 69 6c 64 65 72  AT4.    pBuilder
24ca0 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52  ->nRecValid = nR
24cb0 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a  ecValid;.#endif.
24cc0 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72    }.  pNew->prer
24cd0 65 71 20 3d 20 73 61 76 65 64 5f 70 72 65 72 65  eq = saved_prere
24ce0 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  q;.  pNew->u.btr
24cf0 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e  ee.nEq = saved_n
24d00 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74  Eq;.  pNew->u.bt
24d10 72 65 65 2e 6e 53 6b 69 70 20 3d 20 73 61 76 65  ree.nSkip = save
24d20 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d  d_nSkip;.  pNew-
24d30 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64  >wsFlags = saved
24d40 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  _wsFlags;.  pNew
24d50 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
24d60 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54  Out;.  pNew->nLT
24d70 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65  erm = saved_nLTe
24d80 72 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  rm;.  return rc;
24d90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
24da0 20 54 72 75 65 20 69 66 20 69 74 20 69 73 20 70   True if it is p
24db0 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70 49 6e  ossible that pIn
24dc0 64 65 78 20 6d 69 67 68 74 20 62 65 20 75 73 65  dex might be use
24dd0 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d  ful in.** implem
24de0 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52  enting the ORDER
24df0 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70 42   BY clause in pB
24e00 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  uilder..**.** Re
24e10 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20 70 42  turn False if pB
24e20 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74 20  uilder does not 
24e30 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45 52  contain an ORDER
24e40 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a   BY clause or.**
24e50 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
24e60 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78 20 74  way for pIndex t
24e70 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e 20 69  o be useful in i
24e80 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61 74  mplementing that
24e90 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61  .** ORDER BY cla
24ea0 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
24eb0 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c  nt indexMightHel
24ec0 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a 20 20  pWithOrderBy(.  
24ed0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
24ee0 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e   *pBuilder,.  In
24ef0 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69  dex *pIndex,.  i
24f00 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20  nt iCursor.){.  
24f10 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20  ExprList *pOB;. 
24f20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20   int ii, jj;..  
24f30 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f  if( pIndex->bUno
24f40 72 64 65 72 65 64 20 29 20 72 65 74 75 72 6e 20  rdered ) return 
24f50 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20 3d 20  0;.  if( (pOB = 
24f60 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
24f70 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30 20 29  ->pOrderBy)==0 )
24f80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72   return 0;.  for
24f90 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e  (ii=0; ii<pOB->n
24fa0 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
24fb0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73   Expr *pExpr = s
24fc0 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
24fd0 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d  llate(pOB->a[ii]
24fe0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
24ff0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
25000 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
25010 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
25020 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72  >iTable==iCursor
25030 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a   ){.      for(jj
25040 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e  =0; jj<pIndex->n
25050 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20  KeyCol; jj++){. 
25060 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
25070 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65  ->iColumn==pInde
25080 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20  x->aiColumn[jj] 
25090 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
250a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
250b0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
250c0 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 69 74 6d  ** Return a bitm
250d0 61 73 6b 20 77 68 65 72 65 20 31 73 20 69 6e 64  ask where 1s ind
250e0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 63  icate that the c
250f0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c  orresponding col
25100 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61  umn of.** the ta
25110 62 6c 65 20 69 73 20 75 73 65 64 20 62 79 20 61  ble is used by a
25120 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74  n index.  Only t
25130 68 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c 75  he first 63 colu
25140 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  mns are consider
25150 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  ed..*/.static Bi
25160 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49  tmask columnsInI
25170 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78  ndex(Index *pIdx
25180 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d  ){.  Bitmask m =
25190 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66   0;.  int j;.  f
251a0 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  or(j=pIdx->nColu
251b0 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  mn-1; j>=0; j--)
251c0 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49  {.    int x = pI
251d0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
251e0 0a 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b  .    if( x>=0 ){
251f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
25200 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20   x==BMS-1 );.   
25210 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
25220 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 69  BMS-2 );.      i
25230 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c  f( x<BMS-1 ) m |
25240 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20  = MASKBIT(x);.  
25250 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
25260 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20   m;.}../* Check 
25270 74 6f 20 73 65 65 20 69 66 20 61 20 70 61 72 74  to see if a part
25280 69 61 6c 20 69 6e 64 65 78 20 77 69 74 68 20 70  ial index with p
25290 50 61 72 74 49 6e 64 65 78 57 68 65 72 65 20 63  PartIndexWhere c
252a0 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e  an be used.** in
252b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 71 75 65   the current que
252c0 72 79 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  ry.  Return true
252d0 20 69 66 20 69 74 20 63 61 6e 20 62 65 20 61 6e   if it can be an
252e0 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  d false if not..
252f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
25300 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c  ereUsablePartial
25310 49 6e 64 65 78 28 69 6e 74 20 69 54 61 62 2c 20  Index(int iTab, 
25320 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
25330 2c 20 45 78 70 72 20 2a 70 57 68 65 72 65 29 7b  , Expr *pWhere){
25340 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
25350 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
25360 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70  for(i=0, pTerm=p
25370 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
25380 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
25390 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
253a0 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
253b0 70 72 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  pr(pTerm->pExpr,
253c0 20 70 57 68 65 72 65 2c 20 69 54 61 62 29 20 29   pWhere, iTab) )
253d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
253e0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
253f0 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
25400 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
25410 72 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  r a single table
25420 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77 68 65   of the join whe
25430 72 65 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  re the table.** 
25440 69 73 20 69 64 65 6e 66 69 65 64 20 62 79 20 70  is idenfied by p
25450 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69  Builder->pNew->i
25460 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65  Tab.  That table
25470 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
25480 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65  o be.** a b-tree
25490 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69   table, not a vi
254a0 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a  rtual table..*/.
254b0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
254c0 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 0a 20 20  LoopAddBtree(.  
254d0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
254e0 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57   *pBuilder, /* W
254f0 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f  HERE clause info
25500 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  rmation */.  Bit
25510 6d 61 73 6b 20 6d 45 78 74 72 61 20 20 20 20 20  mask mExtra     
25520 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
25530 61 20 70 72 65 72 65 71 75 65 73 69 74 65 73 20  a prerequesites 
25540 66 6f 72 20 75 73 69 6e 67 20 74 68 69 73 20 74  for using this t
25550 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  able */.){.  Whe
25560 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
25570 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52           /* WHER
25580 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65  E analysis conte
25590 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
255a0 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20  Probe;          
255b0 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
255c0 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e  we are evaluatin
255d0 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b  g */.  Index sPk
255e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
255f0 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64     /* A fake ind
25600 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  ex object for th
25610 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f  e primary key */
25620 0a 20 20 74 52 6f 77 63 6e 74 20 61 69 52 6f 77  .  tRowcnt aiRow
25630 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20 2f  EstPk[2];      /
25640 2a 20 54 68 65 20 61 69 52 6f 77 45 73 74 5b 5d  * The aiRowEst[]
25650 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
25660 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31  Pk index */.  i1
25670 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d  6 aiColumnPk = -
25680 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  1;        /* The
25690 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65   aColumn[] value
256a0 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64   for the sPk ind
256b0 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ex */.  SrcList 
256c0 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20  *pTabList;      
256d0 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
256e0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
256f0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
25700 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46  *pSrc;  /* The F
25710 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65  ROM clause btree
25720 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a   term to add */.
25730 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
25740 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  w;            /*
25750 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c   Template WhereL
25760 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
25770 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
25780 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52  OK;         /* R
25790 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
257a0 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31  int iSortIdx = 1
257b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
257c0 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
257d0 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20   int b;         
257e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
257f0 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20  A boolean value 
25800 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a  */.  LogEst rSiz
25810 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
25820 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f   /* number of ro
25830 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
25840 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67  */.  LogEst rLog
25850 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
25860 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66   /* Logarithm of
25870 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
25880 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
25890 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
258a0 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
258b0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20    /* The parsed 
258c0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
258d0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
258e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
258f0 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   Table being que
25900 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65  ried */.  .  pNe
25910 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
25920 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70  ew;.  pWInfo = p
25930 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
25940 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57  .  pTabList = pW
25950 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
25960 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73    pSrc = pTabLis
25970 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61  t->a + pNew->iTa
25980 62 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  b;.  pTab = pSrc
25990 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20  ->pTab;.  pWC = 
259a0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
259b0 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72 74   assert( !IsVirt
259c0 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20  ual(pSrc->pTab) 
259d0 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e  );..  if( pSrc->
259e0 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a  pIndex ){.    /*
259f0 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   An INDEXED BY c
25a00 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73 20  lause specifies 
25a10 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
25a20 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20  ex to use */.   
25a30 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e   pProbe = pSrc->
25a40 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20  pIndex;.  }else 
25a50 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
25a60 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62  ab) ){.    pProb
25a70 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  e = pTab->pIndex
25a80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
25a90 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e  * There is no IN
25aa0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e  DEXED BY clause.
25ab0 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20    Create a fake 
25ac0 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20  Index object in 
25ad0 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72  local.    ** var
25ae0 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70  iable sPk to rep
25af0 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64  resent the rowid
25b00 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
25b10 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20  ex.  Make this. 
25b20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78     ** fake index
25b30 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
25b40 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f  chain of Index o
25b50 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20  bjects with all 
25b60 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20  of the real.    
25b70 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f  ** indices to fo
25b80 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65  llow */.    Inde
25b90 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  x *pFirst;      
25ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
25bb0 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64  irst of real ind
25bc0 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
25bd0 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  e */.    memset(
25be0 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sPk, 0, sizeof(
25bf0 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b  Index));.    sPk
25c00 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20  .nKeyCol = 1;.  
25c10 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d    sPk.aiColumn =
25c20 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20   &aiColumnPk;.  
25c30 20 20 73 50 6b 2e 61 69 52 6f 77 45 73 74 20 3d    sPk.aiRowEst =
25c40 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20   aiRowEstPk;.   
25c50 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f   sPk.onError = O
25c60 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20 20 73  E_Replace;.    s
25c70 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  Pk.pTable = pTab
25c80 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b  ;.    aiRowEstPk
25c90 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77  [0] = pTab->nRow
25ca0 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Est;.    aiRowEs
25cb0 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20  tPk[1] = 1;.    
25cc0 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70  pFirst = pSrc->p
25cd0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
25ce0 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e   if( pSrc->notIn
25cf0 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  dexed==0 ){.    
25d00 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e    /* The real in
25d10 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62  dices of the tab
25d20 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73  le are only cons
25d30 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20  idered if the.  
25d40 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58      ** NOT INDEX
25d50 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  ED qualifier is 
25d60 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
25d70 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
25d80 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20        sPk.pNext 
25d90 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a  = pFirst;.    }.
25da0 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50      pProbe = &sP
25db0 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d  k;.  }.  rSize =
25dc0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70   sqlite3LogEst(p
25dd0 54 61 62 2d 3e 6e 52 6f 77 45 73 74 29 3b 0a 20  Tab->nRowEst);. 
25de0 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c   rLogSize = estL
25df0 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e  og(rSize);..#ifn
25e00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25e10 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
25e20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69    /* Automatic i
25e30 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20  ndexes */.  if( 
25e40 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65  !pBuilder->pOrSe
25e50 74 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d  t.   && (pWInfo-
25e60 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  >pParse->db->fla
25e70 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f  gs & SQLITE_Auto
25e80 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26 26 20  Index)!=0.   && 
25e90 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a  pSrc->pIndex==0.
25ea0 20 20 20 26 26 20 21 70 53 72 63 2d 3e 76 69 61     && !pSrc->via
25eb0 43 6f 72 6f 75 74 69 6e 65 0a 20 20 20 26 26 20  Coroutine.   && 
25ec0 21 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65  !pSrc->notIndexe
25ed0 64 0a 20 20 20 26 26 20 48 61 73 52 6f 77 69 64  d.   && HasRowid
25ee0 28 70 54 61 62 29 0a 20 20 20 26 26 20 21 70 53  (pTab).   && !pS
25ef0 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64  rc->isCorrelated
25f00 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e  .  ){.    /* Gen
25f10 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78  erate auto-index
25f20 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20   WhereLoops */. 
25f30 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
25f40 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65  erm;.    WhereTe
25f50 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43  rm *pWCEnd = pWC
25f60 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d  ->a + pWC->nTerm
25f70 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
25f80 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49  pWC->a; rc==SQLI
25f90 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70  TE_OK && pTerm<p
25fa0 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
25fb0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
25fc0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
25fd0 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29  pNew->maskSelf )
25fe0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
25ff0 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
26000 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
26010 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  rc, 0) ){.      
26020 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
26030 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nEq = 1;.       
26040 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
26050 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Skip = 0;.      
26060 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
26070 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
26080 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
26090 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 1;.        pN
260a0 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20  ew->aLTerm[0] = 
260b0 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f  pTerm;.        /
260c0 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69  * TUNING: One-ti
260d0 6d 65 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70  me cost for comp
260e0 75 74 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61  uting the automa
260f0 74 69 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20  tic index is.   
26100 20 20 20 20 20 2a 2a 20 61 70 70 72 6f 78 69 6d       ** approxim
26110 61 74 65 6c 79 20 37 2a 4e 2a 6c 6f 67 32 28 4e  ately 7*N*log2(N
26120 29 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  ) where N is the
26130 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
26140 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  in.        ** th
26150 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e  e table being in
26160 64 65 78 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  dexed. */.      
26170 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
26180 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a   rLogSize + rSiz
26190 65 20 2b 20 32 38 3b 20 20 61 73 73 65 72 74 28  e + 28;  assert(
261a0 20 32 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   28==sqlite3LogE
261b0 73 74 28 37 29 20 29 3b 0a 20 20 20 20 20 20 20  st(7) );.       
261c0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63 68   /* TUNING: Each
261d0 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69   index lookup yi
261e0 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e 20  elds 20 rows in 
261f0 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73  the table.  This
26200 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d  .        ** is m
26210 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75 73 75  ore than the usu
26220 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20 72  al guess of 10 r
26230 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68 61  ows, since we ha
26240 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20 20  ve no way.      
26250 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 6e 69 6e 67    ** of knowning
26260 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20 74   how selective t
26270 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c  he index will ul
26280 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49 74  timately be.  It
26290 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a   would.        *
262a0 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73 6f  * not be unreaso
262b0 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68  nable to make th
262c0 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c 61  is value much la
262d0 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rger. */.       
262e0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33   pNew->nOut = 43
262f0 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d 73  ;  assert( 43==s
26300 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 30 29  qlite3LogEst(20)
26310 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   );.        pNew
26320 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
26330 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69  LogEstAdd(rLogSi
26340 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a  ze,pNew->nOut);.
26350 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
26360 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41 55  Flags = WHERE_AU
26370 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20  TO_INDEX;.      
26380 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
26390 20 6d 45 78 74 72 61 20 7c 20 70 54 65 72 6d 2d   mExtra | pTerm-
263a0 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20  >prereqRight;.  
263b0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
263c0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
263d0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
263e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
263f0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
26400 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
26410 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f  DEX */..  /* Loo
26420 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63  p over all indic
26430 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20  es.  */.  for(; 
26440 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
26450 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d   pProbe; pProbe=
26460 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69  pProbe->pNext, i
26470 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20  SortIdx++){.    
26480 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50 61 72  if( pProbe->pPar
26490 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20  tIdxWhere!=0.   
264a0 20 20 26 26 20 21 77 68 65 72 65 55 73 61 62 6c    && !whereUsabl
264b0 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 70 4e  ePartialIndex(pN
264c0 65 77 2d 3e 69 54 61 62 2c 20 70 57 43 2c 20 70  ew->iTab, pWC, p
264d0 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57  Probe->pPartIdxW
264e0 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 63  here) ){.      c
264f0 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72  ontinue;  /* Par
26500 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61 70 70  tial index inapp
26510 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 69  ropriate for thi
26520 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d  s query */.    }
26530 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
26540 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20  ee.nEq = 0;.    
26550 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53  pNew->u.btree.nS
26560 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  kip = 0;.    pNe
26570 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20  w->nLTerm = 0;. 
26580 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64     pNew->iSortId
26590 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  x = 0;.    pNew-
265a0 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20  >rSetup = 0;.   
265b0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
265c0 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e 65 77  mExtra;.    pNew
265d0 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a  ->nOut = rSize;.
265e0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
265f0 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62  e.pIndex = pProb
26600 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78  e;.    b = index
26610 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64  MightHelpWithOrd
26620 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70  erBy(pBuilder, p
26630 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75  Probe, pSrc->iCu
26640 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68  rsor);.    /* Th
26650 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  e ONEPASS_DESIRE
26660 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f 63  D flags never oc
26670 63 75 72 73 20 74 6f 67 65 74 68 65 72 20 77 69  curs together wi
26680 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20  th ORDER BY */. 
26690 20 20 20 61 73 73 65 72 74 28 20 28 70 57 49 6e     assert( (pWIn
266a0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
266b0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
266c0 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d  ESIRED)==0 || b=
266d0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
266e0 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b  robe->tnum<=0 ){
266f0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65  .      /* Intege
26700 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  r primary key in
26710 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  dex */.      pNe
26720 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
26730 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f  RE_IPK;..      /
26740 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  * Full table sca
26750 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  n */.      pNew-
26760 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
26770 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20  iSortIdx : 0;.  
26780 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
26790 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c  ost of full tabl
267a0 65 20 73 63 61 6e 20 69 73 20 33 2a 28 4e 20 2b  e scan is 3*(N +
267b0 20 6c 6f 67 32 28 4e 29 29 2e 0a 20 20 20 20 20   log2(N))..     
267c0 20 2a 2a 20 20 2b 20 20 54 68 65 20 65 78 74 72   **  +  The extr
267d0 61 20 33 20 66 61 63 74 6f 72 20 69 73 20 74 6f  a 3 factor is to
267e0 20 65 6e 63 6f 75 72 61 67 65 20 74 68 65 20 75   encourage the u
267f0 73 65 20 6f 66 20 69 6e 64 65 78 65 64 20 6c 6f  se of indexed lo
26800 6f 6b 75 70 73 0a 20 20 20 20 20 20 2a 2a 20 20  okups.      **  
26810 20 20 20 6f 76 65 72 20 66 75 6c 6c 20 73 63 61     over full sca
26820 6e 73 2e 20 20 46 49 58 4d 45 20 2a 2f 0a 20 20  ns.  FIXME */.  
26830 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
26840 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
26850 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69 7a 65  d(rSize,rLogSize
26860 29 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 77 68  ) + 16;.      wh
26870 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a  ereLoopOutputAdj
26880 75 73 74 28 70 57 43 2c 20 70 4e 65 77 29 3b 0a  ust(pWC, pNew);.
26890 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
268a0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
268b0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
268c0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
268d0 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
268e0 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
268f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74  }else{.      Bit
26900 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66  mask m;.      if
26910 28 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65  ( pProbe->isCove
26920 72 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  ring ){.        
26930 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
26940 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c  WHERE_IDX_ONLY |
26950 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a   WHERE_INDEXED;.
26960 20 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20          m = 0;. 
26970 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26980 20 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f      m = pSrc->co
26990 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73  lUsed & ~columns
269a0 49 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29 3b  InIndex(pProbe);
269b0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
269c0 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20  sFlags = (m==0) 
269d0 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  ? (WHERE_IDX_ONL
269e0 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  Y|WHERE_INDEXED)
269f0 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   : WHERE_INDEXED
26a00 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
26a10 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69   /* Full scan vi
26a20 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  a index */.     
26a30 20 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c   if( b.       ||
26a40 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
26a50 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d  .       || ( m==
26a60 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50  0.         && pP
26a70 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64  robe->bUnordered
26a80 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
26a90 28 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f  (pProbe->szIdxRo
26aa0 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  w<pTab->szTabRow
26ab0 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
26ac0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
26ad0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
26ae0 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20  S_DESIRED)==0.  
26af0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
26b00 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55  3GlobalConfig.bU
26b10 73 65 43 69 73 0a 20 20 20 20 20 20 20 20 20 26  seCis.         &
26b20 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
26b30 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50  abled(pWInfo->pP
26b40 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45  arse->db, SQLITE
26b50 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20  _CoverIdxScan). 
26b60 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20           ).     
26b70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
26b80 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f  ->iSortIdx = b ?
26b90 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20   iSortIdx : 0;. 
26ba0 20 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30 20         if( m==0 
26bb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
26bc0 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20  TUNING: Cost of 
26bd0 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
26be0 20 73 63 61 6e 20 69 73 20 4b 2a 28 4e 20 2b 20   scan is K*(N + 
26bf0 6c 6f 67 32 28 4e 29 29 2e 0a 20 20 20 20 20 20  log2(N))..      
26c00 20 20 20 20 2a 2a 20 20 2b 20 20 54 68 65 20 65      **  +  The e
26c10 78 74 72 61 20 66 61 63 74 6f 72 20 4b 20 6f 66  xtra factor K of
26c20 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64   between 1.1 and
26c30 20 33 2e 30 20 74 68 61 74 20 64 65 70 65 6e 64   3.0 that depend
26c40 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  s.          **  
26c50 20 20 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69     on the relati
26c60 76 65 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20  ve sizes of the 
26c70 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20 69 6e  table and the in
26c80 64 65 78 2e 20 20 4b 0a 20 20 20 20 20 20 20 20  dex.  K.        
26c90 20 20 2a 2a 20 20 20 20 20 69 73 20 73 6d 61 6c    **     is smal
26ca0 6c 65 72 20 66 6f 72 20 73 6d 61 6c 6c 65 72 20  ler for smaller 
26cb0 69 6e 64 69 63 65 73 2c 20 74 68 75 73 20 66 61  indices, thus fa
26cc0 76 6f 72 69 6e 67 20 74 68 65 6d 2e 0a 20 20 20  voring them..   
26cd0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
26ce0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
26cf0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
26d00 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69 7a 65  d(rSize,rLogSize
26d10 29 20 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20  ) + 1 +.        
26d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d30 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64  (15*pProbe->szId
26d40 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61  xRow)/pTab->szTa
26d50 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 65  bRow;.        }e
26d60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
26d70 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
26d80 66 20 73 63 61 6e 6e 69 6e 67 20 61 20 6e 6f 6e  f scanning a non
26d90 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20  -covering index 
26da0 69 73 20 28 4e 2b 31 29 2a 6c 6f 67 32 28 4e 29  is (N+1)*log2(N)
26db0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 68  .          ** wh
26dc0 69 63 68 20 77 65 20 77 69 6c 6c 20 73 69 6d 70  ich we will simp
26dd0 6c 69 66 79 20 74 6f 20 6a 75 73 74 20 4e 2a 6c  lify to just N*l
26de0 6f 67 32 28 4e 29 20 2a 2f 0a 20 20 20 20 20 20  og2(N) */.      
26df0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
26e00 20 72 53 69 7a 65 20 2b 20 72 4c 6f 67 53 69 7a   rSize + rLogSiz
26e10 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
26e20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75       whereLoopOu
26e30 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20  tputAdjust(pWC, 
26e40 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 72  pNew);.        r
26e50 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
26e60 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
26e70 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ew);.        pNe
26e80 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
26e90 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
26ea0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
26eb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
26ec0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
26ed0 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72  eeIndex(pBuilder
26ee0 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20  , pSrc, pProbe, 
26ef0 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0);.#ifdef SQLIT
26f00 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
26f10 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c 69  R_STAT4.    sqli
26f20 74 65 33 53 74 61 74 34 50 72 6f 62 65 46 72 65  te3Stat4ProbeFre
26f30 65 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63  e(pBuilder->pRec
26f40 29 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d  );.    pBuilder-
26f50 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a  >nRecValid = 0;.
26f60 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52      pBuilder->pR
26f70 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ec = 0;.#endif..
26f80 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
26f90 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42  was an INDEXED B
26fa0 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f  Y clause, then o
26fb0 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64  nly that one ind
26fc0 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ex is.    ** con
26fd0 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20  sidered. */.    
26fe0 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  if( pSrc->pIndex
26ff0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
27000 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
27010 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
27020 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
27030 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65  *.** Add all Whe
27040 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66  reLoop objects f
27050 6f 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68  or a table of th
27060 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65  e join identifie
27070 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72  d by.** pBuilder
27080 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54  ->pNew->iTab.  T
27090 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61  hat table is gua
270a0 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20  ranteed to be a 
270b0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
270c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
270d0 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
270e0 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
270f0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
27100 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
27110 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
27120 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61    Bitmask mExtra
27130 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
27140 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
27150 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c     /* WHERE anal
27160 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ysis context */.
27170 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
27180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27190 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
271a0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
271b0 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20  Clause *pWC;    
271c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
271d0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
271e0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
271f0 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a  item *pSrc;   /*
27200 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
27210 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   term to search 
27220 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
27230 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
27240 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
27250 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b  _info *pIdxInfo;
27260 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
27270 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
27280 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
27290 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
272a0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
272b0 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
272c0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
272d0 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  m;.  int i, j;. 
272e0 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54 65   int iTerm, mxTe
272f0 72 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74  rm;.  int nConst
27300 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65 65  raint;.  int see
27310 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nIn = 0;        
27320 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
27330 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   an IN operator 
27340 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74  is seen */.  int
27350 20 73 65 65 6e 56 61 72 20 3d 20 30 3b 20 20 20   seenVar = 0;   
27360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
27370 65 20 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74  e if a non-const
27380 61 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  ant constraint i
27390 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  s seen */.  int 
273a0 69 50 68 61 73 65 3b 20 20 20 20 20 20 20 20 20  iPhase;         
273b0 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 63           /* 0: c
273c0 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20  onst w/o IN, 1: 
273d0 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c  const, 2: no IN,
273e0 20 20 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65    2: IN */.  Whe
273f0 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20  reLoop *pNew;.  
27400 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
27410 4f 4b 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20  OK;..  pWInfo = 
27420 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
27430 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ;.  pParse = pWI
27440 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  nfo->pParse;.  d
27450 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
27460 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
27470 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20  ->pWC;.  pNew = 
27480 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
27490 20 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f    pSrc = &pWInfo
274a0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e  ->pTabList->a[pN
274b0 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54 61  ew->iTab];.  pTa
274c0 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  b = pSrc->pTab;.
274d0 20 20 61 73 73 65 72 74 28 20 49 73 56 69 72 74    assert( IsVirt
274e0 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 20 20 70  ual(pTab) );.  p
274f0 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61  IdxInfo = alloca
27500 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72  teIndexInfo(pPar
27510 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 70  se, pWC, pSrc, p
27520 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42  Builder->pOrderB
27530 79 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e  y);.  if( pIdxIn
27540 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  fo==0 ) return S
27550 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70  QLITE_NOMEM;.  p
27560 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b  New->prereq = 0;
27570 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20  .  pNew->rSetup 
27580 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46  = 0;.  pNew->wsF
27590 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52  lags = WHERE_VIR
275a0 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65  TUALTABLE;.  pNe
275b0 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20  w->nLTerm = 0;. 
275c0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
275d0 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 70 55  edFree = 0;.  pU
275e0 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  sage = pIdxInfo-
275f0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
27600 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74  e;.  nConstraint
27610 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   = pIdxInfo->nCo
27620 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28 20  nstraint;.  if( 
27630 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
27640 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74  db, pNew, nConst
27650 72 61 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71  raint) ){.    sq
27660 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
27670 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 72  pIdxInfo);.    r
27680 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
27690 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69  EM;.  }..  for(i
276a0 50 68 61 73 65 3d 30 3b 20 69 50 68 61 73 65 3c  Phase=0; iPhase<
276b0 3d 33 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a 20  =3; iPhase++){. 
276c0 20 20 20 69 66 28 20 21 73 65 65 6e 49 6e 20 26     if( !seenIn &
276d0 26 20 28 69 50 68 61 73 65 26 31 29 21 3d 30 20  & (iPhase&1)!=0 
276e0 29 7b 0a 20 20 20 20 20 20 69 50 68 61 73 65 2b  ){.      iPhase+
276f0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 68  +;.      if( iPh
27700 61 73 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a 20  ase>3 ) break;. 
27710 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65     }.    if( !se
27720 65 6e 56 61 72 20 26 26 20 69 50 68 61 73 65 3e  enVar && iPhase>
27730 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  1 ) break;.    p
27740 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
27750 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
27760 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
27770 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
27780 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  aint;.    for(i=
27790 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; i<pIdxInfo->n
277a0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
277b0 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20   pIdxCons++){.  
277c0 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73      j = pIdxCons
277d0 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20  ->iTermOffset;. 
277e0 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
277f0 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 73  C->a[j];.      s
27800 77 69 74 63 68 28 20 69 50 68 61 73 65 20 29 7b  witch( iPhase ){
27810 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 30 3a  .        case 0:
27820 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73      /* Constants
27830 20 77 69 74 68 6f 75 74 20 49 4e 20 6f 70 65 72   without IN oper
27840 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  ator */.        
27850 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
27860 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  le = 0;.        
27870 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
27880 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
27890 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
278a0 20 20 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a 20     seenIn = 1;. 
278b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
278c0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
278d0 70 72 65 72 65 71 52 69 67 68 74 21 3d 30 20 29  prereqRight!=0 )
278e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
278f0 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20 20  enVar = 1;.     
27900 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
27910 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
27920 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a   & WO_IN)==0 ){.
27930 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
27940 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31  Cons->usable = 1
27950 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
27960 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
27970 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 20         case 1:  
27980 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77    /* Constants w
27990 69 74 68 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  ith IN operators
279a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
279b0 73 65 72 74 28 20 73 65 65 6e 49 6e 20 29 3b 0a  sert( seenIn );.
279c0 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
279d0 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54  ns->usable = (pT
279e0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
279f0 3d 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ==0);.          
27a00 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
27a10 61 73 65 20 32 3a 20 20 20 20 2f 2a 20 56 61 72  ase 2:    /* Var
27a20 69 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49  iables without I
27a30 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  N */.          a
27a40 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 29  ssert( seenVar )
27a50 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  ;.          pIdx
27a60 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28  Cons->usable = (
27a70 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
27a80 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20   & WO_IN)==0;.  
27a90 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
27aa0 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
27ab0 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77    /* Variables w
27ac0 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20  ith IN */.      
27ad0 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e      assert( seen
27ae0 56 61 72 20 26 26 20 73 65 65 6e 49 6e 20 29 3b  Var && seenIn );
27af0 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43  .          pIdxC
27b00 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b  ons->usable = 1;
27b10 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
27b20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27b30 20 20 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67      memset(pUsag
27b40 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73  e, 0, sizeof(pUs
27b50 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f  age[0])*pIdxInfo
27b60 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  ->nConstraint);.
27b70 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f      if( pIdxInfo
27b80 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
27b90 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  tr ) sqlite3_fre
27ba0 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  e(pIdxInfo->idxS
27bb0 74 72 29 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  tr);.    pIdxInf
27bc0 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20  o->idxStr = 0;. 
27bd0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
27be0 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Num = 0;.    pId
27bf0 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
27c00 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  eIdxStr = 0;.   
27c10 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
27c20 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a  ByConsumed = 0;.
27c30 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73      pIdxInfo->es
27c40 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51  timatedCost = SQ
27c50 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28  LITE_BIG_DBL / (
27c60 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20 70 49  double)2;.    pI
27c70 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
27c80 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20 20 20  dRows = 25;.    
27c90 72 63 20 3d 20 76 74 61 62 42 65 73 74 49 6e 64  rc = vtabBestInd
27ca0 65 78 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ex(pParse, pTab,
27cb0 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20   pIdxInfo);.    
27cc0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68  if( rc ) goto wh
27cd0 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65  ereLoopAddVtab_e
27ce0 78 69 74 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  xit;.    pIdxCon
27cf0 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c  s = *(struct sql
27d00 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
27d10 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
27d20 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->aConstraint;.
27d30 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
27d40 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 6d   = mExtra;.    m
27d50 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 20 20  xTerm = -1;.    
27d60 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c  assert( pNew->nL
27d70 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e  Slot>=nConstrain
27d80 74 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t );.    for(i=0
27d90 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
27da0 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65   i++) pNew->aLTe
27db0 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 70  rm[i] = 0;.    p
27dc0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  New->u.vtab.omit
27dd0 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 66 6f  Mask = 0;.    fo
27de0 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72  r(i=0; i<nConstr
27df0 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43  aint; i++, pIdxC
27e00 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ons++){.      if
27e10 28 20 28 69 54 65 72 6d 20 3d 20 70 55 73 61 67  ( (iTerm = pUsag
27e20 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d  e[i].argvIndex -
27e30 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20   1)>=0 ){.      
27e40 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e    j = pIdxCons->
27e50 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
27e60 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d       if( iTerm>=
27e70 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20  nConstraint.    
27e80 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20       || j<0.    
27e90 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e       || j>=pWC->
27ea0 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 7c  nTerm.         |
27eb0 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69  | pNew->aLTerm[i
27ec0 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20  Term]!=0.       
27ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
27ee0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
27ef0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
27f00 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
27f10 65 2c 20 22 25 73 2e 78 42 65 73 74 49 6e 64 65  e, "%s.xBestInde
27f20 78 28 29 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22  x() malfunction"
27f30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
27f40 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77            goto w
27f50 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f  hereLoopAddVtab_
27f60 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  exit;.        }.
27f70 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
27f80 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72  ( iTerm==nConstr
27f90 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20 20  aint-1 );.      
27fa0 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30    testcase( j==0
27fb0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
27fc0 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54  case( j==pWC->nT
27fd0 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  erm-1 );.       
27fe0 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
27ff0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  [j];.        pNe
28000 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65  w->prereq |= pTe
28010 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  rm->prereqRight;
28020 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
28030 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53   iTerm<pNew->nLS
28040 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  lot );.        p
28050 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72  New->aLTerm[iTer
28060 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  m] = pTerm;.    
28070 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d 78      if( iTerm>mx
28080 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20  Term ) mxTerm = 
28090 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 74  iTerm;.        t
280a0 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
280b0 31 35 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  15 );.        te
280c0 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31  stcase( iTerm==1
280d0 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  6 );.        if(
280e0 20 69 54 65 72 6d 3c 31 36 20 26 26 20 70 55 73   iTerm<16 && pUs
280f0 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70 4e  age[i].omit ) pN
28100 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d  ew->u.vtab.omitM
28110 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b  ask |= 1<<iTerm;
28120 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
28130 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
28140 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20   WO_IN)!=0 ){.  
28150 20 20 20 20 20 20 20 20 69 66 28 20 70 55 73 61          if( pUsa
28160 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b  ge[i].omit==0 ){
28170 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
28180 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  Do not attempt t
28190 6f 20 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e 73  o use an IN cons
281a0 74 72 61 69 6e 74 20 69 66 20 74 68 65 20 76 69  traint if the vi
281b0 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20  rtual table.    
281c0 20 20 20 20 20 20 20 20 2a 2a 20 73 61 79 73 20          ** says 
281d0 74 68 61 74 20 74 68 65 20 65 71 75 69 76 61 6c  that the equival
281e0 65 6e 74 20 45 51 20 63 6f 6e 73 74 72 61 69 6e  ent EQ constrain
281f0 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 66 65  t cannot be safe
28200 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20  ly omitted..    
28210 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65          ** If we
28220 20 64 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 75   do attempt to u
28230 73 65 20 73 75 63 68 20 61 20 63 6f 6e 73 74 72  se such a constr
28240 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73 20  aint, some rows 
28250 6d 69 67 68 74 20 62 65 0a 20 20 20 20 20 20 20  might be.       
28260 20 20 20 20 20 2a 2a 20 72 65 70 65 61 74 65 64       ** repeated
28270 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 20   in the output. 
28280 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  */.            b
28290 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
282a0 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  }.          /* A
282b0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
282c0 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  hat is constrain
282d0 65 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75  ed by an IN clau
282e0 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20  se may not.     
282f0 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20       ** consume 
28300 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
28310 75 73 65 20 62 65 63 61 75 73 65 20 28 31 29 20  use because (1) 
28320 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20  the order of IN 
28330 74 65 72 6d 73 0a 20 20 20 20 20 20 20 20 20 20  terms.          
28340 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ** is not necess
28350 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f  arily related to
28360 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75   the order of ou
28370 74 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20  tput terms and. 
28380 20 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20           ** (2) 
28390 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73  Multiple outputs
283a0 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49   from a single I
283b0 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74  N value will not
283c0 20 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20 20   merge.         
283d0 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20 20 2a   ** together.  *
283e0 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  /.          pIdx
283f0 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
28400 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  sumed = 0;.     
28410 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
28420 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 43   }.    if( i>=nC
28430 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20  onstraint ){.   
28440 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
28450 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 20 20  = mxTerm+1;.    
28460 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
28470 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c  nLTerm<=pNew->nL
28480 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70 4e  Slot );.      pN
28490 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75  ew->u.vtab.idxNu
284a0 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  m = pIdxInfo->id
284b0 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77  xNum;.      pNew
284c0 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
284d0 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  e = pIdxInfo->ne
284e0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3b 0a  edToFreeIdxStr;.
284f0 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
28500 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
28510 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
28520 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
28530 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  = pIdxInfo->idxS
28540 74 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  tr;.      pNew->
28550 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64  u.vtab.isOrdered
28560 20 3d 20 28 75 38 29 28 28 70 49 64 78 49 6e 66   = (u8)((pIdxInf
28570 6f 2d 3e 6e 4f 72 64 65 72 42 79 21 3d 30 29 0a  o->nOrderBy!=0).
28580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285a0 20 20 20 20 20 26 26 20 70 49 64 78 49 6e 66 6f       && pIdxInfo
285b0 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
285c0 64 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  d);.      pNew->
285d0 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20  rSetup = 0;.    
285e0 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
285f0 71 6c 69 74 65 33 4c 6f 67 45 73 74 46 72 6f 6d  qlite3LogEstFrom
28600 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d  Double(pIdxInfo-
28610 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b  >estimatedCost);
28620 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
28630 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
28640 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69  t(pIdxInfo->esti
28650 6d 61 74 65 64 52 6f 77 73 29 3b 0a 20 20 20 20  matedRows);.    
28660 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72    whereLoopInser
28670 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
28680 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
28690 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
286a0 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ee ){.        sq
286b0 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d  lite3_free(pNew-
286c0 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b  >u.vtab.idxStr);
286d0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
286e0 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
286f0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
28700 7d 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65 4c 6f  }.  }  ..whereLo
28710 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3a 0a  opAddVtab_exit:.
28720 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
28730 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
28740 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
28750 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
28760 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
28770 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29  ee(db, pIdxInfo)
28780 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
28790 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
287a0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
287b0 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64  BLE */../*.** Ad
287c0 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  d WhereLoop entr
287d0 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52  ies to handle OR
287e0 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f   terms.  This wo
287f0 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a  rks for either.*
28800 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69 72 74  * btrees or virt
28810 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73  ual tables..*/.s
28820 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
28830 6f 6f 70 41 64 64 4f 72 28 57 68 65 72 65 4c 6f  oopAddOr(WhereLo
28840 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
28850 64 65 72 2c 20 42 69 74 6d 61 73 6b 20 6d 45 78  der, Bitmask mEx
28860 74 72 61 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  tra){.  WhereInf
28870 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
28880 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
28890 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
288a0 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
288b0 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  New;.  WhereTerm
288c0 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64   *pTerm, *pWCEnd
288d0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
288e0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43  ITE_OK;.  int iC
288f0 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  ur;.  WhereClaus
28900 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72  e tempWC;.  Wher
28910 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75  eLoopBuilder sSu
28920 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f  bBuild;.  WhereO
28930 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75 72 2c  rSet sSum, sCur,
28940 20 73 50 72 65 76 3b 0a 20 20 73 74 72 75 63 74   sPrev;.  struct
28950 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
28960 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d  Item;.  .  pWC =
28970 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
28980 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
28990 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
289a0 5f 41 4e 44 5f 4f 4e 4c 59 20 29 20 72 65 74 75  _AND_ONLY ) retu
289b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
289c0 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20  pWCEnd = pWC->a 
289d0 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20  + pWC->nTerm;.  
289e0 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
289f0 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28  >pNew;.  memset(
28a00 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &sSum, 0, sizeof
28a10 28 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d  (sSum));.  pItem
28a20 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
28a30 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69  ist->a + pNew->i
28a40 54 61 62 3b 0a 20 20 69 66 28 20 21 48 61 73 52  Tab;.  if( !HasR
28a50 6f 77 69 64 28 70 49 74 65 6d 2d 3e 70 54 61 62  owid(pItem->pTab
28a60 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
28a70 45 5f 4f 4b 3b 0a 20 20 69 43 75 72 20 3d 20 70  E_OK;.  iCur = p
28a80 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a  Item->iCursor;..
28a90 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
28aa0 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
28ab0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
28ac0 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  K; pTerm++){.   
28ad0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
28ae0 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21  erator & WO_OR)!
28af0 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72  =0.     && (pTer
28b00 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  m->u.pOrInfo->in
28b10 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e  dexable & pNew->
28b20 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20  maskSelf)!=0 .  
28b30 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65    ){.      Where
28b40 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70  Clause * const p
28b50 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75  OrWC = &pTerm->u
28b60 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  .pOrInfo->wc;.  
28b70 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20      WhereTerm * 
28b80 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d  const pOrWCEnd =
28b90 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43   &pOrWC->a[pOrWC
28ba0 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  ->nTerm];.      
28bb0 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
28bc0 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e  rm;.      int on
28bd0 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e  ce = 1;.      in
28be0 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20  t i, j;.    .   
28bf0 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a     sSubBuild = *
28c00 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20  pBuilder;.      
28c10 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72  sSubBuild.pOrder
28c20 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53  By = 0;.      sS
28c30 75 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d  ubBuild.pOrSet =
28c40 20 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 66   &sCur;..      f
28c50 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43  or(pOrTerm=pOrWC
28c60 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72  ->a; pOrTerm<pOr
28c70 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b  WCEnd; pOrTerm++
28c80 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
28c90 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
28ca0 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20  or & WO_AND)!=0 
28cb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  ){.          sSu
28cc0 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f  bBuild.pWC = &pO
28cd0 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66  rTerm->u.pAndInf
28ce0 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d  o->wc;.        }
28cf0 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d  else if( pOrTerm
28d00 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
28d10 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ur ){.          
28d20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20  tempWC.pWInfo = 
28d30 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20  pWC->pWInfo;.   
28d40 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f         tempWC.pO
28d50 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20  uter = pWC;.    
28d60 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20        tempWC.op 
28d70 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20  = TK_AND;.      
28d80 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d      tempWC.nTerm
28d90 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
28da0 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65  tempWC.a = pOrTe
28db0 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53  rm;.          sS
28dc0 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74  ubBuild.pWC = &t
28dd0 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d  empWC;.        }
28de0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
28df0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
28e00 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72    }.        sCur
28e10 2e 6e 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  .n = 0;.#ifndef 
28e20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
28e30 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20  UALTABLE.       
28e40 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
28e50 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20  Item->pTab) ){. 
28e60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
28e70 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
28e80 6c 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45  l(&sSubBuild, mE
28e90 78 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d  xtra);.        }
28ea0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
28eb0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
28ec0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
28ed0 64 42 74 72 65 65 28 26 73 53 75 62 42 75 69 6c  dBtree(&sSubBuil
28ee0 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20  d, mExtra);.    
28ef0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
28f00 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
28f10 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30  _OK || sCur.n==0
28f20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
28f30 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  sCur.n==0 ){.   
28f40 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20         sSum.n = 
28f50 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
28f60 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
28f70 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20  e if( once ){.  
28f80 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d          whereOrM
28f90 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72  ove(&sSum, &sCur
28fa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63  );.          onc
28fb0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
28fc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
28fd0 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 50 72  whereOrMove(&sPr
28fe0 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20 20  ev, &sSum);.    
28ff0 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30        sSum.n = 0
29000 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
29010 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20  i=0; i<sPrev.n; 
29020 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
29030 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75    for(j=0; j<sCu
29040 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  r.n; j++){.     
29050 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72           whereOr
29060 49 6e 73 65 72 74 28 26 73 53 75 6d 2c 20 73 50  Insert(&sSum, sP
29070 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20  rev.a[i].prereq 
29080 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72  | sCur.a[j].prer
29090 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eq,.            
290a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290b0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
290c0 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e  (sPrev.a[i].rRun
290d0 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e  , sCur.a[j].rRun
290e0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
290f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
29100 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
29110 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c  sPrev.a[i].nOut,
29120 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29   sCur.a[j].nOut)
29130 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
29140 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
29150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
29160 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72       pNew->nLTer
29170 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65  m = 1;.      pNe
29180 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70  w->aLTerm[0] = p
29190 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77  Term;.      pNew
291a0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
291b0 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20  E_MULTI_OR;.    
291c0 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
291d0 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   0;.      pNew->
291e0 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20  iSortIdx = 0;.  
291f0 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77      memset(&pNew
29200 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ->u, 0, sizeof(p
29210 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20  New->u));.      
29220 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
29230 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d  ITE_OK && i<sSum
29240 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; i++){.      
29250 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 75 6c    /* TUNING: Mul
29260 74 69 70 6c 65 20 62 79 20 33 2e 35 20 66 6f 72  tiple by 3.5 for
29270 20 74 68 65 20 73 65 63 6f 6e 64 61 72 79 20 74   the secondary t
29280 61 62 6c 65 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20  able lookup */. 
29290 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
292a0 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52  n = sSum.a[i].rR
292b0 75 6e 20 2b 20 31 38 3b 0a 20 20 20 20 20 20 20  un + 18;.       
292c0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53   pNew->nOut = sS
292d0 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20  um.a[i].nOut;.  
292e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
292f0 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70  eq = sSum.a[i].p
29300 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72  rereq;.        r
29310 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
29320 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
29330 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
29340 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
29350 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
29360 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
29370 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74  bjects for all t
29380 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63  ables .*/.static
29390 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
293a0 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75  dAll(WhereLoopBu
293b0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29  ilder *pBuilder)
293c0 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
293d0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
293e0 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d  ->pWInfo;.  Bitm
293f0 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a  ask mExtra = 0;.
29400 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72    Bitmask mPrior
29410 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62   = 0;.  int iTab
29420 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
29430 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
29440 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
29450 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
29460 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
29470 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
29480 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
29490 74 20 6e 54 61 62 4c 69 73 74 20 3d 20 70 57 49  t nTabList = pWI
294a0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69  nfo->nLevel;.  i
294b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
294c0 4b 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69  K;.  u8 priorJoi
294d0 6e 54 79 70 65 20 3d 20 30 3b 0a 20 20 57 68 65  nType = 0;.  Whe
294e0 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20  reLoop *pNew;.. 
294f0 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68   /* Loop over th
29500 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
29510 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20  join, from left 
29520 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e  to right */.  pN
29530 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
29540 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  New;.  whereLoop
29550 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f  Init(pNew);.  fo
29560 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d  r(iTab=0, pItem=
29570 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 54 61  pTabList->a; iTa
29580 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54 61 62  b<nTabList; iTab
29590 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
295a0 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69    pNew->iTab = i
295b0 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d  Tab;.    pNew->m
295c0 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73  askSelf = getMas
295d0 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
295e0 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Set, pItem->iCur
295f0 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28  sor);.    if( ((
29600 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c  pItem->jointype|
29610 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 29 20 26  priorJoinType) &
29620 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
29630 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  SS))!=0 ){.     
29640 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72   mExtra = mPrior
29650 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f  ;.    }.    prio
29660 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70 49 74 65  rJoinType = pIte
29670 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  m->jointype;.   
29680 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
29690 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20  Item->pTab) ){. 
296a0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
296b0 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70 42  oopAddVirtual(pB
296c0 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b  uilder, mExtra);
296d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
296e0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
296f0 41 64 64 42 74 72 65 65 28 70 42 75 69 6c 64 65  AddBtree(pBuilde
29700 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20  r, mExtra);.    
29710 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
29720 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29730 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
29740 64 64 4f 72 28 70 42 75 69 6c 64 65 72 2c 20 6d  ddOr(pBuilder, m
29750 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20  Extra);.    }.  
29760 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77    mPrior |= pNew
29770 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
29780 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61  if( rc || db->ma
29790 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65  llocFailed ) bre
297a0 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c  ak;.  }.  whereL
297b0 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65  oopClear(db, pNe
297c0 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  w);.  return rc;
297d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e  .}../*.** Examin
297e0 65 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77  e a WherePath (w
297f0 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
29800 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68   of the extra Wh
29810 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35  ereLoop of the 5
29820 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  th.** parameters
29830 29 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f  ) to see if it o
29840 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74  utputs rows in t
29850 68 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44  he requested ORD
29860 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f  ER BY.** (or GRO
29870 55 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72  UP BY) without r
29880 65 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72  equiring a separ
29890 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69  ate sort operati
298a0 6f 6e 2e 20 20 52 65 74 75 72 6e 3a 0a 2a 2a 20  on.  Return:.** 
298b0 0a 2a 2a 20 20 20 20 30 3a 20 20 4f 52 44 45 52  .**    0:  ORDER
298c0 20 42 59 20 69 73 20 6e 6f 74 20 73 61 74 69 73   BY is not satis
298d0 66 69 65 64 2e 20 20 53 6f 72 74 69 6e 67 20 72  fied.  Sorting r
298e0 65 71 75 69 72 65 64 0a 2a 2a 20 20 20 20 31 3a  equired.**    1:
298f0 20 20 4f 52 44 45 52 20 42 59 20 69 73 20 73 61    ORDER BY is sa
29900 74 69 73 66 69 65 64 2e 20 20 20 20 20 20 4f 6d  tisfied.      Om
29910 69 74 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 20 20  it sorting.**   
29920 2d 31 3a 20 20 55 6e 6b 6e 6f 77 6e 20 61 74 20  -1:  Unknown at 
29930 74 68 69 73 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20  this time.**.** 
29940 4e 6f 74 65 20 74 68 61 74 20 70 72 6f 63 65 73  Note that proces
29950 73 69 6e 67 20 66 6f 72 20 57 48 45 52 45 5f 47  sing for WHERE_G
29960 52 4f 55 50 42 59 20 61 6e 64 20 57 48 45 52 45  ROUPBY and WHERE
29970 5f 44 49 53 54 49 4e 43 54 42 59 20 69 73 20 6e  _DISTINCTBY is n
29980 6f 74 20 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e  ot as.** strict.
29990 20 20 57 69 74 68 20 47 52 4f 55 50 20 42 59 20    With GROUP BY 
299a0 61 6e 64 20 44 49 53 54 49 4e 43 54 20 74 68 65  and DISTINCT the
299b0 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d 65 6e   only requiremen
299c0 74 20 69 73 20 74 68 61 74 0a 2a 2a 20 65 71 75  t is that.** equ
299d0 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 70 70  ivalent rows app
299e0 65 61 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ear immediately 
299f0 61 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20  adjacent to one 
29a00 61 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55 50 20  another.  GROUP 
29a10 42 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e  BY.** and DISTIN
29a20 54 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65  T do not require
29a30 20 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20   rows to appear 
29a40 69 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  in any particula
29a50 72 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a  r order as long.
29a60 2a 2a 20 61 73 20 65 71 75 69 76 65 6c 65 6e 74  ** as equivelent
29a70 20 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65   rows are groupe
29a80 64 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75  d together.  Thu
29a90 73 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61  s for GROUP BY a
29aa0 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74  nd DISTINCT.** t
29ab0 68 65 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d  he pOrderBy term
29ac0 73 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64  s can be matched
29ad0 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20   in any order.  
29ae0 57 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74  With ORDER BY, t
29af0 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20  he .** pOrderBy 
29b00 74 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61  terms must be ma
29b10 74 63 68 65 64 20 69 6e 20 73 74 72 69 63 74 20  tched in strict 
29b20 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72  left-to-right or
29b30 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
29b40 6e 74 20 77 68 65 72 65 50 61 74 68 53 61 74 69  nt wherePathSati
29b50 73 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20  sfiesOrderBy(.  
29b60 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
29b70 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  o,    /* The WHE
29b80 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
29b90 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
29ba0 79 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59  y,   /* ORDER BY
29bb0 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20   or GROUP BY or 
29bc0 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20  DISTINCT clause 
29bd0 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68  to check */.  Wh
29be0 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20  erePath *pPath, 
29bf0 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
29c00 50 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f  Path to check */
29c10 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
29c20 73 2c 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68  s,       /* Migh
29c30 74 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 5f  t contain WHERE_
29c40 47 52 4f 55 50 42 59 20 6f 72 20 57 48 45 52 45  GROUPBY or WHERE
29c50 5f 44 49 53 54 49 4e 43 54 42 59 20 2a 2f 0a 20  _DISTINCTBY */. 
29c60 20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20   u16 nLoop,     
29c70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
29c80 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70   of entries in p
29c90 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f  Path->aLoop[] */
29ca0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
29cb0 61 73 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20  ast,     /* Add 
29cc0 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74  this WhereLoop t
29cd0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61  o the end of pPa
29ce0 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20  th->aLoop[] */. 
29cf0 20 42 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61   Bitmask *pRevMa
29d00 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d  sk     /* OUT: M
29d10 61 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ask of WhereLoop
29d20 73 20 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65  s to run in reve
29d30 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a  rse order */.){.
29d40 20 20 75 38 20 72 65 76 53 65 74 3b 20 20 20 20    u8 revSet;    
29d50 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
29d60 69 66 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20  if rev is known 
29d70 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20  */.  u8 rev;    
29d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
29d90 6d 70 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64  mposite sort ord
29da0 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64  er */.  u8 revId
29db0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x;            /*
29dc0 20 49 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65   Index sort orde
29dd0 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65  r */.  u8 isOrde
29de0 72 44 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20  rDistinct;   /* 
29df0 41 6c 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c  All prior WhereL
29e00 6f 6f 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64  oops are order-d
29e10 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20  istinct */.  u8 
29e20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b  distinctColumns;
29e30 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
29e40 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55  e loop has UNIQU
29e50 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d  E NOT NULL colum
29e60 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74  ns */.  u8 isMat
29e70 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ch;           /*
29e80 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73   iColumn matches
29e90 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f   a term of the O
29ea0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
29eb0 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b  /.  u16 nKeyCol;
29ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
29ed0 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d  ber of key colum
29ee0 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a  ns in pIndex */.
29ef0 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20    u16 nColumn;  
29f00 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
29f10 20 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64 65 72   number of order
29f20 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ed columns in th
29f30 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36  e index */.  u16
29f40 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20   nOrderBy;      
29f50 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72     /* Number ter
29f60 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
29f70 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
29f80 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt iLoop;       
29f90 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
29fa0 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50   WhereLoop in pP
29fb0 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73  ath being proces
29fc0 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  sed */.  int i, 
29fd0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
29fe0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
29ff0 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20  */.  int iCur;  
2a000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2a010 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
2a020 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f  current WhereLoo
2a030 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  p */.  int iColu
2a040 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn;          /* 
2a050 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  A column number 
2a060 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75  within table iCu
2a070 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  r */.  WhereLoop
2a080 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20   *pLoop = 0; /* 
2a090 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f  Current WhereLoo
2a0a0 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  p being processe
2a0b0 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  d. */.  WhereTer
2a0c0 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a  m *pTerm;     /*
2a0d0 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
2a0e0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2a0f0 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  se */.  Expr *pO
2a100 42 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  BExpr;        /*
2a110 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66   An expression f
2a120 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59  rom the ORDER BY
2a130 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c   clause */.  Col
2a140 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
2a150 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75     /* COLLATE fu
2a160 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f  nction from an O
2a170 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
2a180 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  erm */.  Index *
2a190 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f  pIndex;        /
2a1a0 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f  * The index asso
2a1b0 63 69 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f  ciated with pLoo
2a1c0 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  p */.  sqlite3 *
2a1d0 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
2a1e0 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
2a1f0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2a200 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62   */.  Bitmask ob
2a210 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d  Sat = 0;    /* M
2a220 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ask of ORDER BY 
2a230 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20  terms satisfied 
2a240 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d  so far */.  Bitm
2a250 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20  ask obDone;     
2a260 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c    /* Mask of all
2a270 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
2a280 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64  */.  Bitmask ord
2a290 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20  erDistinctMask; 
2a2a0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
2a2b0 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f  well-ordered loo
2a2c0 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ps */.  Bitmask 
2a2d0 72 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  ready;          
2a2e0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69      /* Mask of i
2a2f0 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20  nner loops */.. 
2a300 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20   /*.  ** We say 
2a310 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  the WhereLoop is
2a320 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74   "one-row" if it
2a330 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f   generates no mo
2a340 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a  re than one.  **
2a350 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20   row of output. 
2a360 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20   A WhereLoop is 
2a370 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f  one-row if all o
2a380 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2a390 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20  are true:.  **  
2a3a0 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f  (a) All index co
2a3b0 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68  lumns match with
2a3c0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
2a3d0 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20  ..  **  (b) The 
2a3e0 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a  index is unique.
2a3f0 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f    ** Any WhereLo
2a400 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45 52 45  op with an WHERE
2a410 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74  _COLUMN_EQ const
2a420 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77  raint on the row
2a430 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20  id is one-row.. 
2a440 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f   ** Every one-ro
2a450 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c  w WhereLoop will
2a460 20 68 61 76 65 20 74 68 65 20 57 48 45 52 45 5f   have the WHERE_
2a470 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20 69  ONEROW bit set i
2a480 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a  n wsFlags..  **.
2a490 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20    ** We say the 
2a4a0 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72  WhereLoop is "or
2a4b0 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66  der-distinct" if
2a4c0 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75   the set of colu
2a4d0 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  mns from.  ** th
2a4e0 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61  at WhereLoop tha
2a4f0 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44  t are in the ORD
2a500 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
2a510 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
2a520 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66  very.  ** row of
2a530 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20   the WhereLoop. 
2a540 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57   Every one-row W
2a550 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f  hereLoop is auto
2a560 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f  matically.  ** o
2a570 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20  rder-distinct.  
2a580 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61   A WhereLoop tha
2a590 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73  t has no columns
2a5a0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
2a5b0 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20   clause.  ** is 
2a5c0 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  not order-distin
2a5d0 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d  ct. To be order-
2a5e0 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20  distinct is not 
2a5f0 71 75 69 74 65 20 74 68 65 20 73 61 6d 65 20 61  quite the same a
2a600 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49  s being.  ** UNI
2a610 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51  QUE since a UNIQ
2a620 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64  UE column or ind
2a630 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74  ex can have mult
2a640 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a  iple rows that .
2a650 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e    ** are NULL an
2a660 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  d NULL values ar
2a670 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72  e equivalent for
2a680 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   the purpose of 
2a690 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a  order-distinct..
2a6a0 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72    ** To be order
2a6b0 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63  -distinct, the c
2a6c0 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55  olumns must be U
2a6d0 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55  NIQUE and NOT NU
2a6e0 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  LL..  **.  ** Th
2a6f0 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61  e rowid for a ta
2a700 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e  ble is always UN
2a710 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c  IQUE and NOT NUL
2a720 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68  L so whenever th
2a730 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70  e.  ** rowid app
2a740 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45  ears in the ORDE
2a750 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
2a760 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57   corresponding W
2a770 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a  hereLoop is.  **
2a780 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f   automatically o
2a790 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20  rder-distinct.. 
2a7a0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
2a7b0 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 0a 20  OrderBy!=0 );.. 
2a7c0 20 2f 2a 20 53 6f 72 74 61 62 69 6c 69 74 79 20   /* Sortability 
2a7d0 6f 66 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  of virtual table
2a7e0 73 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  s is determined 
2a7f0 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  by the xBestInde
2a800 78 20 6d 65 74 68 6f 64 0a 20 20 2a 2a 20 6f 66  x method.  ** of
2a810 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
2a820 6c 65 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20 69  le itself */.  i
2a830 66 28 20 70 4c 61 73 74 2d 3e 77 73 46 6c 61 67  f( pLast->wsFlag
2a840 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
2a850 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 74 65  LTABLE ){.    te
2a860 73 74 63 61 73 65 28 20 6e 4c 6f 6f 70 3e 30 20  stcase( nLoop>0 
2a870 29 3b 20 20 2f 2a 20 54 72 75 65 20 77 68 65 6e  );  /* True when
2a880 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 61 72 65   outer loops are
2a890 20 6f 6e 65 2d 72 6f 77 20 61 6e 64 20 6d 61 74   one-row and mat
2a8a0 63 68 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ch .            
2a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
2a8c0 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 74 65 72   no ORDER BY ter
2a8d0 6d 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ms */.    return
2a8e0 20 70 4c 61 73 74 2d 3e 75 2e 76 74 61 62 2e 69   pLast->u.vtab.i
2a8f0 73 4f 72 64 65 72 65 64 3b 0a 20 20 7d 0a 20 20  sOrdered;.  }.  
2a900 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74  if( nLoop && Opt
2a910 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
2a920 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64  d(db, SQLITE_Ord
2a930 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72  erByIdxJoin) ) r
2a940 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64  eturn 0;..  nOrd
2a950 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  erBy = pOrderBy-
2a960 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61  >nExpr;.  testca
2a970 73 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d  se( nOrderBy==BM
2a980 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72  S-1 );.  if( nOr
2a990 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65  derBy>BMS-1 ) re
2a9a0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e  turn 0;  /* Cann
2a9b0 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72  ot optimize over
2a9c0 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42  ly large ORDER B
2a9d0 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44  Ys */.  isOrderD
2a9e0 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f  istinct = 1;.  o
2a9f0 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28  bDone = MASKBIT(
2aa00 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f  nOrderBy)-1;.  o
2aa10 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
2aa20 20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20   = 0;.  ready = 
2aa30 30 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  0;.  for(iLoop=0
2aa40 3b 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ; isOrderDistinc
2aa50 74 20 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e  t && obSat<obDon
2aa60 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f  e && iLoop<=nLoo
2aa70 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
2aa80 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72   if( iLoop>0 ) r
2aa90 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d  eady |= pLoop->m
2aaa0 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4c 6f  askSelf;.    pLo
2aab0 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70  op = iLoop<nLoop
2aac0 20 3f 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b   ? pPath->aLoop[
2aad0 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73 74 3b 0a  iLoop] : pLast;.
2aae0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f      assert( (pLo
2aaf0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2ab00 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
2ab10 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 43 75 72  )==0 );.    iCur
2ab20 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
2ab30 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54  ist->a[pLoop->iT
2ab40 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20  ab].iCursor;..  
2ab50 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e    /* Mark off an
2ab60 79 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  y ORDER BY term 
2ab70 58 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75  X that is a colu
2ab80 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  mn in the table 
2ab90 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  of.    ** the cu
2aba0 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77  rrent loop for w
2abb0 68 69 63 68 20 74 68 65 72 65 20 69 73 20 74 65  hich there is te
2abc0 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a  rm in the WHERE.
2abd0 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66      ** clause of
2abe0 20 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20 4e   the form X IS N
2abf0 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74 20  ULL or X=? that 
2ac00 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
2ac10 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70  uter.    ** loop
2ac20 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
2ac30 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
2ac40 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  y; i++){.      i
2ac50 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
2ac60 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
2ac70 3b 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72 20  ;.      pOBExpr 
2ac80 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
2ac90 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42  pCollate(pOrderB
2aca0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
2acb0 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
2acc0 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
2acd0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2ace0 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
2acf0 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63  iTable!=iCur ) c
2ad00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
2ad10 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
2ad20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43  &pWInfo->sWC, iC
2ad30 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  ur, pOBExpr->iCo
2ad40 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  lumn,.          
2ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 72 65               ~re
2ad60 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53  ady, WO_EQ|WO_IS
2ad70 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 20 20  NULL, 0);.      
2ad80 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63  if( pTerm==0 ) c
2ad90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
2ada0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
2adb0 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 26  ator&WO_EQ)!=0 &
2adc0 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75  & pOBExpr->iColu
2add0 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mn>=0 ){.       
2ade0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c   const char *z1,
2adf0 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43   *z2;.        pC
2ae00 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2ae10 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d  rCollSeq(pWInfo-
2ae20 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  >pParse, pOrderB
2ae30 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
2ae40 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
2ae50 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
2ae60 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
2ae70 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e      z1 = pColl->
2ae80 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70  zName;.        p
2ae90 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
2aea0 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
2aeb0 2d 3e 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d  ->pParse, pTerm-
2aec0 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >pExpr);.       
2aed0 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
2aee0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
2aef0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20  oll;.        z2 
2af00 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a  = pColl->zName;.
2af10 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2af20 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a  te3StrICmp(z1, z
2af30 32 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  2)!=0 ) continue
2af40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2af50 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
2af60 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  (i);.    }..    
2af70 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
2af80 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
2af90 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OW)==0 ){.      
2afa0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
2afb0 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29  gs & WHERE_IPK )
2afc0 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
2afd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 4b   = 0;.        nK
2afe0 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  eyCol = 0;.     
2aff0 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a     nColumn = 1;.
2b000 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2b010 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d  (pIndex = pLoop-
2b020 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
2b030 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62  ==0 || pIndex->b
2b040 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20  Unordered ){.   
2b050 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2b060 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2b070 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 49      nKeyCol = pI
2b080 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20  ndex->nKeyCol;. 
2b090 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d         nColumn =
2b0a0 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
2b0b0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2b0c0 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43  ( nColumn==nKeyC
2b0d0 6f 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77 69  ol+1 || !HasRowi
2b0e0 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  d(pIndex->pTable
2b0f0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ) );.        ass
2b100 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 61 69 43  ert( pIndex->aiC
2b110 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d  olumn[nColumn-1]
2b120 3d 3d 28 2d 31 29 20 7c 7c 20 21 48 61 73 52 6f  ==(-1) || !HasRo
2b130 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62  wid(pIndex->pTab
2b140 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69 73  le));.        is
2b150 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
2b160 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
2b170 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 20 20 20 20  =OE_None;.      
2b180 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  }..      /* Loop
2b190 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c   through all col
2b1a0 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
2b1b0 78 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68 20  x and deal with 
2b1c0 74 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a  the ones.      *
2b1d0 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63  * that are not c
2b1e0 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d  onstrained by ==
2b1f0 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f   or IN..      */
2b200 0a 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76  .      rev = rev
2b210 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64  Set = 0;.      d
2b220 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d  istinctColumns =
2b230 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   0;.      for(j=
2b240 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b  0; j<nColumn; j+
2b250 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62  +){.        u8 b
2b260 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72 75 65 20  Once;   /* True 
2b270 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45 52  to run the ORDER
2b280 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70 20   BY search loop 
2b290 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  */..        /* S
2b2a0 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20  kip over == and 
2b2b0 49 53 20 4e 55 4c 4c 20 74 65 72 6d 73 20 2a 2f  IS NULL terms */
2b2c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70  .        if( j<p
2b2d0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
2b2e0 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4c  q.         && pL
2b2f0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b  oop->u.btree.nSk
2b300 69 70 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  ip==0.         &
2b310 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e 61  & ((i = pLoop->a
2b320 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61  LTerm[j]->eOpera
2b330 74 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c 57 4f  tor) & (WO_EQ|WO
2b340 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 0a 20 20 20  _ISNULL))!=0.   
2b350 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2b360 20 20 69 66 28 20 69 20 26 20 57 4f 5f 49 53 4e    if( i & WO_ISN
2b370 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
2b380 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f     testcase( isO
2b390 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b 0a  rderDistinct );.
2b3a0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
2b3b0 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  derDistinct = 0;
2b3c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2b3d0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2b3e0 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20    .        }..  
2b3f0 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65        /* Get the
2b400 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69   column number i
2b410 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69 43 6f  n the table (iCo
2b420 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20 6f  lumn) and sort o
2b430 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rder.        ** 
2b440 28 72 65 76 49 64 78 29 20 66 6f 72 20 74 68 65  (revIdx) for the
2b450 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   j-th column of 
2b460 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  the index..     
2b470 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2b480 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
2b490 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
2b4a0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
2b4b0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  [j];.          r
2b4c0 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e  evIdx = pIndex->
2b4d0 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20  aSortOrder[j];. 
2b4e0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
2b4f0 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70 54  lumn==pIndex->pT
2b500 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69 43  able->iPKey ) iC
2b510 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
2b520 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b530 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d       iColumn = -
2b540 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76  1;.          rev
2b550 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Idx = 0;.       
2b560 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   }..        /* A
2b570 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20  n unconstrained 
2b580 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67 68  column that migh
2b590 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20  t be NULL means 
2b5a0 74 68 61 74 20 74 68 69 73 0a 20 20 20 20 20 20  that this.      
2b5b0 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69    ** WhereLoop i
2b5c0 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72  s not well-order
2b5d0 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ed.        */.  
2b5e0 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65        if( isOrde
2b5f0 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20  rDistinct.      
2b600 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30     && iColumn>=0
2b610 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d  .         && j>=
2b620 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
2b630 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  Eq.         && p
2b640 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61  Index->pTable->a
2b650 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74  Col[iColumn].not
2b660 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20  Null==0.        
2b670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f  ){.          isO
2b680 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
2b690 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
2b6a0 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65       /* Find the
2b6b0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 74   ORDER BY term t
2b6c0 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
2b6d0 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75  to the j-th colu
2b6e0 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  mn.        ** of
2b6f0 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 61   the index and a
2b700 6e 64 20 6d 61 72 6b 20 74 68 61 74 20 4f 52 44  nd mark that ORD
2b710 45 52 20 42 59 20 74 65 72 6d 20 6f 66 66 20 0a  ER BY term off .
2b720 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2b730 20 20 20 62 4f 6e 63 65 20 3d 20 31 3b 0a 20 20     bOnce = 1;.  
2b740 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
2b750 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  0;.        for(i
2b760 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e  =0; bOnce && i<n
2b770 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
2b780 20 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53           if( MAS
2b790 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
2b7a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2b7b0 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20        pOBExpr = 
2b7c0 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
2b7d0 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d  ollate(pOrderBy-
2b7e0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
2b7f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2b800 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
2b810 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a  HERE_GROUPBY );.
2b820 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2b830 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  se( wctrlFlags &
2b840 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
2b850 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Y );.          i
2b860 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
2b870 20 28 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c   (WHERE_GROUPBY|
2b880 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
2b890 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20  ))==0 ) bOnce = 
2b8a0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
2b8b0 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b   pOBExpr->op!=TK
2b8c0 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e  _COLUMN ) contin
2b8d0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
2b8e0 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c  ( pOBExpr->iTabl
2b8f0 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  e!=iCur ) contin
2b900 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
2b910 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75  ( pOBExpr->iColu
2b920 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f  mn!=iColumn ) co
2b930 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2b940 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30    if( iColumn>=0
2b950 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b960 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
2b970 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
2b980 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65  o->pParse, pOrde
2b990 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
2b9a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2b9b0 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
2b9c0 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
2b9d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2b9e0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
2b9f0 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70  (pColl->zName, p
2ba00 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d  Index->azColl[j]
2ba10 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
2ba20 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ba30 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d         isMatch =
2ba40 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
2ba50 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
2ba60 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74         if( isMat
2ba70 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ch ){.          
2ba80 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  if( iColumn<0 ){
2ba90 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
2baa0 74 63 61 73 65 28 20 64 69 73 74 69 6e 63 74 43  tcase( distinctC
2bab0 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20  olumns==0 );.   
2bac0 20 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63           distinc
2bad0 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20  tColumns = 1;.  
2bae0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2baf0 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
2bb00 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20  KBIT(i);.       
2bb10 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
2bb20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2bb30 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29  RE_GROUPBY)==0 )
2bb40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
2bb50 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   Make sure the s
2bb60 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d  ort order is com
2bb70 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52  patible in an OR
2bb80 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
2bb90 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f             ** So
2bba0 72 74 20 6f 72 64 65 72 20 69 73 20 69 72 72 65  rt order is irre
2bbb0 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f  levant for a GRO
2bbc0 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f  UP BY clause. */
2bbd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2bbe0 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20   revSet ){.     
2bbf0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65           if( (re
2bc00 76 20 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72  v ^ revIdx)!=pOr
2bc10 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
2bc20 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 30  Order ) return 0
2bc30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
2bc40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2bc50 20 20 20 72 65 76 20 3d 20 72 65 76 49 64 78 20     rev = revIdx 
2bc60 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  ^ pOrderBy->a[i]
2bc70 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
2bc80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
2bc90 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d  v ) *pRevMask |=
2bca0 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b   MASKBIT(iLoop);
2bcb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
2bcc0 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20  evSet = 1;.     
2bcd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bce0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
2bcf0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2bd00 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20   No match found 
2bd10 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
2bd20 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43   j==0 || j<nKeyC
2bd30 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ol ){.          
2bd40 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
2bd50 64 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29  derDistinct!=0 )
2bd60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73  ;.            is
2bd70 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
2bd80 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
2bd90 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2bda0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bdb0 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76  } /* end Loop ov
2bdc0 65 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c  er all index col
2bdd0 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  umns */.      if
2bde0 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  ( distinctColumn
2bdf0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  s ){.        tes
2be00 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69  tcase( isOrderDi
2be10 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20  stinct==0 );.   
2be20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
2be30 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  inct = 1;.      
2be40 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69  }.    } /* end-i
2be50 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f  f not one-row */
2be60 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66  ..    /* Mark of
2be70 66 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45  f any other ORDE
2be80 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20  R BY terms that 
2be90 72 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20  reference pLoop 
2bea0 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64  */.    if( isOrd
2beb0 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  erDistinct ){.  
2bec0 20 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63      orderDistinc
2bed0 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e  tMask |= pLoop->
2bee0 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
2bef0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
2bf00 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
2bf10 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20     Expr *p;.    
2bf20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
2bf30 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
2bf40 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70  tinue;.        p
2bf50 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
2bf60 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
2bf70 20 69 66 28 20 28 65 78 70 72 54 61 62 6c 65 55   if( (exprTableU
2bf80 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  sage(&pWInfo->sM
2bf90 61 73 6b 53 65 74 2c 20 70 29 26 7e 6f 72 64 65  askSet, p)&~orde
2bfa0 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d  rDistinctMask)==
2bfb0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  0 ){.          o
2bfc0 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
2bfd0 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
2bfe0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
2bff0 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20  /* End the loop 
2c000 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f  over all WhereLo
2c010 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d  ops from outer-m
2c020 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65  ost down to inne
2c030 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20  r-most */.  if( 
2c040 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20  obSat==obDone ) 
2c050 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
2c060 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74  !isOrderDistinct
2c070 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
2c080 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 23 69 66  eturn -1;.}..#if
2c090 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
2c0a0 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65  NABLED./* For de
2c0b0 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79  bugging use only
2c0c0 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  : */.static cons
2c0d0 74 20 63 68 61 72 20 2a 77 68 65 72 65 50 61 74  t char *wherePat
2c0e0 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68 20  hName(WherePath 
2c0f0 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f  *pPath, int nLoo
2c100 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  p, WhereLoop *pL
2c110 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ast){.  static c
2c120 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20  har zName[65];. 
2c130 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
2c140 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29  0; i<nLoop; i++)
2c150 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61  { zName[i] = pPa
2c160 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49  th->aLoop[i]->cI
2c170 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74  d; }.  if( pLast
2c180 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20   ) zName[i++] = 
2c190 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e  pLast->cId;.  zN
2c1a0 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65  ame[i] = 0;.  re
2c1b0 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65  turn zName;.}.#e
2c1c0 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ndif.../*.** Giv
2c1d0 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57  en the list of W
2c1e0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
2c1f0 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f   at pWInfo->pLoo
2c200 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ps, this routine
2c210 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
2c220 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20  find the lowest 
2c230 63 6f 73 74 20 70 61 74 68 20 74 68 61 74 20 76  cost path that v
2c240 69 73 69 74 73 20 65 61 63 68 20 57 68 65 72 65  isits each Where
2c250 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54  Loop.** once.  T
2c260 68 69 73 20 70 61 74 68 20 69 73 20 74 68 65 6e  his path is then
2c270 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65   loaded into the
2c280 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c   pWInfo->a[].pWL
2c290 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a  oop fields..**.*
2c2a0 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20 74 68  * Assume that th
2c2b0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
2c2c0 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68  f output rows th
2c2d0 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  at will need to 
2c2e0 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c  be sorted.** wil
2c2f0 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e  l be nRowEst (in
2c300 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70   the 10*log2 rep
2c310 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f  resentation).  O
2c320 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e  r, ignore sortin
2c330 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52  g.** costs if nR
2c340 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  owEst==0..**.** 
2c350 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2c360 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53   on success or S
2c370 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61  QLITE_NOMEM of a
2c380 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2c390 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  on.** error occu
2c3a0 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
2c3b0 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65  t wherePathSolve
2c3c0 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  r(WhereInfo *pWI
2c3d0 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77  nfo, LogEst nRow
2c3e0 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68  Est){.  int mxCh
2c3f0 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  oice;           
2c400 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
2c410 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65  ber of simultane
2c420 6f 75 73 20 70 61 74 68 73 20 74 72 61 63 6b 65  ous paths tracke
2c430 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70  d */.  int nLoop
2c440 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c450 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
2c460 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20  rms in the join 
2c470 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
2c480 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  se;            /
2c490 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
2c4a0 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
2c4b0 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
2c4c0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
2c4d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
2c4e0 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20   int iLoop;     
2c4f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2c500 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20  op counter over 
2c510 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
2c520 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69   join */.  int i
2c530 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20  i, jj;          
2c540 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2c550 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d  nters */.  int m
2c560 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  xI = 0;         
2c570 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2c580 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20 72   next entry to r
2c590 65 70 6c 61 63 65 20 2a 2f 0a 20 20 4c 6f 67 45  eplace */.  LogE
2c5a0 73 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20  st rCost;       
2c5b0 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66        /* Cost of
2c5c0 20 61 20 70 61 74 68 20 2a 2f 0a 20 20 4c 6f 67   a path */.  Log
2c5d0 45 73 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20  Est nOut;       
2c5e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2c5f0 20 6f 66 20 6f 75 74 70 75 74 73 20 2a 2f 0a 20   of outputs */. 
2c600 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74 20 3d   LogEst mxCost =
2c610 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   0;        /* Ma
2c620 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20  ximum cost of a 
2c630 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a  set of paths */.
2c640 20 20 4c 6f 67 45 73 74 20 6d 78 4f 75 74 20 3d    LogEst mxOut =
2c650 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d   0;         /* M
2c660 61 78 69 6d 75 6d 20 6e 4f 75 74 20 76 61 6c 75  aximum nOut valu
2c670 65 20 6f 6e 20 74 68 65 20 73 65 74 20 6f 66 20  e on the set of 
2c680 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73  paths */.  LogEs
2c690 74 20 72 53 6f 72 74 43 6f 73 74 3b 20 20 20 20  t rSortCost;    
2c6a0 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 74 6f 20       /* Cost to 
2c6b0 64 6f 20 61 20 73 6f 72 74 20 2a 2f 0a 20 20 69  do a sort */.  i
2c6c0 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20  nt nTo, nFrom;  
2c6d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2c6e0 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72  er of valid entr
2c6f0 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64  ies in aTo[] and
2c700 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68   aFrom[] */.  Wh
2c710 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20  erePath *aFrom; 
2c720 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e          /* All n
2c730 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68  From paths at th
2c740 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c  e previous level
2c750 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
2c760 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20  *aTo;           
2c770 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20  /* The nTo best 
2c780 70 61 74 68 73 20 61 74 20 74 68 65 20 63 75 72  paths at the cur
2c790 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  rent level */.  
2c7a0 57 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d  WherePath *pFrom
2c7b0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ;         /* An 
2c7c0 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d  element of aFrom
2c7d0 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
2c7e0 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
2c7f0 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20  herePath *pTo;  
2c800 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
2c810 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20  lement of aTo[] 
2c820 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b  that we are work
2c830 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ing on */.  Wher
2c840 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20  eLoop *pWLoop;  
2c850 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
2c860 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
2c870 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65  jects */.  Where
2c880 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20  Loop **pX;      
2c890 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
2c8a0 64 69 76 79 20 75 70 20 74 68 65 20 70 53 70 61  divy up the pSpa
2c8b0 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 63  ce memory */.  c
2c8c0 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20  har *pSpace;    
2c8d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
2c8e0 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65  orary memory use
2c8f0 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
2c900 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d  e */..  pParse =
2c910 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
2c920 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
2c930 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57  db;.  nLoop = pW
2c940 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20  Info->nLevel;.  
2c950 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73  /* TUNING: For s
2c960 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f  imple queries, o
2c970 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70 61 74  nly the best pat
2c980 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20  h is tracked..  
2c990 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69  ** For 2-way joi
2c9a0 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74 20 70  ns, the 5 best p
2c9b0 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65  aths are followe
2c9c0 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e  d..  ** For join
2c9d0 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74  s of 3 or more t
2c9e0 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65  ables, track the
2c9f0 20 31 30 20 62 65 73 74 20 70 61 74 68 73 20 2a   10 best paths *
2ca00 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28  /.  mxChoice = (
2ca10 6e 4c 6f 6f 70 3d 3d 31 29 20 3f 20 31 20 3a 20  nLoop==1) ? 1 : 
2ca20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20  (nLoop==2 ? 5 : 
2ca30 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  10);.  assert( n
2ca40 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54  Loop<=pWInfo->pT
2ca50 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
2ca60 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30    WHERETRACE(0x0
2ca70 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e  02, ("---- begin
2ca80 20 73 6f 6c 76 65 72 5c 6e 22 29 29 3b 0a 0a 20   solver\n"));.. 
2ca90 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
2caa0 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63   initialize spac
2cab0 65 20 66 6f 72 20 61 54 6f 20 61 6e 64 20 61 46  e for aTo and aF
2cac0 72 6f 6d 20 2a 2f 0a 20 20 69 69 20 3d 20 28 73  rom */.  ii = (s
2cad0 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68 29  izeof(WherePath)
2cae0 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f  +sizeof(WhereLoo
2caf0 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f  p*)*nLoop)*mxCho
2cb00 69 63 65 2a 32 3b 0a 20 20 70 53 70 61 63 65 20  ice*2;.  pSpace 
2cb10 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2cb20 63 52 61 77 28 64 62 2c 20 69 69 29 3b 0a 20 20  cRaw(db, ii);.  
2cb30 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20  if( pSpace==0 ) 
2cb40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2cb50 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68  MEM;.  aTo = (Wh
2cb60 65 72 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b  erePath*)pSpace;
2cb70 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d  .  aFrom = aTo+m
2cb80 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65  xChoice;.  memse
2cb90 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65  t(aFrom, 0, size
2cba0 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20  of(aFrom[0]));. 
2cbb0 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70   pX = (WhereLoop
2cbc0 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69  **)(aFrom+mxChoi
2cbd0 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78  ce);.  for(ii=mx
2cbe0 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d  Choice*2, pFrom=
2cbf0 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c  aTo; ii>0; ii--,
2cc00 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20   pFrom++, pX += 
2cc10 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f  nLoop){.    pFro
2cc20 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20  m->aLoop = pX;. 
2cc30 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68   }..  /* Seed th
2cc40 65 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20  e search with a 
2cc50 73 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68  single WherePath
2cc60 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f   containing zero
2cc70 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a   WhereLoops..  *
2cc80 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44  *.  ** TUNING: D
2cc90 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75  o not let the nu
2cca0 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f  mber of iteratio
2ccb0 6e 73 20 67 6f 20 61 62 6f 76 65 20 32 35 2e 20  ns go above 25. 
2ccc0 20 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a   If the cost.  *
2ccd0 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61  * of computing a
2cce0 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
2ccf0 78 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61  x is not paid ba
2cd00 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  ck within the fi
2cd10 72 73 74 20 32 35 0a 20 20 2a 2a 20 72 6f 77 73  rst 25.  ** rows
2cd20 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73  , then do not us
2cd30 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
2cd40 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f  index. */.  aFro
2cd50 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28  m[0].nRow = MIN(
2cd60 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
2cd70 6f 70 2c 20 34 36 29 3b 20 20 61 73 73 65 72 74  op, 46);  assert
2cd80 28 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 46==sqlite3Log
2cd90 45 73 74 28 32 35 29 20 29 3b 0a 20 20 6e 46 72  Est(25) );.  nFr
2cda0 6f 6d 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 50 72  om = 1;..  /* Pr
2cdb0 65 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 73  ecompute the cos
2cdc0 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65  t of sorting the
2cdd0 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 73 65   final result se
2cde0 74 2c 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72  t, if the caller
2cdf0 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  .  ** to sqlite3
2ce00 57 68 65 72 65 42 65 67 69 6e 28 29 20 77 61 73  WhereBegin() was
2ce10 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
2ce20 20 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 72 53   sorting */.  rS
2ce30 6f 72 74 43 6f 73 74 20 3d 20 30 3b 0a 20 20 69  ortCost = 0;.  i
2ce40 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
2ce50 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73  rBy==0 || nRowEs
2ce60 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 46 72 6f  t==0 ){.    aFro
2ce70 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 56 61  m[0].isOrderedVa
2ce80 6c 69 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  lid = 1;.  }else
2ce90 7b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  {.    /* TUNING:
2cea0 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20   Estimated cost 
2ceb0 6f 66 20 73 6f 72 74 69 6e 67 20 69 73 20 34 38  of sorting is 48
2cec0 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65  *N*log2(N) where
2ced0 20 4e 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a   N is the.    **
2cee0 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
2cef0 74 20 72 6f 77 73 2e 20 54 68 65 20 34 38 20 69  t rows. The 48 i
2cf00 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 73  s the expected s
2cf10 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 74 6f 20  ize of a row to 
2cf20 73 6f 72 74 2e 20 0a 20 20 20 20 2a 2a 20 46 49  sort. .    ** FI
2cf30 58 4d 45 3a 20 20 63 6f 6d 70 75 74 65 20 61 20  XME:  compute a 
2cf40 62 65 74 74 65 72 20 65 73 74 69 6d 61 74 65 20  better estimate 
2cf50 6f 66 20 74 68 65 20 34 38 20 6d 75 6c 74 69 70  of the 48 multip
2cf60 6c 69 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68  lier based on th
2cf70 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20  e.    ** result 
2cf80 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  set expressions.
2cf90 20 2a 2f 0a 20 20 20 20 72 53 6f 72 74 43 6f 73   */.    rSortCos
2cfa0 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 65 73  t = nRowEst + es
2cfb0 74 4c 6f 67 28 6e 52 6f 77 45 73 74 29 3b 0a 20  tLog(nRowEst);. 
2cfc0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
2cfd0 30 30 32 2c 28 22 2d 2d 2d 2d 20 73 6f 72 74 20  002,("---- sort 
2cfe0 63 6f 73 74 3d 25 2d 33 64 5c 6e 22 2c 20 72 53  cost=%-3d\n", rS
2cff0 6f 72 74 43 6f 73 74 29 29 3b 0a 20 20 7d 0a 0a  ortCost));.  }..
2d000 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75 63    /* Compute suc
2d010 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72  cessively longer
2d020 20 57 68 65 72 65 50 61 74 68 73 20 75 73 69 6e   WherePaths usin
2d030 67 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 67  g the previous g
2d040 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f  eneration.  ** o
2d050 66 20 57 68 65 72 65 50 61 74 68 73 20 61 73 20  f WherePaths as 
2d060 74 68 65 20 62 61 73 69 73 20 66 6f 72 20 74 68  the basis for th
2d070 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20 74 72  e next.  Keep tr
2d080 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43 68 6f  ack of the mxCho
2d090 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20 70 61  ice.  ** best pa
2d0a0 74 68 73 20 61 74 20 65 61 63 68 20 67 65 6e 65  ths at each gene
2d0b0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28  ration */.  for(
2d0c0 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e  iLoop=0; iLoop<n
2d0d0 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
2d0e0 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20      nTo = 0;.   
2d0f0 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d   for(ii=0, pFrom
2d100 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d  =aFrom; ii<nFrom
2d110 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  ; ii++, pFrom++)
2d120 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57 4c 6f  {.      for(pWLo
2d130 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  op=pWInfo->pLoop
2d140 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f  s; pWLoop; pWLoo
2d150 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c  p=pWLoop->pNextL
2d160 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20 42 69  oop){.        Bi
2d170 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 0a 20  tmask maskNew;. 
2d180 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72         Bitmask r
2d190 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  evMask = 0;.    
2d1a0 20 20 20 20 75 38 20 69 73 4f 72 64 65 72 65 64      u8 isOrdered
2d1b0 56 61 6c 69 64 20 3d 20 70 46 72 6f 6d 2d 3e 69  Valid = pFrom->i
2d1c0 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b 0a 20  sOrderedValid;. 
2d1d0 20 20 20 20 20 20 20 75 38 20 69 73 4f 72 64 65         u8 isOrde
2d1e0 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f  red = pFrom->isO
2d1f0 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20  rdered;.        
2d200 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65  if( (pWLoop->pre
2d210 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61  req & ~pFrom->ma
2d220 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
2d230 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
2d240 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  f( (pWLoop->mask
2d250 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61  Self & pFrom->ma
2d260 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
2d270 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 2f  tinue;.        /
2d280 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
2d290 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e   pWLoop is a can
2d2a0 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 68 65  didate to be the
2d2b0 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20   next loop. .   
2d2c0 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20       ** Compute 
2d2d0 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20  its cost */.    
2d2e0 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69      rCost = sqli
2d2f0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 57 4c  te3LogEstAdd(pWL
2d300 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f  oop->rSetup,pWLo
2d310 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d  op->rRun + pFrom
2d320 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 20  ->nRow);.       
2d330 20 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33   rCost = sqlite3
2d340 4c 6f 67 45 73 74 41 64 64 28 72 43 6f 73 74 2c  LogEstAdd(rCost,
2d350 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 29 3b 0a   pFrom->rCost);.
2d360 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 70          nOut = p
2d370 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c  From->nRow + pWL
2d380 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20  oop->nOut;.     
2d390 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72     maskNew = pFr
2d3a0 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70  om->maskLoop | p
2d3b0 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  WLoop->maskSelf;
2d3c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73  .        if( !is
2d3d0 4f 72 64 65 72 65 64 56 61 6c 69 64 20 29 7b 0a  OrderedValid ){.
2d3e0 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68            switch
2d3f0 28 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  ( wherePathSatis
2d400 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e  fiesOrderBy(pWIn
2d410 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo,.            
2d420 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
2d430 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72  o->pOrderBy, pFr
2d440 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  om, pWInfo->wctr
2d450 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20  lFlags,.        
2d460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2d470 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72  Loop, pWLoop, &r
2d480 65 76 4d 61 73 6b 29 20 29 7b 0a 20 20 20 20 20  evMask) ){.     
2d490 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 20         case 1:  
2d4a0 2f 2a 20 59 65 73 2e 20 20 70 46 72 6f 6d 2b 70  /* Yes.  pFrom+p
2d4b0 57 4c 6f 6f 70 20 64 6f 65 73 20 73 61 74 69 73  WLoop does satis
2d4c0 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  fy the ORDER BY 
2d4d0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
2d4e0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
2d4f0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  d = 1;.         
2d500 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61       isOrderedVa
2d510 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  lid = 1;.       
2d520 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2d530 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 30            case 0
2d540 3a 20 20 2f 2a 20 4e 6f 2e 20 20 70 46 72 6f 6d  :  /* No.  pFrom
2d550 2b 70 57 4c 6f 6f 70 20 77 69 6c 6c 20 72 65 71  +pWLoop will req
2d560 75 69 72 65 20 61 20 73 65 70 61 72 61 74 65 20  uire a separate 
2d570 73 6f 72 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  sort */.        
2d580 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 20        isOrdered 
2d590 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
2d5a0 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69     isOrderedVali
2d5b0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  d = 1;.         
2d5c0 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c       rCost = sql
2d5d0 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 43  ite3LogEstAdd(rC
2d5e0 6f 73 74 2c 20 72 53 6f 72 74 43 6f 73 74 29 3b  ost, rSortCost);
2d5f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
2d600 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2d610 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20 43 61    default: /* Ca
2d620 6e 6e 6f 74 20 74 65 6c 6c 20 79 65 74 2e 20 20  nnot tell yet.  
2d630 54 72 79 20 61 67 61 69 6e 20 6f 6e 20 74 68 65  Try again on the
2d640 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
2d650 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
2d660 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2d670 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
2d680 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76  e{.          rev
2d690 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65  Mask = pFrom->re
2d6a0 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d  vLoop;.        }
2d6b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
2d6c0 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f  k to see if pWLo
2d6d0 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64  op should be add
2d6e0 65 64 20 74 6f 20 74 68 65 20 6d 78 43 68 6f 69  ed to the mxChoi
2d6f0 63 65 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a  ce best so far *
2d700 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a  /.        for(jj
2d710 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c  =0, pTo=aTo; jj<
2d720 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b  nTo; jj++, pTo++
2d730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2d740 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d   pTo->maskLoop==
2d750 6d 61 73 6b 4e 65 77 0a 20 20 20 20 20 20 20 20  maskNew.        
2d760 20 20 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64     && pTo->isOrd
2d770 65 72 65 64 56 61 6c 69 64 3d 3d 69 73 4f 72 64  eredValid==isOrd
2d780 65 72 65 64 56 61 6c 69 64 0a 20 20 20 20 20 20  eredValid.      
2d790 20 20 20 20 20 26 26 20 28 28 70 54 6f 2d 3e 72       && ((pTo->r
2d7a0 43 6f 73 74 3c 3d 72 43 6f 73 74 20 26 26 20 70  Cost<=rCost && p
2d7b0 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20  To->nRow<=nOut) 
2d7c0 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
2d7d0 20 20 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3e 3d     (pTo->rCost>=
2d7e0 72 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52  rCost && pTo->nR
2d7f0 6f 77 3e 3d 6e 4f 75 74 29 29 0a 20 20 20 20 20  ow>=nOut)).     
2d800 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2d810 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 6a      testcase( jj
2d820 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20  ==nTo-1 );.     
2d830 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2d840 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d850 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2d860 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20  jj>=nTo ){.     
2d870 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78       if( nTo>=mx
2d880 43 68 6f 69 63 65 20 26 26 20 72 43 6f 73 74 3e  Choice && rCost>
2d890 3d 6d 78 43 6f 73 74 20 29 7b 0a 23 69 66 64 65  =mxCost ){.#ifde
2d8a0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
2d8b0 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20  BLED /* 0x4 */. 
2d8c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
2d8d0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
2d8e0 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
2d8f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2d900 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70 20 20  ugPrintf("Skip  
2d910 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
2d920 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
2d930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d940 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
2d950 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
2d960 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
2d970 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2d980 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61       isOrderedVa
2d990 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64  lid ? (isOrdered
2d9a0 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20   ? 'Y' : 'N') : 
2d9b0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
2d9c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2d9d0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2d9e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2d9f0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20         /* Add a 
2da00 6e 65 77 20 50 61 74 68 20 74 6f 20 74 68 65 20  new Path to the 
2da10 61 54 6f 5b 5d 20 73 65 74 20 2a 2f 0a 20 20 20  aTo[] set */.   
2da20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d         if( nTo<m
2da30 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20  xChoice ){.     
2da40 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61         /* Increa
2da50 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
2da60 68 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f 6e  he aTo set by on
2da70 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
2da80 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20   jj = nTo++;.   
2da90 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2daa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
2dab0 20 70 61 74 68 20 72 65 70 6c 61 63 65 73 20 74   path replaces t
2dac0 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20 74  he prior worst t
2dad0 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65 6c  o keep count bel
2dae0 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20  ow mxChoice */. 
2daf0 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20             jj = 
2db00 6d 78 49 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  mxI;.          }
2db10 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f 20 3d  .          pTo =
2db20 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65   &aTo[jj];.#ifde
2db30 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
2db40 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20  BLED /* 0x4 */. 
2db50 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2db60 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
2db70 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
2db80 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2db90 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73 20  intf("New    %s 
2dba0 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
2dbb0 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
2dbc0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
2dbd0 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
2dbe0 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
2dbf0 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20  rCost, nOut,.   
2dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
2dc10 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69  rderedValid ? (i
2dc20 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a  sOrdered ? 'Y' :
2dc30 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20   'N') : '?');.  
2dc40 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
2dc50 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2dc60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
2dc70 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73 74 20  o->rCost<=rCost 
2dc80 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f  && pTo->nRow<=nO
2dc90 75 74 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45  ut ){.#ifdef WHE
2dca0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
2dcb0 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
2dcc0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2dcd0 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
2dce0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2dcf0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2dd00 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
2dd10 20 20 20 20 20 20 20 22 53 6b 69 70 20 20 20 25         "Skip   %
2dd20 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
2dd30 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
2dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
2dd50 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
2dd60 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
2dd70 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
2dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd90 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20   isOrderedValid 
2dda0 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27  ? (isOrdered ? '
2ddb0 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29  Y' : 'N') : '?')
2ddc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2ddd0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2dde0 74 66 28 22 20 20 20 76 73 20 25 73 20 63 6f 73  tf("   vs %s cos
2ddf0 74 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65 72 3d  t=%-3d,%d order=
2de00 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
2de10 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
2de20 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f  thName(pTo, iLoo
2de30 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43  p+1, 0), pTo->rC
2de40 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a  ost, pTo->nRow,.
2de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de60 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
2de70 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73  Valid ? (pTo->is
2de80 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
2de90 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
2dea0 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
2deb0 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  f.            te
2dec0 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f  stcase( pTo->rCo
2ded0 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20  st==rCost );.   
2dee0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2def0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2df00 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2df10 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  e( pTo->rCost==r
2df20 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20  Cost+1 );.      
2df30 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 61 6e 64      /* A new and
2df40 20 62 65 74 74 65 72 20 73 63 6f 72 65 20 66 6f   better score fo
2df50 72 20 61 20 70 72 65 76 69 6f 75 73 6c 79 20 63  r a previously c
2df60 72 65 61 74 65 64 20 65 71 75 69 76 61 6c 65 6e  reated equivalen
2df70 74 20 70 61 74 68 20 2a 2f 0a 23 69 66 64 65 66  t path */.#ifdef
2df80 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
2df90 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20  LED /* 0x4 */.  
2dfa0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2dfb0 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
2dfc0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
2dfd0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2dfe0 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
2dff0 20 20 20 20 20 22 55 70 64 61 74 65 20 25 73 20       "Update %s 
2e000 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
2e010 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
2e020 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
2e030 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
2e040 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
2e050 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20  ost, nOut,.     
2e060 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
2e070 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f  eredValid ? (isO
2e080 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27  rdered ? 'Y' : '
2e090 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  N') : '?');.    
2e0a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2e0b0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 77 61  ebugPrintf("  wa
2e0c0 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25  s %s cost=%-3d,%
2e0d0 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
2e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e0f0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54  wherePathName(pT
2e100 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20  o, iLoop+1, 0), 
2e110 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d  pTo->rCost, pTo-
2e120 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  >nRow,.         
2e130 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
2e140 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54  deredValid ? (pT
2e150 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27  o->isOrdered ? '
2e160 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29  Y' : 'N') : '?')
2e170 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
2e180 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20  ndif.        }. 
2e190 20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70         /* pWLoop
2e1a0 20 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41   is a winner.  A
2e1b0 64 64 20 69 74 20 74 6f 20 74 68 65 20 73 65 74  dd it to the set
2e1c0 20 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72 20   of best so far 
2e1d0 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  */.        pTo->
2e1e0 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d  maskLoop = pFrom
2e1f0 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c  ->maskLoop | pWL
2e200 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
2e210 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c         pTo->revL
2e220 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20  oop = revMask;. 
2e230 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77         pTo->nRow
2e240 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20   = nOut;.       
2e250 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43   pTo->rCost = rC
2e260 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ost;.        pTo
2e270 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
2e280 20 3d 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69   = isOrderedVali
2e290 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  d;.        pTo->
2e2a0 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72  isOrdered = isOr
2e2b0 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d  dered;.        m
2e2c0 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70  emcpy(pTo->aLoop
2e2d0 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20  , pFrom->aLoop, 
2e2e0 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
2e2f0 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  *)*iLoop);.     
2e300 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c     pTo->aLoop[iL
2e310 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20  oop] = pWLoop;. 
2e320 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
2e330 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
2e340 20 20 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20        mxI = 0;. 
2e350 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
2e360 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a  = aTo[0].rCost;.
2e370 20 20 20 20 20 20 20 20 20 20 6d 78 4f 75 74 20            mxOut 
2e380 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20  = aTo[0].nRow;. 
2e390 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d           for(jj=
2e3a0 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20  1, pTo=&aTo[1]; 
2e3b0 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b  jj<mxChoice; jj+
2e3c0 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
2e3d0 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
2e3e0 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20  rCost>mxCost || 
2e3f0 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43  (pTo->rCost==mxC
2e400 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77  ost && pTo->nRow
2e410 3e 6d 78 4f 75 74 29 20 29 7b 0a 20 20 20 20 20  >mxOut) ){.     
2e420 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
2e430 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20  = pTo->rCost;.  
2e440 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 4f 75              mxOu
2e450 74 20 3d 20 70 54 6f 2d 3e 6e 52 6f 77 3b 0a 20  t = pTo->nRow;. 
2e460 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 49               mxI
2e470 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20   = jj;.         
2e480 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2e490 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e4a0 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66   }.    }..#ifdef
2e4b0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
2e4c0 4c 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20  LED  /* >=2 */. 
2e4d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
2e4e0 65 72 65 54 72 61 63 65 3e 3d 32 20 29 7b 0a 20  ereTrace>=2 ){. 
2e4f0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2e500 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66  gPrintf("---- af
2e510 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d  ter round %d ---
2e520 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20  -\n", iLoop);.  
2e530 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54      for(ii=0, pT
2e540 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69  o=aTo; ii<nTo; i
2e550 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  i++, pTo++){.   
2e560 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2e570 67 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73  gPrintf(" %s cos
2e580 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64  t=%-3d nrow=%-3d
2e590 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
2e5a0 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
2e5b0 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b  Name(pTo, iLoop+
2e5c0 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73  1, 0), pTo->rCos
2e5d0 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20  t, pTo->nRow,.  
2e5e0 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73           pTo->is
2e5f0 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28  OrderedValid ? (
2e600 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f  pTo->isOrdered ?
2e610 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f   'Y' : 'N') : '?
2e620 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ');.        if( 
2e630 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61  pTo->isOrderedVa
2e640 6c 69 64 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72  lid && pTo->isOr
2e650 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  dered ){.       
2e660 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2e670 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c  rintf(" rev=0x%l
2e680 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c  lx\n", pTo->revL
2e690 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  oop);.        }e
2e6a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
2e6b0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2e6c0 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  f("\n");.       
2e6d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2e6e0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
2e6f0 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f  Swap the roles o
2e700 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20  f aFrom and aTo 
2e710 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e  for the next gen
2e720 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70  eration */.    p
2e730 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20  From = aTo;.    
2e740 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20  aTo = aFrom;.   
2e750 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a   aFrom = pFrom;.
2e760 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b      nFrom = nTo;
2e770 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f  .  }..  if( nFro
2e780 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  m==0 ){.    sqli
2e790 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2e7a0 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f  se, "no query so
2e7b0 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71  lution");.    sq
2e7c0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2e7d0 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74  pSpace);.    ret
2e7e0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2e7f0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69  ;.  }.  .  /* Fi
2e800 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  nd the lowest co
2e810 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20  st path.  pFrom 
2e820 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69  will be left poi
2e830 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61  nting to that pa
2e840 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20  th */.  pFrom = 
2e850 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d  aFrom;.  for(ii=
2e860 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b  1; ii<nFrom; ii+
2e870 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  +){.    if( pFro
2e880 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69  m->rCost>aFrom[i
2e890 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d  i].rCost ) pFrom
2e8a0 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20   = &aFrom[ii];. 
2e8b0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57 49   }.  assert( pWI
2e8c0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f  nfo->nLevel==nLo
2e8d0 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20  op );.  /* Load 
2e8e0 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
2e8f0 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f  path into pWInfo
2e900 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d   */.  for(iLoop=
2e910 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20  0; iLoop<nLoop; 
2e920 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68  iLoop++){.    Wh
2e930 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
2e940 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69   = pWInfo->a + i
2e950 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Loop;.    pLevel
2e960 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f  ->pWLoop = pWLoo
2e970 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  p = pFrom->aLoop
2e980 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65  [iLoop];.    pLe
2e990 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c  vel->iFrom = pWL
2e9a0 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70  oop->iTab;.    p
2e9b0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d  Level->iTabCur =
2e9c0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2e9d0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
2e9e0 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d  om].iCursor;.  }
2e9f0 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e  .  if( (pWInfo->
2ea00 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2ea10 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
2ea20 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e  )!=0.   && (pWIn
2ea30 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
2ea40 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
2ea50 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49 6e  Y)==0.   && pWIn
2ea60 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57  fo->eDistinct==W
2ea70 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f  HERE_DISTINCT_NO
2ea80 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74  OP.   && nRowEst
2ea90 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  .  ){.    Bitmas
2eaa0 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69  k notUsed;.    i
2eab0 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74  nt rc = wherePat
2eac0 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
2ead0 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f  y(pWInfo, pWInfo
2eae0 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70 46  ->pResultSet, pF
2eaf0 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rom,.           
2eb00 20 20 20 20 20 20 57 48 45 52 45 5f 44 49 53 54        WHERE_DIST
2eb10 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c  INCTBY, nLoop-1,
2eb20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c   pFrom->aLoop[nL
2eb30 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64  oop-1], &notUsed
2eb40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 31  );.    if( rc==1
2eb50 20 29 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74   ) pWInfo->eDist
2eb60 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
2eb70 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
2eb80 20 7d 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e   }.  if( pFrom->
2eb90 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20 20 20  isOrdered ){.   
2eba0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74   if( pWInfo->wct
2ebb0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2ebc0 44 49 53 54 49 4e 43 54 42 59 20 29 7b 0a 20 20  DISTINCTBY ){.  
2ebd0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
2ebe0 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
2ebf0 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
2ec00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ec10 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20   pWInfo->bOBSat 
2ec20 3d 20 31 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  = 1;.      pWInf
2ec30 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46 72  o->revMask = pFr
2ec40 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20  om->revLoop;.   
2ec50 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d   }.  }.  pWInfo-
2ec60 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d  >nRowOut = pFrom
2ec70 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72  ->nRow;..  /* Fr
2ec80 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d  ee temporary mem
2ec90 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e 20 73  ory and return s
2eca0 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69  uccess */.  sqli
2ecb0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
2ecc0 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  pace);.  return 
2ecd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2ece0 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69 65 73  .** Most queries
2ecf0 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67   use only a sing
2ed00 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79 20 61  le table (they a
2ed10 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e  re not joins) an
2ed20 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65  d have.** simple
2ed30 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
2ed40 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65 64 20  against indexed 
2ed50 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20 72 6f  fields.  This ro
2ed60 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a  utine attempts.*
2ed70 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20  * to plan those 
2ed80 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75 73 69  simple cases usi
2ed90 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63 65 72  ng much less cer
2eda0 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a  emony than the.*
2edb0 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73  * general-purpos
2edc0 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c  e query planner,
2edd0 20 61 6e 64 20 74 68 65 72 65 62 79 20 79 69 65   and thereby yie
2ede0 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69 74 65  ld faster sqlite
2edf0 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a 20 74  3_prepare().** t
2ee00 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6d  imes for the com
2ee10 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  mon case..**.** 
2ee20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
2ee30 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66 20 74  on success, if t
2ee40 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65  his query can be
2ee50 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73   handled by this
2ee60 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75  .** no-frills qu
2ee70 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65  ery planner.  Re
2ee80 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74 68 69  turn zero if thi
2ee90 73 20 71 75 65 72 79 20 6e 65 65 64 73 20 74 68  s query needs th
2eea0 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75  e .** general-pu
2eeb0 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e  rpose query plan
2eec0 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ner..*/.static i
2eed0 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43 75 74  nt whereShortCut
2eee0 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
2eef0 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20  r *pBuilder){.  
2ef00 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2ef10 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  o;.  struct SrcL
2ef20 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2ef30 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2ef40 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  pWC;.  WhereTerm
2ef50 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65 72 65   *pTerm;.  Where
2ef60 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69  Loop *pLoop;.  i
2ef70 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a  nt iCur;.  int j
2ef80 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
2ef90 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
2efa0 20 20 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42    .  pWInfo = pB
2efb0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
2efc0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
2efd0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2efe0 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 29 20 72  _FORCE_TABLE ) r
2eff0 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72  eturn 0;.  asser
2f000 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  t( pWInfo->pTabL
2f010 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a  ist->nSrc>=1 );.
2f020 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f    pItem = pWInfo
2f030 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20  ->pTabList->a;. 
2f040 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70   pTab = pItem->p
2f050 54 61 62 3b 0a 20 20 69 66 28 20 49 73 56 69 72  Tab;.  if( IsVir
2f060 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
2f070 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 74  urn 0;.  if( pIt
2f080 65 6d 2d 3e 7a 49 6e 64 65 78 20 29 20 72 65 74  em->zIndex ) ret
2f090 75 72 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d 20  urn 0;.  iCur = 
2f0a0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
2f0b0 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d    pWC = &pWInfo-
2f0c0 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20  >sWC;.  pLoop = 
2f0d0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
2f0e0 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
2f0f0 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75   = 0;.  pLoop->u
2f100 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20 30  .btree.nSkip = 0
2f110 3b 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64  ;.  pTerm = find
2f120 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
2f130 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 30 29  -1, 0, WO_EQ, 0)
2f140 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b  ;.  if( pTerm ){
2f150 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  .    pLoop->wsFl
2f160 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
2f170 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c  MN_EQ|WHERE_IPK|
2f180 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
2f190 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b    pLoop->aLTerm[
2f1a0 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
2f1b0 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
2f1c0 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  1;.    pLoop->u.
2f1d0 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
2f1e0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
2f1f0 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f  st of a rowid lo
2f200 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20  okup is 10 */.  
2f210 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20    pLoop->rRun = 
2f220 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69  33;  /* 33==sqli
2f230 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f  te3LogEst(10) */
2f240 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
2f250 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
2f260 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
2f270 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
2f280 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
2f290 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d  p->aLTermSpace==
2f2a0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b  pLoop->aLTerm );
2f2b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 41  .      assert( A
2f2c0 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e  rraySize(pLoop->
2f2d0 61 4c 54 65 72 6d 53 70 61 63 65 29 3d 3d 34 20  aLTermSpace)==4 
2f2e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
2f2f0 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e  x->onError==OE_N
2f300 6f 6e 65 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  one .       || p
2f310 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
2f320 72 65 21 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c  re!=0 .       ||
2f330 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41   pIdx->nKeyCol>A
2f340 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e  rraySize(pLoop->
2f350 61 4c 54 65 72 6d 53 70 61 63 65 29 20 0a 20 20  aLTermSpace) .  
2f360 20 20 20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a      ) continue;.
2f370 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2f380 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
2f390 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54  j++){.        pT
2f3a0 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
2f3b0 57 43 2c 20 69 43 75 72 2c 20 70 49 64 78 2d 3e  WC, iCur, pIdx->
2f3c0 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c 20  aiColumn[j], 0, 
2f3d0 57 4f 5f 45 51 2c 20 70 49 64 78 29 3b 0a 20 20  WO_EQ, pIdx);.  
2f3e0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
2f3f0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
2f400 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
2f410 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[j] = pTerm;.  
2f420 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2f430 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  j!=pIdx->nKeyCol
2f440 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2f450 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
2f460 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
2f470 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57  _EQ|WHERE_ONEROW
2f480 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a  |WHERE_INDEXED;.
2f490 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
2f4a0 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70  isCovering || (p
2f4b0 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20  Item->colUsed & 
2f4c0 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28  ~columnsInIndex(
2f4d0 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20  pIdx))==0 ){.   
2f4e0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c       pLoop->wsFl
2f4f0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58  ags |= WHERE_IDX
2f500 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20  _ONLY;.      }. 
2f510 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65       pLoop->nLTe
2f520 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c  rm = j;.      pL
2f530 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
2f540 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f   = j;.      pLoo
2f550 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
2f560 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  x = pIdx;.      
2f570 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
2f580 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  of a unique inde
2f590 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a  x lookup is 15 *
2f5a0 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72  /.      pLoop->r
2f5b0 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39  Run = 39;  /* 39
2f5c0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
2f5d0 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  15) */.      bre
2f5e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
2f5f0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
2f600 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d  gs ){.    pLoop-
2f610 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29  >nOut = (LogEst)
2f620 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  1;.    pWInfo->a
2f630 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f  [0].pWLoop = pLo
2f640 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d  op;.    pLoop->m
2f650 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73  askSelf = getMas
2f660 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
2f670 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  Set, iCur);.    
2f680 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61  pWInfo->a[0].iTa
2f690 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20  bCur = iCur;.   
2f6a0 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
2f6b0 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57   = 1;.    if( pW
2f6c0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
2f6d0 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20   pWInfo->bOBSat 
2f6e0 3d 20 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57  =  1;.    if( pW
2f6f0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2f700 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
2f710 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20  STINCT ){.      
2f720 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
2f730 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
2f740 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  CT_UNIQUE;.    }
2f750 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2f760 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  EBUG.    pLoop->
2f770 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69  cId = '0';.#endi
2f780 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  f.    return 1;.
2f790 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2f7a0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
2f7b0 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  e the beginning 
2f7c0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64  of the loop used
2f7d0 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73   for WHERE claus
2f7e0 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
2f7f0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
2f800 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
2f810 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75  o an opaque stru
2f820 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
2f830 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  ins.** informati
2f840 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72  on needed to ter
2f850 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
2f860 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c    Later, the cal
2f870 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  ling routine.** 
2f880 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71  should invoke sq
2f890 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
2f8a0 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
2f8b0 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
2f8c0 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64  nction.** in ord
2f8d0 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  er to complete t
2f8e0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2f8f0 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
2f900 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
2f910 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69  curs, this routi
2f920 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e  ne returns NULL.
2f930 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63  .**.** The basic
2f940 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61   idea is to do a
2f950 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e   nested loop, on
2f960 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20  e loop for each 
2f970 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20  table in.** the 
2f980 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
2f990 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52   select.  (INSER
2f9a0 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61  T and UPDATE sta
2f9b0 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a  tements are the.
2f9c0 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c  ** same as a SEL
2f9d0 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20  ECT with only a 
2f9e0 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
2f9f0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
2fa00 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  )  For.** exampl
2fa10 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73  e, if the SQL is
2fa20 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
2fa30 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2fa40 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52   t1, t2, t3 WHER
2fa50 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  E ...;.**.** The
2fa60 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  n the code gener
2fa70 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75  ated is conceptu
2fa80 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f  ally like the fo
2fa90 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2faa0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
2fab0 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20   in t1 do       
2fac0 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
2fad0 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f  ted.**        fo
2fae0 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
2faf0 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20   do      |-- by 
2fb00 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2fb10 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  n().**          
2fb20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20  foreach row3 in 
2fb30 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20  t3 do   /.**    
2fb40 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
2fb50 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
2fb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb70 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
2fb80 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e  ted.**        en
2fb90 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
2fba0 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20           |-- by 
2fbb0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
2fbc0 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20  ).**      end   
2fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fbe0 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f        /.**.** No
2fbf0 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70  te that the loop
2fc00 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e  s might not be n
2fc10 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ested in the ord
2fc20 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79  er in which they
2fc30 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68  .** appear in th
2fc40 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66  e FROM clause if
2fc50 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64   a different ord
2fc60 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62 6c  er is better abl
2fc70 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65  e to make.** use
2fc80 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f   of indices.  No
2fc90 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65  te also that whe
2fca0 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  n the IN operato
2fcb0 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20  r appears in.** 
2fcc0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2fcd0 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c  , it might resul
2fce0 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  t in additional 
2fcf0 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72  nested loops for
2fd00 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  .** scanning thr
2fd10 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20  ough all values 
2fd20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
2fd30 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  d side of the IN
2fd40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
2fd50 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20  e Btree cursors 
2fd60 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2fd70 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20  each table.  t1 
2fd80 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e  uses cursor.** n
2fd90 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e  umber pTabList->
2fda0 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74  a[0].iCursor.  t
2fdb0 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f  2 uses the curso
2fdc0 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d  r pTabList->a[1]
2fdd0 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64  .iCursor..** And
2fde0 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73   so forth.  This
2fdf0 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
2fe00 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20  es code to open 
2fe10 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f  those VDBE curso
2fe20 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  rs.** and sqlite
2fe30 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65  3WhereEnd() gene
2fe40 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  rates the code t
2fe50 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a  o close them..**
2fe60 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61  .** The code tha
2fe70 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  t sqlite3WhereBe
2fe80 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20  gin() generates 
2fe90 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f  leaves the curso
2fea0 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70  rs named.** in p
2feb0 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67  TabList pointing
2fec0 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70   at their approp
2fed0 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20  riate entries.  
2fee0 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a  The [...] code.*
2fef0 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c  * can use OP_Col
2ff00 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64  umn and OP_Rowid
2ff10 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73   opcodes on thes
2ff20 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74  e cursors to ext
2ff30 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f  ract.** data fro
2ff40 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61  m the various ta
2ff50 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  bles of the loop
2ff60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57  ..**.** If the W
2ff70 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65  HERE clause is e
2ff80 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63  mpty, the foreac
2ff90 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63  h loops must eac
2ffa0 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20  h scan their.** 
2ffb0 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20  entire tables.  
2ffc0 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79  Thus a three-way
2ffd0 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e   join is an O(N^
2ffe0 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  3) operation.  B
2fff0 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  ut if.** the tab
30000 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73  les have indices
30010 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74   and there are t
30020 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
30030 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a  E clause that.**
30040 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20   refer to those 
30050 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c  indices, a compl
30060 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63  ete table scan c
30070 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e  an be avoided an
30080 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69  d the.** code wi
30090 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74  ll run much fast
300a0 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65  er.  Most of the
300b0 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f   work of this ro
300c0 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e  utine is checkin
300d0 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74  g.** to see if t
300e0 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73  here are indices
300f0 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
30100 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68  d to speed up th
30110 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65  e loop..**.** Te
30120 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
30130 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f   clause are also
30140 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77   used to limit w
30150 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c  hich rows actual
30160 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f  ly.** make it to
30170 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68   the "..." in th
30180 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20  e middle of the 
30190 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63  loop.  After eac
301a0 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20  h "foreach",.** 
301b0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
301c0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75  RE clause that u
301d0 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e  se only terms in
301e0 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f   that loop and o
301f0 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72  uter.** loops ar
30200 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  e evaluated and 
30210 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20  if false a jump 
30220 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61  is made around a
30230 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  ll subsequent.**
30240 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72   inner loops (or
30250 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e   around the "...
30260 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63  " if the test oc
30270 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
30280 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c  inner-.** most l
30290 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52  oop).**.** OUTER
302a0 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20   JOINS.**.** An 
302b0 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61  outer join of ta
302c0 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69  bles t1 and t2 i
302d0 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f  s conceptally co
302e0 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ded as follows:.
302f0 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68  **.**    foreach
30300 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a   row1 in t1 do.*
30310 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a  *      flag = 0.
30320 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
30330 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a  row2 in t2 do.**
30340 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a          start:.*
30350 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a  *          ....*
30360 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  *          flag 
30370 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a  = 1.**      end.
30380 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d  **      if flag=
30390 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  =0 then.**      
303a0 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20    move the row2 
303b0 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c  cursor to a null
303c0 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67   row.**        g
303d0 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20  oto start.**    
303e0 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a    fi.**    end.*
303f0 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c  *.** ORDER BY CL
30400 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a  AUSE PROCESSING.
30410 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69  **.** pOrderBy i
30420 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
30430 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
30440 73 65 20 28 6f 72 20 74 68 65 20 47 52 4f 55 50  se (or the GROUP
30450 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66   BY clause.** if
30460 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50   the WHERE_GROUP
30470 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  BY flag is set i
30480 6e 20 77 63 74 72 6c 46 6c 61 67 73 29 20 6f 66  n wctrlFlags) of
30490 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
304a0 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ent.** if there 
304b0 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72  is one.  If ther
304c0 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
304d0 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68   clause or if th
304e0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
304f0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20   called from an 
30500 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
30510 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
30520 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c   pOrderBy is NUL
30530 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 49 64  L..**.** The iId
30540 78 43 75 72 20 70 61 72 61 6d 65 74 65 72 20 69  xCur parameter i
30550 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  s the cursor num
30560 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e  ber of an index.
30570 20 20 49 66 20 0a 2a 2a 20 57 48 45 52 45 5f 4f    If .** WHERE_O
30580 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20  NETABLE_ONLY is 
30590 73 65 74 2c 20 69 49 64 78 43 75 72 20 69 73 20  set, iIdxCur is 
305a0 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
305b0 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  r of an index.**
305c0 20 74 6f 20 75 73 65 20 66 6f 72 20 4f 52 20 63   to use for OR c
305d0 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
305e0 2e 20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  .  The WHERE cla
305f0 75 73 65 20 73 68 6f 75 6c 64 20 75 73 65 20 74  use should use t
30600 68 69 73 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  his.** specific 
30610 63 75 72 73 6f 72 2e 20 20 49 66 20 57 48 45 52  cursor.  If WHER
30620 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
30630 44 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 69  D is set, then i
30640 49 64 78 43 75 72 20 69 73 0a 2a 2a 20 74 68 65  IdxCur is.** the
30650 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 69 6e   first cursor in
30660 20 61 6e 20 61 72 72 61 79 20 6f 66 20 63 75 72   an array of cur
30670 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64  sors for all ind
30680 69 63 65 73 2e 20 20 69 49 64 78 43 75 72 20 73  ices.  iIdxCur s
30690 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73 65 64  hould.** be used
306a0 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
306b0 61 70 70 72 6f 70 72 69 61 74 65 20 63 75 72 73  appropriate curs
306c0 6f 72 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  or depending on 
306d0 77 68 69 63 68 20 69 6e 64 65 78 20 69 73 0a 2a  which index is.*
306e0 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65 72 65  * used..*/.Where
306f0 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65  Info *sqlite3Whe
30700 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65  reBegin(.  Parse
30710 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
30720 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
30730 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
30740 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
30750 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
30760 3a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  : A list of all 
30770 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61  tables to be sca
30780 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nned */.  Expr *
30790 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
307a0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
307b0 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
307c0 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
307d0 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  * An ORDER BY cl
307e0 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ause, or NULL */
307f0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52 65  .  ExprList *pRe
30800 73 75 6c 74 53 65 74 2c 20 2f 2a 20 52 65 73 75  sultSet, /* Resu
30810 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 71 75  lt set of the qu
30820 65 72 79 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  ery */.  u16 wct
30830 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
30840 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
30850 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e  RE_* flags defin
30860 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
30870 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  h */.  int iIdxC
30880 75 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur           /* 
30890 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  If WHERE_ONETABL
308a0 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69  E_ONLY is set, i
308b0 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62  ndex cursor numb
308c0 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  er */.){.  int n
308d0 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20  ByteWInfo;      
308e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79        /* Num. by
308f0 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
30900 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  r WhereInfo stru
30910 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62  ct */.  int nTab
30920 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
30930 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
30940 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62  elements in pTab
30950 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49  List */.  WhereI
30960 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
30970 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63       /* Will bec
30980 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76  ome the return v
30990 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
309a0 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20  ction */.  Vdbe 
309b0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
309c0 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72  be;   /* The vir
309d0 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
309e0 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73  gine */.  Bitmas
309f0 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20  k notReady;     
30a00 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20       /* Cursors 
30a10 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74  that are not yet
30a20 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20   positioned */. 
30a30 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
30a40 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54  r sWLB;     /* T
30a50 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69  he WhereLoop bui
30a60 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d  lder */.  WhereM
30a70 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
30a80 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72  ;    /* The expr
30a90 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20  ession mask set 
30aa0 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
30ab0 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20  *pLevel;        
30ac0 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65  /* A single leve
30ad0 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  l in pWInfo->a[]
30ae0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
30af0 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
30b00 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
30b10 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f   single WhereLoo
30b20 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  p object */.  in
30b30 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
30b40 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
30b50 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71   counter */.  sq
30b60 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
30b70 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
30b80 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
30b90 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
30ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30bb0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
30bc0 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c  /...  /* Variabl
30bd0 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
30be0 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
30bf0 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28  e->db;.  memset(
30c00 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66  &sWLB, 0, sizeof
30c10 28 73 57 4c 42 29 29 3b 0a 20 20 73 57 4c 42 2e  (sWLB));.  sWLB.
30c20 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
30c30 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62  rBy;..  /* Disab
30c40 6c 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  le the DISTINCT 
30c50 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20  optimization if 
30c60 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f  SQLITE_DistinctO
30c70 70 74 20 69 73 20 73 65 74 20 76 69 61 0a 20 20  pt is set via.  
30c80 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  ** sqlite3_test_
30c90 63 74 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  ctrl(SQLITE_TEST
30ca0 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
30cb0 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28  NS,...) */.  if(
30cc0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
30cd0 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
30ce0 5f 44 69 73 74 69 6e 63 74 4f 70 74 29 20 29 7b  _DistinctOpt) ){
30cf0 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20  .    wctrlFlags 
30d00 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44  &= ~WHERE_WANT_D
30d10 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20  ISTINCT;.  }..  
30d20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
30d30 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
30d40 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
30d50 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  mited by the num
30d60 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73  ber of.  ** bits
30d70 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20   in a Bitmask . 
30d80 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
30d90 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
30da0 42 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61  BMS );.  if( pTa
30db0 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20  bList->nSrc>BMS 
30dc0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
30dd0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
30de0 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65  at most %d table
30df0 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d  s in a join", BM
30e00 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  S);.    return 0
30e10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
30e20 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c   function normal
30e30 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e  ly generates a n
30e40 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61  ested loop for a
30e50 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20  ll tables in .  
30e60 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75  ** pTabList.  Bu
30e70 74 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f  t if the WHERE_O
30e80 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61  NETABLE_ONLY fla
30e90 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77  g is set, then w
30ea0 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e  e should.  ** on
30eb0 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  ly generate code
30ec0 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
30ed0 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74  able in pTabList
30ee0 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74   and assume that
30ef0 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72  .  ** any cursor
30f00 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
30f10 68 20 73 75 62 73 65 71 75 65 6e 74 20 74 61 62  h subsequent tab
30f20 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61  les are uninitia
30f30 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54  lized..  */.  nT
30f40 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46  abList = (wctrlF
30f50 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
30f60 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20  TABLE_ONLY) ? 1 
30f70 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  : pTabList->nSrc
30f80 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
30f90 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
30fa0 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74  the WhereInfo st
30fb0 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c  ructure that wil
30fc0 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a  l become the.  *
30fd0 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20  * return value. 
30fe0 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74  A single allocat
30ff0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73  ion is used to s
31000 74 6f 72 65 20 74 68 65 20 57 68 65 72 65 49 6e  tore the WhereIn
31010 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20  fo.  ** struct, 
31020 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
31030 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74  WhereInfo.a[], t
31040 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
31050 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e  tructure.  ** an
31060 64 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53  d the WhereMaskS
31070 65 74 20 73 74 72 75 63 74 75 72 65 2e 20 53 69  et structure. Si
31080 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  nce WhereClause 
31090 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79  contains an 8-by
310a0 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74  te.  ** field (t
310b0 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20  ype Bitmask) it 
310c0 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20  must be aligned 
310d0 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75  on an 8-byte bou
310e0 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f  ndary on.  ** so
310f0 6d 65 20 61 72 63 68 69 74 65 63 74 75 72 65 73  me architectures
31100 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e  . Hence the ROUN
31110 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f  D8() below..  */
31120 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20  .  nByteWInfo = 
31130 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68  ROUND8(sizeof(Wh
31140 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69  ereInfo)+(nTabLi
31150 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65  st-1)*sizeof(Whe
31160 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49  reLevel));.  pWI
31170 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
31180 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
31190 79 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f  yteWInfo + sizeo
311a0 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20  f(WhereLoop));. 
311b0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
311c0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
311d0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
311e0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e  WInfo);.    pWIn
311f0 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  fo = 0;.    goto
31200 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
31210 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
31220 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20  aiCurOnePass[0] 
31230 3d 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f  = pWInfo->aiCurO
31240 6e 65 50 61 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a  nePass[1] = -1;.
31250 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c    pWInfo->nLevel
31260 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70   = nTabList;.  p
31270 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20  WInfo->pParse = 
31280 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f  pParse;.  pWInfo
31290 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61  ->pTabList = pTa
312a0 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  bList;.  pWInfo-
312b0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
312c0 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  erBy;.  pWInfo->
312d0 70 52 65 73 75 6c 74 53 65 74 20 3d 20 70 52 65  pResultSet = pRe
312e0 73 75 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e 66  sultSet;.  pWInf
312f0 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69  o->iBreak = sqli
31300 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
31310 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77  (v);.  pWInfo->w
31320 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72  ctrlFlags = wctr
31330 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f  lFlags;.  pWInfo
31340 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
31350 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
31360 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53  ryLoop;.  pMaskS
31370 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d  et = &pWInfo->sM
31380 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70  askSet;.  sWLB.p
31390 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a  WInfo = pWInfo;.
313a0 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57    sWLB.pWC = &pW
313b0 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c  Info->sWC;.  sWL
313c0 42 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c  B.pNew = (WhereL
313d0 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57  oop*)(((char*)pW
313e0 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f  Info)+nByteWInfo
313f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
31400 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
31410 54 28 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a  T(sWLB.pNew) );.
31420 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
31430 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64  sWLB.pNew);.#ifd
31440 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
31450 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64    sWLB.pNew->cId
31460 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a   = '*';.#endif..
31470 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57    /* Split the W
31480 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f  HERE clause into
31490 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70   separate subexp
314a0 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65  ressions where e
314b0 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72  ach.  ** subexpr
314c0 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
314d0 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70  ted by an AND op
314e0 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69  erator..  */.  i
314f0 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b  nitMaskSet(pMask
31500 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61  Set);.  whereCla
31510 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d  useInit(&pWInfo-
31520 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  >sWC, pWInfo);. 
31530 20 77 68 65 72 65 53 70 6c 69 74 28 26 70 57 49   whereSplit(&pWI
31540 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72 65  nfo->sWC, pWhere
31550 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 73 71 6c  , TK_AND);.  sql
31560 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
31570 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29  hema(pParse, -1)
31580 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20  ; /* Insert the 
31590 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20  cookie verifier 
315a0 47 6f 74 6f 20 2a 2f 0a 20 20 20 20 0a 20 20 2f  Goto */.    .  /
315b0 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
315c0 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
315d0 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  hat is constant.
315e0 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20    Evaluate the. 
315f0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61   ** expression a
31600 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f  nd either jump o
31610 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ver all of the c
31620 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75  ode or fall thru
31630 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
31640 30 3b 20 69 69 3c 73 57 4c 42 2e 70 57 43 2d 3e  0; ii<sWLB.pWC->
31650 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
31660 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d    if( nTabList==
31670 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72  0 || sqlite3Expr
31680 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
31690 6e 28 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69  n(sWLB.pWC->a[ii
316a0 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
316b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
316c0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 73 57 4c  alse(pParse, sWL
316d0 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78  B.pWC->a[ii].pEx
316e0 70 72 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  pr, pWInfo->iBre
316f0 61 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak,.            
31700 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
31710 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
31720 0a 20 20 20 20 20 20 73 57 4c 42 2e 70 57 43 2d  .      sWLB.pWC-
31730 3e 61 5b 69 69 5d 2e 77 74 46 6c 61 67 73 20 7c  >a[ii].wtFlags |
31740 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
31750 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70    }.  }..  /* Sp
31760 65 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46  ecial case: No F
31770 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  ROM clause.  */.
31780 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d    if( nTabList==
31790 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72  0 ){.    if( pOr
317a0 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e  derBy ) pWInfo->
317b0 62 4f 42 53 61 74 20 3d 20 31 3b 0a 20 20 20 20  bOBSat = 1;.    
317c0 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
317d0 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
317e0 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57  INCT ){.      pW
317f0 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
31800 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
31810 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20  _UNIQUE;.    }. 
31820 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20   }..  /* Assign 
31830 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62  a bit from the b
31840 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20  itmask to every 
31850 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d  term in the FROM
31860 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
31870 2a 2a 20 57 68 65 6e 20 61 73 73 69 67 6e 69 6e  ** When assignin
31880 67 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73  g bitmask values
31890 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   to FROM clause 
318a0 63 75 72 73 6f 72 73 2c 20 69 74 20 6d 75 73 74  cursors, it must
318b0 20 62 65 0a 20 20 2a 2a 20 74 68 65 20 63 61 73   be.  ** the cas
318c0 65 20 74 68 61 74 20 69 66 20 58 20 69 73 20 74  e that if X is t
318d0 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74  he bitmask for t
318e0 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61  he N-th FROM cla
318f0 75 73 65 20 74 65 72 6d 20 74 68 65 6e 0a 20 20  use term then.  
31900 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  ** the bitmask f
31910 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75  or all FROM clau
31920 73 65 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  se terms to the 
31930 6c 65 66 74 20 6f 66 20 74 68 65 20 4e 2d 74 68  left of the N-th
31940 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58   term.  ** is (X
31950 2d 31 29 2e 20 20 20 41 6e 20 65 78 70 72 65 73  -1).   An expres
31960 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e  sion from the ON
31970 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46   clause of a LEF
31980 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20  T JOIN can use. 
31990 20 2a 2a 20 69 74 73 20 45 78 70 72 2e 69 52 69   ** its Expr.iRi
319a0 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c  ghtJoinTable val
319b0 75 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62  ue to find the b
319c0 69 74 6d 61 73 6b 20 6f 66 20 74 68 65 20 72 69  itmask of the ri
319d0 67 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ght table.  ** o
319e0 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62  f the join.  Sub
319f0 74 72 61 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f  tracting one fro
31a00 6d 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  m the right tabl
31a10 65 20 62 69 74 6d 61 73 6b 20 67 69 76 65 73 20  e bitmask gives 
31a20 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66  a.  ** bitmask f
31a30 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  or all tables to
31a40 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65   the left of the
31a50 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20   join.  Knowing 
31a60 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a  the bitmask.  **
31a70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
31a80 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61  to the left of a
31a90 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d   left join is im
31aa0 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74  portant.  Ticket
31ab0 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a   #3015..  **.  *
31ac0 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69 74 6d  * Note that bitm
31ad0 61 73 6b 73 20 61 72 65 20 63 72 65 61 74 65 64  asks are created
31ae0 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69 73   for all pTabLis
31af0 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73 20 69  t->nSrc tables i
31b00 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c  n.  ** pTabList,
31b10 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69   not just the fi
31b20 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62  rst nTabList tab
31b30 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69  les.  nTabList i
31b40 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20  s normally.  ** 
31b50 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73  equal to pTabLis
31b60 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68  t->nSrc but migh
31b70 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74  t be shortened t
31b80 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  o 1 if the.  ** 
31b90 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
31ba0 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2e  NLY flag is set.
31bb0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
31bc0 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  ; ii<pTabList->n
31bd0 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Src; ii++){.    
31be0 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b  createMask(pMask
31bf0 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
31c00 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  [ii].iCursor);. 
31c10 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
31c20 47 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d 61 73  G.  {.    Bitmas
31c30 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b  k toTheLeft = 0;
31c40 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
31c50 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
31c60 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  ; ii++){.      B
31c70 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61  itmask m = getMa
31c80 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
31c90 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75  bList->a[ii].iCu
31ca0 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73  rsor);.      ass
31cb0 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68  ert( (m-1)==toTh
31cc0 65 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 74  eLeft );.      t
31cd0 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20  oTheLeft |= m;. 
31ce0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
31cf0 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c  .  /* Analyze al
31d00 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78 70 72  l of the subexpr
31d10 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74  essions.  Note t
31d20 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  hat exprAnalyze(
31d30 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64  ) might.  ** add
31d40 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
31d50 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ms onto the end 
31d60 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
31d70 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a  use.  We do not.
31d80 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61    ** want to ana
31d90 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72 74 75  lyze these virtu
31da0 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61  al terms, so sta
31db0 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20  rt analyzing at 
31dc0 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64  the end.  ** and
31dd0 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f   work forward so
31de0 20 74 68 61 74 20 74 68 65 20 61 64 64 65 64 20   that the added 
31df0 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72  virtual terms ar
31e00 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65  e never processe
31e10 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e  d..  */.  exprAn
31e20 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73  alyzeAll(pTabLis
31e30 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  t, &pWInfo->sWC)
31e40 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
31e50 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
31e60 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
31e70 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rror;.  }..  /* 
31e80 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  If the ORDER BY 
31e90 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c  (or GROUP BY) cl
31ea0 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 72 65  ause contains re
31eb0 66 65 72 65 6e 63 65 73 20 74 6f 20 67 65 6e 65  ferences to gene
31ec0 72 61 6c 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  ral.  ** express
31ed0 69 6f 6e 73 2c 20 74 68 65 6e 20 77 65 20 77 6f  ions, then we wo
31ee0 6e 27 74 20 62 65 20 61 62 6c 65 20 74 6f 20 73  n't be able to s
31ef0 61 74 69 73 66 79 20 69 74 20 75 73 69 6e 67 20  atisfy it using 
31f00 69 6e 64 69 63 65 73 2c 20 73 6f 0a 20 20 2a 2a  indices, so.  **
31f10 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64 69   go ahead and di
31f20 73 61 62 6c 65 20 69 74 20 6e 6f 77 2e 0a 20 20  sable it now..  
31f30 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
31f40 79 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73  y && (wctrlFlags
31f50 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
31f60 53 54 49 4e 43 54 29 21 3d 30 20 29 7b 0a 20 20  STINCT)!=0 ){.  
31f70 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
31f80 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
31f90 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70  ii++){.      Exp
31fa0 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74  r *pExpr = sqlit
31fb0 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
31fc0 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69  e(pOrderBy->a[ii
31fd0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
31fe0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
31ff0 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
32000 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64      pWInfo->pOrd
32010 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 20  erBy = pOrderBy 
32020 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 0;.        bre
32030 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ak;.      }else 
32040 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
32050 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
32060 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
32070 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
32080 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
32090 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
320a0 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 44 69   ){.    if( isDi
320b0 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28  stinctRedundant(
320c0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
320d0 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  , &pWInfo->sWC, 
320e0 70 52 65 73 75 6c 74 53 65 74 29 20 29 7b 0a 20  pResultSet) ){. 
320f0 20 20 20 20 20 2f 2a 20 54 68 65 20 44 49 53 54       /* The DIST
32100 49 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69 73 20  INCT marking is 
32110 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67 6e 6f  pointless.  Igno
32120 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20  re it. */.      
32130 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
32140 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
32150 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  CT_UNIQUE;.    }
32160 65 6c 73 65 20 69 66 28 20 70 4f 72 64 65 72 42  else if( pOrderB
32170 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  y==0 ){.      /*
32180 20 54 72 79 20 74 6f 20 4f 52 44 45 52 20 42 59   Try to ORDER BY
32190 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
321a0 74 6f 20 6d 61 6b 65 20 64 69 73 74 69 6e 63 74  to make distinct
321b0 20 70 72 6f 63 65 73 73 69 6e 67 20 65 61 73 69   processing easi
321c0 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e  er */.      pWIn
321d0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c  fo->wctrlFlags |
321e0 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
321f0 42 59 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  BY;.      pWInfo
32200 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 52 65  ->pOrderBy = pRe
32210 73 75 6c 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20  sultSet;.    }. 
32220 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75   }..  /* Constru
32230 63 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ct the WhereLoop
32240 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 48   objects */.  WH
32250 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c  ERETRACE(0xffff,
32260 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
32270 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  Start ***\n"));.
32280 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c    /* Display all
32290 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
322a0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 23 69  ERE clause */.#i
322b0 66 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54  f defined(WHERET
322c0 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 20 26 26  RACE_ENABLED) &&
322d0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
322e0 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c  ENABLE_TREE_EXPL
322f0 41 49 4e 29 0a 20 20 69 66 28 20 73 71 6c 69 74  AIN).  if( sqlit
32300 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
32310 78 31 30 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  x100 ){.    int 
32320 69 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  i;.    Vdbe *v =
32330 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
32340 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
32350 69 6e 42 65 67 69 6e 28 76 29 3b 0a 20 20 20 20  inBegin(v);.    
32360 66 6f 72 28 69 3d 30 3b 20 69 3c 73 57 4c 42 2e  for(i=0; i<sWLB.
32370 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29  pWC->nTerm; i++)
32380 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
32390 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 76 2c 20  xplainPrintf(v, 
323a0 22 23 25 2d 32 64 20 22 2c 20 69 29 3b 0a 20 20  "#%-2d ", i);.  
323b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
323c0 69 6e 50 75 73 68 28 76 29 3b 0a 20 20 20 20 20  inPush(v);.     
323d0 20 77 68 65 72 65 45 78 70 6c 61 69 6e 54 65 72   whereExplainTer
323e0 6d 28 76 2c 20 26 73 57 4c 42 2e 70 57 43 2d 3e  m(v, &sWLB.pWC->
323f0 61 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c  a[i]);.      sql
32400 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 76  ite3ExplainPop(v
32410 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
32420 45 78 70 6c 61 69 6e 4e 4c 28 76 29 3b 0a 20 20  ExplainNL(v);.  
32430 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
32440 78 70 6c 61 69 6e 46 69 6e 69 73 68 28 76 29 3b  xplainFinish(v);
32450 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
32460 67 50 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  gPrintf("%s", sq
32470 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 6e 61  lite3VdbeExplana
32480 74 69 6f 6e 28 76 29 29 3b 0a 20 20 7d 0a 23 65  tion(v));.  }.#e
32490 6e 64 69 66 0a 20 20 69 66 28 20 6e 54 61 62 4c  ndif.  if( nTabL
324a0 69 73 74 21 3d 31 20 7c 7c 20 77 68 65 72 65 53  ist!=1 || whereS
324b0 68 6f 72 74 43 75 74 28 26 73 57 4c 42 29 3d 3d  hortCut(&sWLB)==
324c0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 68  0 ){.    rc = wh
324d0 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73  ereLoopAddAll(&s
324e0 57 4c 42 29 3b 0a 20 20 20 20 69 66 28 20 72 63  WLB);.    if( rc
324f0 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
32500 69 6e 45 72 72 6f 72 3b 0a 20 20 0a 20 20 20 20  inError;.  .    
32510 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f  /* Display all o
32520 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
32530 6f 62 6a 65 63 74 73 20 69 66 20 77 68 65 72 65  objects if where
32540 74 72 61 63 65 20 69 73 20 65 6e 61 62 6c 65 64  trace is enabled
32550 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45   */.#ifdef WHERE
32560 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
32570 20 21 3d 30 20 2a 2f 0a 20 20 20 20 69 66 28 20   !=0 */.    if( 
32580 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
32590 65 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  e ){.      Where
325a0 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20 20 69  Loop *p;.      i
325b0 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 74 61 74  nt i;.      stat
325c0 69 63 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d  ic char zLabel[]
325d0 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62   = "0123456789ab
325e0 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
325f0 73 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20  stuvwyxz".      
32600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32620 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
32630 4f 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20  OPQRSTUVWYXZ";. 
32640 20 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66       for(p=pWInf
32650 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20  o->pLoops, i=0; 
32660 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f  p; p=p->pNextLoo
32670 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p, i++){.       
32680 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c   p->cId = zLabel
32690 5b 69 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c  [i%sizeof(zLabel
326a0 29 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  )];.        wher
326b0 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 73 57  eLoopPrint(p, sW
326c0 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d  LB.pWC);.      }
326d0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
326e0 0a 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f  .    wherePathSo
326f0 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b  lver(pWInfo, 0);
32700 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
32710 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
32720 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
32730 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
32740 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
32750 20 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f       wherePathSo
32760 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49  lver(pWInfo, pWI
32770 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b  nfo->nRowOut+1);
32780 0a 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  .       if( db->
32790 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
327a0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
327b0 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
327c0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
327d0 64 65 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d  derBy==0 && (db-
327e0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
327f0 52 65 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30  ReverseOrder)!=0
32800 20 29 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d   ){.     pWInfo-
32810 3e 72 65 76 4d 61 73 6b 20 3d 20 28 42 69 74 6d  >revMask = (Bitm
32820 61 73 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a 20 20  ask)(-1);.  }.  
32830 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
32840 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61   || NEVER(db->ma
32850 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20  llocFailed) ){. 
32860 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
32870 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66  inError;.  }.#if
32880 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
32890 4e 41 42 4c 45 44 20 2f 2a 20 21 3d 30 20 2a 2f  NABLED /* !=0 */
328a0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
328b0 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ereTrace ){.    
328c0 69 6e 74 20 69 69 3b 0a 20 20 20 20 73 71 6c 69  int ii;.    sqli
328d0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
328e0 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e 52  ---- Solution nR
328f0 6f 77 3d 25 64 22 2c 20 70 57 49 6e 66 6f 2d 3e  ow=%d", pWInfo->
32900 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20 69 66  nRowOut);.    if
32910 28 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74  ( pWInfo->bOBSat
32920 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
32930 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 4f  3DebugPrintf(" O
32940 52 44 45 52 42 59 3d 30 78 25 6c 6c 78 22 2c 20  RDERBY=0x%llx", 
32950 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29  pWInfo->revMask)
32960 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74  ;.    }.    swit
32970 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73  ch( pWInfo->eDis
32980 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63  tinct ){.      c
32990 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
329a0 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20  CT_UNIQUE: {.   
329b0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
329c0 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49  gPrintf("  DISTI
329d0 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20  NCT=unique");.  
329e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
329f0 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
32a00 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
32a10 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
32a20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
32a30 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
32a40 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20  =ordered");.    
32a50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
32a60 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48   }.      case WH
32a70 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
32a80 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
32a90 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
32aa0 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
32ab0 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20  =unordered");.  
32ac0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32ad0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
32ae0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
32af0 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72  f("\n");.    for
32b00 28 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f  (ii=0; ii<pWInfo
32b10 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b  ->nLevel; ii++){
32b20 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
32b30 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b  Print(pWInfo->a[
32b40 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42  ii].pWLoop, sWLB
32b50 2e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  .pWC);.    }.  }
32b60 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74  .#endif.  /* Att
32b70 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62  empt to omit tab
32b80 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69  les from the joi
32b90 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 65 66  n that do not ef
32ba0 66 65 63 74 20 74 68 65 20 72 65 73 75 6c 74 20  fect the result 
32bb0 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  */.  if( pWInfo-
32bc0 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26  >nLevel>=2.   &&
32bd0 20 70 52 65 73 75 6c 74 53 65 74 21 3d 30 0a 20   pResultSet!=0. 
32be0 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
32bf0 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
32c00 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e  ITE_OmitNoopJoin
32c10 29 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  ).  ){.    Bitma
32c20 73 6b 20 74 61 62 55 73 65 64 20 3d 20 65 78 70  sk tabUsed = exp
32c30 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
32c40 70 4d 61 73 6b 53 65 74 2c 20 70 52 65 73 75 6c  pMaskSet, pResul
32c50 74 53 65 74 29 3b 0a 20 20 20 20 69 66 28 20 73  tSet);.    if( s
32c60 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 29 20 74  WLB.pOrderBy ) t
32c70 61 62 55 73 65 64 20 7c 3d 20 65 78 70 72 4c 69  abUsed |= exprLi
32c80 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
32c90 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f 72 64  skSet, sWLB.pOrd
32ca0 65 72 42 79 29 3b 0a 20 20 20 20 77 68 69 6c 65  erBy);.    while
32cb0 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
32cc0 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 57 68 65  >=2 ){.      Whe
32cd0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a  reTerm *pTerm, *
32ce0 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 4c 6f 6f  pEnd;.      pLoo
32cf0 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 70 57  p = pWInfo->a[pW
32d00 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 2e  Info->nLevel-1].
32d10 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69 66  pWLoop;.      if
32d20 28 20 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  ( (pWInfo->pTabL
32d30 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54  ist->a[pLoop->iT
32d40 61 62 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ab].jointype & J
32d50 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62 72 65  T_LEFT)==0 ) bre
32d60 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77  ak;.      if( (w
32d70 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
32d80 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29  E_WANT_DISTINCT)
32d90 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70  ==0.       && (p
32da0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
32db0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30  WHERE_ONEROW)==0
32dc0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
32dd0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
32de0 0a 20 20 20 20 20 20 69 66 28 20 28 74 61 62 55  .      if( (tabU
32df0 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  sed & pLoop->mas
32e00 6b 53 65 6c 66 29 21 3d 30 20 29 20 62 72 65 61  kSelf)!=0 ) brea
32e10 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  k;.      pEnd = 
32e20 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73 57  sWLB.pWC->a + sW
32e30 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20  LB.pWC->nTerm;. 
32e40 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73       for(pTerm=s
32e50 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72  WLB.pWC->a; pTer
32e60 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  m<pEnd; pTerm++)
32e70 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
32e80 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
32e90 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
32ea0 66 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26  f)!=0.         &
32eb0 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
32ec0 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
32ed0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
32ee0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
32ef0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
32f00 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
32f10 20 20 69 66 28 20 70 54 65 72 6d 3c 70 45 6e 64    if( pTerm<pEnd
32f20 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
32f30 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
32f40 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f  f, ("-> drop loo
32f50 70 20 25 63 20 6e 6f 74 20 75 73 65 64 5c 6e 22  p %c not used\n"
32f60 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a  , pLoop->cId));.
32f70 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c        pWInfo->nL
32f80 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e 54  evel--;.      nT
32f90 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a  abList--;.    }.
32fa0 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45    }.  WHERETRACE
32fb0 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70  (0xffff,("*** Op
32fc0 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64  timizer Finished
32fd0 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49   ***\n"));.  pWI
32fe0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75  nfo->pParse->nQu
32ff0 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66  eryLoop += pWInf
33000 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f  o->nRowOut;..  /
33010 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
33020 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  is an UPDATE or 
33030 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
33040 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73 74   that is request
33050 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20  ing.  ** to use 
33060 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  a one-pass algor
33070 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20  ithm, determine 
33080 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72 6f  if this is appro
33090 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65  priate..  ** The
330a0 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69   one-pass algori
330b0 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69  thm only works i
330c0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
330d0 73 65 20 63 6f 6e 73 74 72 61 69 6e 73 0a 20 20  se constrains.  
330e0 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
330f0 20 74 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e   to update a sin
33100 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20  gle row..  */.  
33110 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c  assert( (wctrlFl
33120 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
33130 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
33140 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  || pWInfo->nLeve
33150 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77  l==1 );.  if( (w
33160 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
33170 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
33180 44 29 21 3d 30 20 0a 20 20 20 26 26 20 28 70 57  D)!=0 .   && (pW
33190 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
331a0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
331b0 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 20 29 7b  RE_ONEROW)!=0 ){
331c0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  .    pWInfo->okO
331d0 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20 20 20 20  nePass = 1;.    
331e0 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
331f0 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62  bList->a[0].pTab
33200 29 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  ) ){.      pWInf
33210 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e  o->a[0].pWLoop->
33220 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52  wsFlags &= ~WHER
33230 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20  E_IDX_ONLY;.    
33240 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  }.  }..  /* Open
33250 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74   all tables in t
33260 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20  he pTabList and 
33270 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65  any indices sele
33280 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65  cted for.  ** se
33290 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61  arching those ta
332a0 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74  bles..  */.  not
332b0 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
332c0 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 2c  k)0;.  for(ii=0,
332d0 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
332e0 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20  a; ii<nTabList; 
332f0 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b  ii++, pLevel++){
33300 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
33310 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74  ;     /* Table t
33320 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  o open */.    in
33330 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
33340 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62  * Index of datab
33350 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
33360 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20  able/index */.  
33370 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
33380 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b  _item *pTabItem;
33390 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d  ..    pTabItem =
333a0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
333b0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
333c0 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65    pTab = pTabIte
333d0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62  m->pTab;.    iDb
333e0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
333f0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
33400 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
33410 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
33420 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20  pWLoop;.    if( 
33430 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
33440 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21  & TF_Ephemeral)!
33450 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c  =0 || pTab->pSel
33460 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ect ){.      /* 
33470 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20  Do nothing */.  
33480 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20    }else.#ifndef 
33490 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
334a0 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
334b0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
334c0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
334d0 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20  TABLE)!=0 ){.   
334e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
334f0 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68  VTab = (const ch
33500 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56  ar *)sqlite3GetV
33510 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b  Table(db, pTab);
33520 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20  .      int iCur 
33530 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
33540 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sor;.      sqlit
33550 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
33560 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20  OP_VOpen, iCur, 
33570 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34 5f  0, 0, pVTab, P4_
33580 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65  VTAB);.    }else
33590 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
335a0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Tab) ){.      /*
335b0 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c   noop */.    }el
335c0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
335d0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
335e0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
335f0 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  LY)==0.         
33600 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
33610 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e   WHERE_OMIT_OPEN
33620 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a 20 20  _CLOSE)==0 ){.  
33630 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f      int op = OP_
33640 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20  OpenRead;.      
33650 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  if( pWInfo->okOn
33660 65 50 61 73 73 20 29 7b 0a 20 20 20 20 20 20 20  ePass ){.       
33670 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69   op = OP_OpenWri
33680 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e  te;.        pWIn
33690 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
336a0 5b 30 5d 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  [0] = pTabItem->
336b0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 7d  iCursor;.      }
336c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
336d0 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
336e0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
336f0 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f  or, iDb, pTab, o
33700 70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  p);.      assert
33710 28 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  ( pTabItem->iCur
33720 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69 54 61  sor==pLevel->iTa
33730 62 43 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65  bCur );.      te
33740 73 74 63 61 73 65 28 20 21 70 57 49 6e 66 6f 2d  stcase( !pWInfo-
33750 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54  >okOnePass && pT
33760 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  ab->nCol==BMS-1 
33770 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
33780 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  e( !pWInfo->okOn
33790 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e  ePass && pTab->n
337a0 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
337b0 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f    if( !pWInfo->o
337c0 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62  kOnePass && pTab
337d0 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26 20 48 61  ->nCol<BMS && Ha
337e0 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
337f0 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
33800 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f  b = pTabItem->co
33810 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69  lUsed;.        i
33820 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt n = 0;.      
33830 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e    for(; b; b=b>>
33840 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  1, n++){}.      
33850 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
33860 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33  ngeP4(v, sqlite3
33870 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
33880 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20  v)-1, .         
33890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
338a0 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f     SQLITE_INT_TO
338b0 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33  _PTR(n), P4_INT3
338c0 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  2);.        asse
338d0 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f  rt( n<=pTab->nCo
338e0 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l );.      }.   
338f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
33900 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
33910 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
33920 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
33930 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
33940 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
33950 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
33960 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49  DEXED ){.      I
33970 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f  ndex *pIx = pLoo
33980 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
33990 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 6e  x;.      int iIn
339a0 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 69 6e  dexCur;.      in
339b0 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65  t op = OP_OpenRe
339c0 61 64 3b 0a 20 20 20 20 20 20 2f 2a 20 69 49 64  ad;.      /* iId
339d0 78 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 73  xCur is always s
339e0 65 74 20 69 66 20 74 6f 20 61 20 70 6f 73 69 74  et if to a posit
339f0 69 76 65 20 76 61 6c 75 65 20 69 66 20 4f 4e 45  ive value if ONE
33a00 50 41 53 53 20 69 73 20 70 6f 73 73 69 62 6c 65  PASS is possible
33a10 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
33a20 28 20 69 49 64 78 43 75 72 21 3d 30 20 7c 7c 20  ( iIdxCur!=0 || 
33a30 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
33a40 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
33a50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
33a60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
33a70 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 29  nfo->okOnePass )
33a80 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  {.        Index 
33a90 2a 70 4a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  *pJ = pTabItem->
33aa0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
33ab0 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20        iIndexCur 
33ac0 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  = iIdxCur;.     
33ad0 20 20 20 61 73 73 65 72 74 28 20 77 63 74 72 6c     assert( wctrl
33ae0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
33af0 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 29 3b  EPASS_DESIRED );
33b00 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
33b10 41 4c 57 41 59 53 28 70 4a 29 20 26 26 20 70 4a  ALWAYS(pJ) && pJ
33b20 21 3d 70 49 78 20 29 7b 0a 20 20 20 20 20 20 20  !=pIx ){.       
33b30 20 20 20 69 49 6e 64 65 78 43 75 72 2b 2b 3b 0a     iIndexCur++;.
33b40 20 20 20 20 20 20 20 20 20 20 70 4a 20 3d 20 70            pJ = p
33b50 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  J->pNext;.      
33b60 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 70 20 3d    }.        op =
33b70 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20   OP_OpenWrite;. 
33b80 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61         pWInfo->a
33b90 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d  iCurOnePass[1] =
33ba0 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20   iIndexCur;.    
33bb0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 49 64 78    }else if( iIdx
33bc0 43 75 72 20 26 26 20 28 77 63 74 72 6c 46 6c 61  Cur && (wctrlFla
33bd0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41  gs & WHERE_ONETA
33be0 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a  BLE_ONLY)!=0 ){.
33bf0 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
33c00 72 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20  r = iIdxCur;.   
33c10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33c20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 50    iIndexCur = pP
33c30 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
33c40 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76      }.      pLev
33c50 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49  el->iIdxCur = iI
33c60 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 61  ndexCur;.      a
33c70 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68  ssert( pIx->pSch
33c80 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
33c90 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ma );.      asse
33ca0 72 74 28 20 69 49 6e 64 65 78 43 75 72 3e 3d 30  rt( iIndexCur>=0
33cb0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
33cc0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
33cd0 70 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49  p, iIndexCur, pI
33ce0 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
33cf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33d00 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
33d10 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20  rse, pIx);.     
33d20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
33d30 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d   "%s", pIx->zNam
33d40 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  e));.    }.    s
33d50 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
33d60 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
33d70 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64  Db);.    notRead
33d80 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26 70  y &= ~getMask(&p
33d90 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
33da0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
33db0 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  or);.  }.  pWInf
33dc0 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65  o->iTop = sqlite
33dd0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
33de0 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  (v);.  if( db->m
33df0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
33e00 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
33e10 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  or;..  /* Genera
33e20 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64  te the code to d
33e30 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20 45  o the search.  E
33e40 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ach iteration of
33e50 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f   the for.  ** lo
33e60 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74  op below generat
33e70 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69  es code for a si
33e80 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70  ngle nested loop
33e90 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20   of the VM.  ** 
33ea0 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20  program..  */.  
33eb0 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74  notReady = ~(Bit
33ec0 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69  mask)0;.  for(ii
33ed0 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b  =0; ii<nTabList;
33ee0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65 76   ii++){.    pLev
33ef0 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
33f00 69 69 5d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ii];.#ifndef SQL
33f10 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
33f20 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28  IC_INDEX.    if(
33f30 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70   (pLevel->pWLoop
33f40 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
33f50 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
33f60 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72   ){.      constr
33f70 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  uctAutomaticInde
33f80 78 28 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66  x(pParse, &pWInf
33f90 6f 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20 20 20  o->sWC,.        
33fa0 20 20 20 20 20 20 20 20 26 70 54 61 62 4c 69 73          &pTabLis
33fb0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
33fc0 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  om], notReady, p
33fd0 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66  Level);.      if
33fe0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
33ff0 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
34000 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d  eginError;.    }
34010 0a 23 65 6e 64 69 66 0a 20 20 20 20 65 78 70 6c  .#endif.    expl
34020 61 69 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72 73  ainOneScan(pPars
34030 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65  e, pTabList, pLe
34040 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d  vel, ii, pLevel-
34050 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61  >iFrom, wctrlFla
34060 67 73 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  gs);.    pLevel-
34070 3e 61 64 64 72 42 6f 64 79 20 3d 20 73 71 6c 69  >addrBody = sqli
34080 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
34090 64 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65  dr(v);.    notRe
340a0 61 64 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f  ady = codeOneLoo
340b0 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69  pStart(pWInfo, i
340c0 69 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20  i, notReady);.  
340d0 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69    pWInfo->iConti
340e0 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  nue = pLevel->ad
340f0 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f  drCont;.  }..  /
34100 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64 62  * Done. */.  Vdb
34110 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
34120 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52 45 2d  v, "Begin WHERE-
34130 63 6f 72 65 22 29 29 3b 0a 20 20 72 65 74 75 72  core"));.  retur
34140 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20  n pWInfo;..  /* 
34150 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c  Jump here if mal
34160 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65  loc fails */.whe
34170 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20  reBeginError:.  
34180 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20  if( pWInfo ){.  
34190 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
341a0 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
341b0 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
341c0 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65      whereInfoFre
341d0 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
341e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
341f0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
34200 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
34210 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65  WHERE loop.  See
34220 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a   comments on .**
34230 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
34240 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  in() for additio
34250 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
34260 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
34270 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e  WhereEnd(WhereIn
34280 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50  fo *pWInfo){.  P
34290 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
342a0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
342b0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
342c0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
342d0 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  i;.  WhereLevel 
342e0 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65  *pLevel;.  Where
342f0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53  Loop *pLoop;.  S
34300 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
34310 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
34320 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist;.  sqlite3 *
34330 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
34340 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
34350 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e  loop termination
34360 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64   code..  */.  Vd
34370 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
34380 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 63  (v, "End WHERE-c
34390 6f 72 65 22 29 29 3b 0a 20 20 73 71 6c 69 74 65  ore"));.  sqlite
343a0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
343b0 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69  pParse);.  for(i
343c0 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  =pWInfo->nLevel-
343d0 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
343e0 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
343f0 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
34400 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f  o->a[i];.    pLo
34410 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
34420 6f 6f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  oop;.    sqlite3
34430 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
34440 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
34450 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  Cont);.    if( p
34460 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f  Level->op!=OP_No
34470 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  op ){.      sqli
34480 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
34490 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65   pLevel->op, pLe
344a0 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d  vel->p1, pLevel-
344b0 3e 70 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  >p2);.      sqli
344c0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
344d0 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a  v, pLevel->p5);.
344e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
344f0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
34500 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20  HERE_IN_ABLE && 
34510 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
34520 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  >0 ){.      stru
34530 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a  ct InLoop *pIn;.
34540 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
34550 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
34560 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
34570 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a  evel->addrNxt);.
34580 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76        for(j=pLev
34590 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49  el->u.in.nIn, pI
345a0 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  n=&pLevel->u.in.
345b0 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e  aInLoop[j-1]; j>
345c0 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a  0; j--, pIn--){.
345d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
345e0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
345f0 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29  In->addrInTop+1)
34600 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
34610 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70  3VdbeAddOp2(v, p
34620 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20  In->eEndLoopOp, 
34630 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e  pIn->iCur, pIn->
34640 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20  addrInTop);.    
34650 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
34660 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e  umpHere(v, pIn->
34670 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20  addrInTop-1);.  
34680 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
34690 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
346a0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
346b0 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  op);.    }.    s
346c0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
346d0 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
346e0 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
346f0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  if( pLevel->addr
34700 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Skip ){.      sq
34710 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
34720 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
34730 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29  Level->addrSkip)
34740 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
34750 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 73 6b  ent((v, "next sk
34760 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20  ip-scan on %s", 
34770 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
34780 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Index->zName));.
34790 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
347a0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65  eJumpHere(v, pLe
347b0 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a  vel->addrSkip);.
347c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
347d0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65  eJumpHere(v, pLe
347e0 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29  vel->addrSkip-2)
347f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
34800 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
34810 6e 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 20  n ){.      addr 
34820 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
34830 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
34840 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
34850 69 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  in);.      asser
34860 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
34870 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
34880 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  NLY)==0.        
34890 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73     || (pLoop->ws
348a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
348b0 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20  DEXED)!=0 );.   
348c0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
348d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
348e0 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  DX_ONLY)==0 ){. 
348f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
34900 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
34910 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74  ullRow, pTabList
34920 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b  ->a[i].iCursor);
34930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
34940 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
34950 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
34960 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D ){.        sql
34970 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
34980 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c  , OP_NullRow, pL
34990 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a  evel->iIdxCur);.
349a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
349b0 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50  ( pLevel->op==OP
349c0 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20  _Return ){.     
349d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
349e0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
349f0 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
34a00 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29  evel->addrFirst)
34a10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
34a20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
34a30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
34a40 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  oto, 0, pLevel->
34a50 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
34a60 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
34a70 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
34a80 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20   addr);.    }.  
34a90 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
34aa0 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45  ent((v, "End WHE
34ab0 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 20  RE-loop%d: %s", 
34ac0 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i,.             
34ad0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
34ae0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
34af0 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d  el->iFrom].pTab-
34b00 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20  >zName));.  }.. 
34b10 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20   /* The "break" 
34b20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a  point is here, j
34b30 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64  ust past the end
34b40 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f   of the outer lo
34b50 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e  op..  ** Set it.
34b60 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
34b70 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
34b80 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  v, pWInfo->iBrea
34b90 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  k);..  assert( p
34ba0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70  WInfo->nLevel<=p
34bb0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
34bc0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
34bd0 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
34be0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
34bf0 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
34c00 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
34c10 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
34c20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
34c30 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
34c40 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
34c50 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  rom];.    Table 
34c60 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d  *pTab = pTabItem
34c70 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65  ->pTab;.    asse
34c80 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
34c90 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
34ca0 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20  l->pWLoop;..    
34cb0 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20  /* Close all of 
34cc0 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
34cd0 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20   were opened by 
34ce0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
34cf0 6e 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74  n..    ** Except
34d00 2c 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 63  , do not close c
34d10 75 72 73 6f 72 73 20 74 68 61 74 20 77 69 6c 6c  ursors that will
34d20 20 62 65 20 72 65 75 73 65 64 20 62 79 20 74 68   be reused by th
34d30 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f  e OR optimizatio
34d40 6e 0a 20 20 20 20 2a 2a 20 28 57 48 45 52 45 5f  n.    ** (WHERE_
34d50 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29  OMIT_OPEN_CLOSE)
34d60 2e 20 20 41 6e 64 20 64 6f 20 6e 6f 74 20 63 6c  .  And do not cl
34d70 6f 73 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 57  ose the OP_OpenW
34d80 72 69 74 65 20 63 75 72 73 6f 72 73 0a 20 20 20  rite cursors.   
34d90 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20   ** created for 
34da0 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69  the ONEPASS opti
34db0 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  mization..    */
34dc0 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
34dd0 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
34de0 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20  hemeral)==0.    
34df0 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
34e00 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57  t==0.     && (pW
34e10 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
34e20 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50   & WHERE_OMIT_OP
34e30 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20  EN_CLOSE)==0.   
34e40 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73   ){.      int ws
34e50 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67   = pLoop->wsFlag
34e60 73 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 57  s;.      if( !pW
34e70 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
34e80 26 26 20 28 77 73 20 26 20 57 48 45 52 45 5f 49  && (ws & WHERE_I
34e90 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  DX_ONLY)==0 ){. 
34ea0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
34eb0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
34ec0 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  lose, pTabItem->
34ed0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
34ee0 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20  }.      if( (ws 
34ef0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
34f00 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 77  !=0.       && (w
34f10 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57  s & (WHERE_IPK|W
34f20 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
34f30 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  )==0 .       && 
34f40 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 21  pLevel->iIdxCur!
34f50 3d 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e  =pWInfo->aiCurOn
34f60 65 50 61 73 73 5b 31 5d 0a 20 20 20 20 20 20 29  ePass[1].      )
34f70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
34f80 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
34f90 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d  P_Close, pLevel-
34fa0 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
34fb0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
34fc0 20 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73   If this scan us
34fd0 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b  es an index, mak
34fe0 65 20 56 44 42 45 20 63 6f 64 65 20 73 75 62 73  e VDBE code subs
34ff0 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61  titutions to rea
35000 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72  d data.    ** fr
35010 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 73  om the index ins
35020 74 65 61 64 20 6f 66 20 66 72 6f 6d 20 74 68 65  tead of from the
35030 20 74 61 62 6c 65 20 77 68 65 72 65 20 70 6f 73   table where pos
35040 73 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20  sible.  In some 
35050 63 61 73 65 73 0a 20 20 20 20 2a 2a 20 74 68 69  cases.    ** thi
35060 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70  s optimization p
35070 72 65 76 65 6e 74 73 20 74 68 65 20 74 61 62 6c  revents the tabl
35080 65 20 66 72 6f 6d 20 65 76 65 72 20 62 65 69 6e  e from ever bein
35090 67 20 72 65 61 64 2c 20 77 68 69 63 68 20 63 61  g read, which ca
350a0 6e 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64 20 61  n.    ** yield a
350b0 20 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72   significant per
350c0 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a  formance boost..
350d0 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43      ** .    ** C
350e0 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65  alls to the code
350f0 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65   generator in be
35100 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65  tween sqlite3Whe
35110 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20  reBegin and.    
35120 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ** sqlite3WhereE
35130 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65  nd will have cre
35140 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72  ated code that r
35150 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61  eferences the ta
35160 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  ble.    ** direc
35170 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20  tly.  This loop 
35180 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63  scans all that c
35190 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ode looking for 
351a0 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74  opcodes.    ** t
351b0 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  hat reference th
351c0 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76  e table and conv
351d0 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f  erts them into o
351e0 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20  pcodes that.    
351f0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ** reference the
35200 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20   index..    */. 
35210 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
35220 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  Flags & (WHERE_I
35230 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 49 44 58  NDEXED|WHERE_IDX
35240 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20  _ONLY) ){.      
35250 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  pIdx = pLoop->u.
35260 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
35270 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f    }else if( pLoo
35280 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
35290 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
352a0 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76       pIdx = pLev
352b0 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20  el->u.pCovidx;. 
352c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64     }.    if( pId
352d0 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  x && !db->malloc
352e0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
352f0 69 6e 74 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20  int k, last;.   
35300 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
35310 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71  .      last = sq
35320 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
35330 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 6b  Addr(v);.      k
35340 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42   = pLevel->addrB
35350 6f 64 79 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d  ody;.      pOp =
35360 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
35370 70 28 76 2c 20 6b 29 3b 0a 20 20 20 20 20 20 66  p(v, k);.      f
35380 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b  or(; k<last; k++
35390 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  , pOp++){.      
353a0 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70    if( pOp->p1!=p
353b0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29  Level->iTabCur )
353c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
353d0 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
353e0 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b  de==OP_Column ){
353f0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 78  .          int x
35400 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = pOp->p2;.    
35410 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
35420 64 78 2d 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62  dx->pTable==pTab
35430 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
35440 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
35450 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
35460 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71   Index *pPk = sq
35470 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
35480 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
35490 20 20 20 20 20 20 20 20 78 20 3d 20 70 50 6b 2d          x = pPk-
354a0 3e 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20  >aiColumn[x];.  
354b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
354c0 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43      x = sqlite3C
354d0 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64  olumnOfIndex(pId
354e0 78 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20  x, x);.         
354f0 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20   if( x>=0 ){.   
35500 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32           pOp->p2
35510 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 20 20   = x;.          
35520 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
35530 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
35540 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35550 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
35560 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
35570 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
35580 7c 7c 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20  || x>=0 );.     
35590 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70     }else if( pOp
355a0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77  ->opcode==OP_Row
355b0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
355c0 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c  pOp->p1 = pLevel
355d0 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
355e0 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
355f0 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a   = OP_IdxRowid;.
35600 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35610 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
35620 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a  * Final cleanup.
35630 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e    */.  pParse->n
35640 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e  QueryLoop = pWIn
35650 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
35660 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f  oop;.  whereInfo
35670 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
35680 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a        ;.  return;.}.