/ Hex Artifact Content
Login

Artifact 830b42f452cfbc4e17582f6c1d388e15b379b833:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65  Int.h"../*.** Re
0360: 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61 74  turn the estimat
0370: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
0380: 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61 20  put rows from a 
0390: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a  WHERE clause.*/.
03a0: 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72 65  u64 sqlite3Where
03b0: 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 57  OutputRowCount(W
03c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
03d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
03e0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
03f0: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
0400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0410: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
0420: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
0430: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
0440: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
0450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0460: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
0470: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
0480: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
0490: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
04a0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
04b0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04c0: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
04d0: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
04e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
04f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0500: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
0510: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
0520: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
0530: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
0540: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
0550: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0560: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
0570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0580: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0590: 3e 62 4f 42 53 61 74 21 3d 30 3b 0a 7d 0a 0a 2f  >bOBSat!=0;.}../
05a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
05b0: 56 44 42 45 20 61 64 64 72 65 73 73 20 6f 72 20  VDBE address or 
05c0: 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f  label to jump to
05d0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e   in order to con
05e0: 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61  tinue.** immedia
05f0: 74 65 6c 79 20 77 69 74 68 20 74 68 65 20 6e 65  tely with the ne
0600: 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48 45 52  xt row of a WHER
0610: 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74  E clause..*/.int
0620: 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e   sqlite3WhereCon
0630: 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65 72 65  tinueLabel(Where
0640: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
0650: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
0660: 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  iContinue;.}../*
0670: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56  .** Return the V
0680: 44 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c  DBE address or l
0690: 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20  abel to jump to 
06a0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61  in order to brea
06b0: 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48  k.** out of a WH
06c0: 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74  ERE loop..*/.int
06d0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
06e0: 61 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  akLabel(WhereInf
06f0: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
0700: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72  turn pWInfo->iBr
0710: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eak;.}../*.** Re
0720: 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20  turn TRUE if an 
0730: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
0740: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f   statement can o
0750: 70 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20  perate directly 
0760: 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73  on.** the rowids
0770: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57   returned by a W
0780: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65  HERE clause.  Re
0790: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f  turn FALSE if do
07a0: 69 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45  ing an.** UPDATE
07b0: 20 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74   or DELETE might
07c0: 20 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65   change subseque
07d0: 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  nt WHERE clause 
07e0: 72 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49  results..**.** I
07f0: 66 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70  f the ONEPASS op
0800: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73  timization is us
0810: 65 64 20 28 69 66 20 74 68 69 73 20 72 6f 75 74  ed (if this rout
0820: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65  ine returns true
0830: 29 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77  ).** then also w
0840: 72 69 74 65 20 74 68 65 20 69 6e 64 69 63 65 73  rite the indices
0850: 20 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72 73   of open cursors
0860: 20 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53 53   used by ONEPASS
0870: 0a 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b 30  .** into aiCur[0
0880: 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20  ] and aiCur[1]. 
0890: 20 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20 74   iaCur[0] gets t
08a0: 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65  he cursor of the
08b0: 20 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61   data.** table a
08c0: 6e 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74 73  nd iaCur[1] gets
08d0: 20 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64   the cursor used
08e0: 20 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79   by an auxiliary
08f0: 20 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65   index..** Eithe
0900: 72 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 2d  r value may be -
0910: 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  1, indicating th
0920: 61 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  at cursor is not
0930: 20 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75   used..** Any cu
0940: 72 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20 77  rsors returned w
0950: 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ill have been op
0960: 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  ened for writing
0970: 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d  ..**.** aiCur[0]
0980: 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62 6f   and aiCur[1] bo
0990: 74 68 20 67 65 74 20 2d 31 20 69 66 20 74 68 65  th get -1 if the
09a0: 20 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f   where-clause lo
09b0: 67 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65  gic is.** unable
09c0: 20 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45 50   to use the ONEP
09d0: 41 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ASS optimization
09e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
09f0: 57 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57  WhereOkOnePass(W
0a00: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
0a10: 2c 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20  , int *aiCur){. 
0a20: 20 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20 70   memcpy(aiCur, p
0a30: 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
0a40: 61 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  ass, sizeof(int)
0a50: 2a 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57  *2);.  return pW
0a60: 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b  Info->okOnePass;
0a70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
0a80: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53  he content of pS
0a90: 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f  rc into pDest.*/
0aa0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
0ab0: 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72  reOrMove(WhereOr
0ac0: 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72  Set *pDest, Wher
0ad0: 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20  eOrSet *pSrc){. 
0ae0: 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63   pDest->n = pSrc
0af0: 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44  ->n;.  memcpy(pD
0b00: 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c  est->a, pSrc->a,
0b10: 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66   pDest->n*sizeof
0b20: 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pDest->a[0]));.
0b30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
0b40: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65  insert a new pre
0b50: 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65  requisite/cost e
0b60: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68  ntry into the Wh
0b70: 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a  ereOrSet pSet..*
0b80: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74  *.** The new ent
0b90: 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ry might overwri
0ba0: 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  te an existing e
0bb0: 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  ntry, or it migh
0bc0: 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64  t be.** appended
0bd0: 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  , or it might be
0be0: 20 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20   discarded.  Do 
0bf0: 77 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20  whatever is the 
0c00: 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73  right thing.** s
0c10: 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70  o that pSet keep
0c20: 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20  s the N_OR_COST 
0c30: 62 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65  best entries see
0c40: 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61  n so far..*/.sta
0c50: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49  tic int whereOrI
0c60: 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72  nsert(.  WhereOr
0c70: 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20  Set *pSet,      
0c80: 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65  /* The WhereOrSe
0c90: 74 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  t to be updated 
0ca0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
0cb0: 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  req,        /* P
0cc0: 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20  rerequisites of 
0cd0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
0ce0: 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20  .  LogEst rRun, 
0cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e            /* Run
0d00: 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77  -cost of the new
0d10: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
0d20: 73 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20  st nOut         
0d30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0d40: 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20  outputs for the 
0d50: 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a  new entry */.){.
0d60: 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65    u16 i;.  Where
0d70: 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72  OrCost *p;.  for
0d80: 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53  (i=pSet->n, p=pS
0d90: 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  et->a; i>0; i--,
0da0: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72   p++){.    if( r
0db0: 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20  Run<=p->rRun && 
0dc0: 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65  (prereq & p->pre
0dd0: 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a  req)==prereq ){.
0de0: 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
0df0: 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20  OrInsert_done;. 
0e00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
0e10: 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70  rRun<=rRun && (p
0e20: 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65  ->prereq & prere
0e30: 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b  q)==p->prereq ){
0e40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
0e50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
0e60: 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f   pSet->n<N_OR_CO
0e70: 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  ST ){.    p = &p
0e80: 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b  Set->a[pSet->n++
0e90: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d  ];.    p->nOut =
0ea0: 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nOut;.  }else{.
0eb0: 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b      p = pSet->a;
0ec0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
0ed0: 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  pSet->n; i++){. 
0ee0: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e       if( p->rRun
0ef0: 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e  >pSet->a[i].rRun
0f00: 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b   ) p = pSet->a +
0f10: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
0f20: 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20  ( p->rRun<=rRun 
0f30: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
0f40: 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f  whereOrInsert_do
0f50: 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20  ne:.  p->prereq 
0f60: 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72  = prereq;.  p->r
0f70: 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66  Run = rRun;.  if
0f80: 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  ( p->nOut>nOut )
0f90: 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b   p->nOut = nOut;
0fa0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
0fb0: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
0fc0: 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
0fd0: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
0fe0: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
0ff0: 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73   void whereClaus
1000: 65 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c  eInit(.  WhereCl
1010: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
1020: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c    /* The WhereCl
1030: 61 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69  ause to be initi
1040: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alized */.  Wher
1050: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20  eInfo *pWInfo   
1060: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
1070: 45 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e  E processing con
1080: 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43  text */.){.  pWC
1090: 2d 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66  ->pWInfo = pWInf
10a0: 6f 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72  o;.  pWC->pOuter
10b0: 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65   = 0;.  pWC->nTe
10c0: 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e  rm = 0;.  pWC->n
10d0: 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65  Slot = ArraySize
10e0: 28 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a  (pWC->aStatic);.
10f0: 20 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e    pWC->a = pWC->
1100: 61 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46  aStatic;.}../* F
1110: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1120: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
1130: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
1140: 28 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a  (WhereClause*);.
1150: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
1160: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
1170: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57  ociated with a W
1180: 68 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63  hereOrInfo objec
1190: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
11a0: 64 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c  d whereOrInfoDel
11b0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
11c0: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29   WhereOrInfo *p)
11d0: 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43  {.  whereClauseC
11e0: 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20  lear(&p->wc);.  
11f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1200: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  , p);.}../*.** D
1210: 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65  eallocate all me
1220: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
1230: 77 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49  with a WhereAndI
1240: 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  nfo object..*/.s
1250: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
1260: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71  AndInfoDelete(sq
1270: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
1280: 41 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77  AndInfo *p){.  w
1290: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
12a0: 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74  &p->wc);.  sqlit
12b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
12c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
12d0: 63 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75  cate a WhereClau
12e0: 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  se structure.  T
12f0: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
1300: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65  tructure.** itse
1310: 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e  lf is not freed.
1320: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
1330: 73 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66  s the inverse of
1340: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
1350: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
1360: 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  id whereClauseCl
1370: 65 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20  ear(WhereClause 
1380: 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  *pWC){.  int i;.
1390: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a    WhereTerm *a;.
13a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
13b0: 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61  pWC->pWInfo->pPa
13c0: 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69  rse->db;.  for(i
13d0: 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61  =pWC->nTerm-1, a
13e0: 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69  =pWC->a; i>=0; i
13f0: 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66  --, a++){.    if
1400: 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  ( a->wtFlags & T
1410: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ERM_DYNAMIC ){. 
1420: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1430: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45  Delete(db, a->pE
1440: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xpr);.    }.    
1450: 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26  if( a->wtFlags &
1460: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a   TERM_ORINFO ){.
1470: 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66        whereOrInf
1480: 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75  oDelete(db, a->u
1490: 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  .pOrInfo);.    }
14a0: 65 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c  else if( a->wtFl
14b0: 61 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e  ags & TERM_ANDIN
14c0: 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72  FO ){.      wher
14d0: 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64  eAndInfoDelete(d
14e0: 62 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  b, a->u.pAndInfo
14f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
1500: 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e  f( pWC->a!=pWC->
1510: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73  aStatic ){.    s
1520: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1530: 20 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a   pWC->a);.  }.}.
1540: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e  ./*.** Add a sin
1550: 67 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72  gle new WhereTer
1560: 6d 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57  m entry to the W
1570: 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63  hereClause objec
1580: 74 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65  t pWC..** The ne
1590: 77 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65  w WhereTerm obje
15a0: 63 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65  ct is constructe
15b0: 64 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e  d from Expr p an
15c0: 64 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a  d with wtFlags..
15d0: 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20  ** The index in 
15e0: 70 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  pWC->a[] of the 
15f0: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73  new WhereTerm is
1600: 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
1610: 63 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65  cess..** 0 is re
1620: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65  turned if the ne
1630: 77 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c  w WhereTerm coul
1640: 64 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64  d not be added d
1650: 75 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a  ue to a memory.*
1660: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  * allocation err
1670: 6f 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20  or.  The memory 
1680: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75  allocation failu
1690: 72 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72  re will be recor
16a0: 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62  ded in.** the db
16b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
16c0: 6c 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68  lag so that high
16d0: 65 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f  er-level functio
16e0: 6e 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74  ns can detect it
16f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1700: 74 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61  tine will increa
1710: 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
1720: 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61  he pWC->a[] arra
1730: 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  y as necessary..
1740: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46  **.** If the wtF
1750: 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e  lags argument in
1760: 63 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41  cludes TERM_DYNA
1770: 4d 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e  MIC, then respon
1780: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20  sibility.** for 
1790: 66 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72  freeing the expr
17a0: 65 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75  ession p is assu
17b0: 6d 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65  med by the Where
17c0: 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57  Clause object pW
17d0: 43 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72  C..** This is tr
17e0: 75 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20  ue even if this 
17f0: 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f  routine fails to
1800: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
1810: 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a  WhereTerm..**.**
1820: 20 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20   WARNING:  This 
1830: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65  routine might re
1840: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61  allocate the spa
1850: 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ce used to store
1860: 0a 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20  .** WhereTerms. 
1870: 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f   All pointers to
1880: 20 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75   WhereTerms shou
1890: 6c 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  ld be invalidate
18a0: 64 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69  d after.** calli
18b0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
18c0: 20 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20    Such pointers 
18d0: 6d 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c  may be reinitial
18e0: 69 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63  ized by referenc
18f0: 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e  ing.** the pWC->
1900: 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  a[] array..*/.st
1910: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c  atic int whereCl
1920: 61 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65  auseInsert(Where
1930: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70  Clause *pWC, Exp
1940: 72 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73  r *p, u8 wtFlags
1950: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
1960: 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78  pTerm;.  int idx
1970: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74  ;.  testcase( wt
1980: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1990: 54 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57  TUAL );.  if( pW
19a0: 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e  C->nTerm>=pWC->n
19b0: 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72  Slot ){.    Wher
19c0: 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57  eTerm *pOld = pW
19d0: 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65  C->a;.    sqlite
19e0: 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49  3 *db = pWC->pWI
19f0: 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
1a00: 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71  .    pWC->a = sq
1a10: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1a20: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  (db, sizeof(pWC-
1a30: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f  >a[0])*pWC->nSlo
1a40: 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  t*2 );.    if( p
1a50: 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  WC->a==0 ){.    
1a60: 20 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20    if( wtFlags & 
1a70: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
1a80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a90: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29  xprDelete(db, p)
1aa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ab0: 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20  pWC->a = pOld;. 
1ac0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1ad0: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
1ae0: 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69  pWC->a, pOld, si
1af0: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
1b00: 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  pWC->nTerm);.   
1b10: 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e   if( pOld!=pWC->
1b20: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  aStatic ){.     
1b30: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1b40: 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a  b, pOld);.    }.
1b50: 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d      pWC->nSlot =
1b60: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1b70: 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Size(db, pWC->a)
1b80: 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30  /sizeof(pWC->a[0
1b90: 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20  ]);.  }.  pTerm 
1ba0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20  = &pWC->a[idx = 
1bb0: 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20  pWC->nTerm++];. 
1bc0: 20 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61   if( p && ExprHa
1bd0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
1be0: 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20  Unlikely) ){.   
1bf0: 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
1c00: 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  b = sqlite3LogEs
1c10: 74 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 39  t(p->iTable) - 9
1c20: 39 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  9;.  }else{.    
1c30: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c40: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 70 54 65   = -1;.  }.  pTe
1c50: 72 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69  rm->pExpr = sqli
1c60: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
1c70: 74 65 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e  te(p);.  pTerm->
1c80: 77 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67  wtFlags = wtFlag
1c90: 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20  s;.  pTerm->pWC 
1ca0: 3d 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e  = pWC;.  pTerm->
1cb0: 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20  iParent = -1;.  
1cc0: 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f  return idx;.}../
1cd0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1ce0: 65 20 69 64 65 6e 74 69 66 69 65 73 20 73 75 62  e identifies sub
1cf0: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
1d00: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1d10: 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75  where.** each su
1d20: 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
1d30: 65 70 61 72 61 74 65 64 20 62 79 20 74 68 65 20  eparated by the 
1d40: 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  AND operator or 
1d50: 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70  some other.** op
1d60: 65 72 61 74 6f 72 20 73 70 65 63 69 66 69 65 64  erator specified
1d70: 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d   in the op param
1d80: 65 74 65 72 2e 20 20 54 68 65 20 57 68 65 72 65  eter.  The Where
1d90: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
1da0: 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69  .** is filled wi
1db0: 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73  th pointers to s
1dc0: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  ubexpressions.  
1dd0: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
1de0: 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d  **    WHERE  a==
1df0: 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c  'hello' AND coal
1e00: 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e  esce(b,11)<10 AN
1e10: 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d  D (c+12!=d OR c=
1e20: 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =22).**         
1e30: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20    \________/    
1e40: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
1e50: 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  _/     \________
1e60: 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
1e70: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20          slot[0] 
1e80: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
1e90: 31 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1]              
1ea0: 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54   slot[2].**.** T
1eb0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52  he original WHER
1ec0: 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70  E clause in pExp
1ed0: 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20  r is unaltered. 
1ee0: 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e   All this routin
1ef0: 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b  e.** does is mak
1f00: 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73  e slot[] entries
1f10: 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72   point to substr
1f20: 75 63 74 75 72 65 20 77 69 74 68 69 6e 20 70 45  ucture within pE
1f30: 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  xpr..**.** In th
1f40: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
1f50: 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64  nce and in the d
1f60: 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22  iagram, "slot[]"
1f70: 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68   refers to.** th
1f80: 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b  e WhereClause.a[
1f90: 5d 20 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c  ] array.  The sl
1fa0: 6f 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73  ot[] array grows
1fb0: 20 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f   as needed to co
1fc0: 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72  ntain.** all ter
1fd0: 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
1fe0: 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  clause..*/.stati
1ff0: 63 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69  c void whereSpli
2000: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
2010: 57 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  WC, Expr *pExpr,
2020: 20 75 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e   u8 op){.  pWC->
2030: 6f 70 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70  op = op;.  if( p
2040: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
2050: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
2060: 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65  p!=op ){.    whe
2070: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
2080: 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  WC, pExpr, 0);. 
2090: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72   }else{.    wher
20a0: 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70  eSplit(pWC, pExp
20b0: 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20  r->pLeft, op);. 
20c0: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57     whereSplit(pW
20d0: 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  C, pExpr->pRight
20e0: 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  , op);.  }.}../*
20f0: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
2100: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62   WhereMaskSet ob
2110: 6a 65 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ject.*/.#define 
2120: 69 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20  initMaskSet(P)  
2130: 28 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20  (P)->n=0../*.** 
2140: 52 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61  Return the bitma
2150: 73 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  sk for the given
2160: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20   cursor number. 
2170: 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20   Return 0 if.** 
2180: 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69  iCursor is not i
2190: 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74  n the set..*/.st
21a0: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74  atic Bitmask get
21b0: 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65  Mask(WhereMaskSe
21c0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74  t *pMaskSet, int
21d0: 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74   iCursor){.  int
21e0: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   i;.  assert( pM
21f0: 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29  askSet->n<=(int)
2200: 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a  sizeof(Bitmask)*
2210: 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  8 );.  for(i=0; 
2220: 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69  i<pMaskSet->n; i
2230: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61  ++){.    if( pMa
2240: 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43  skSet->ix[i]==iC
2250: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72  ursor ){.      r
2260: 65 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29  eturn MASKBIT(i)
2270: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2280: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2290: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61   Create a new ma
22a0: 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43  sk for cursor iC
22b0: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
22c0: 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72  re is one cursor
22d0: 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68   per table in th
22e0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
22f0: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  The number of.**
2300: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
2310: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
2320: 6d 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20  mited by a test 
2330: 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20  early in the.** 
2340: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2350: 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f  n() routine.  So
2360: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
2370: 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d  e pMaskSet->ix[]
2380: 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e  .** array will n
2390: 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a  ever overflow..*
23a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72  /.static void cr
23b0: 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61  eateMask(WhereMa
23c0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
23d0: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
23e0: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
23f0: 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65  t->n < ArraySize
2400: 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29  (pMaskSet->ix) )
2410: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  ;.  pMaskSet->ix
2420: 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20  [pMaskSet->n++] 
2430: 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a  = iCursor;.}../*
2440: 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
2450: 65 73 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69  es walk (recursi
2460: 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73  vely) an express
2470: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e  ion tree and gen
2480: 65 72 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61  erate.** a bitma
2490: 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68  sk indicating wh
24a0: 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75  ich tables are u
24b0: 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72  sed in that expr
24c0: 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a  ession.** tree..
24d0: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
24e0: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
24f0: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
2500: 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  t*, ExprList*);.
2510: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
2520: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
2530: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
2540: 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61  *, Select*);.sta
2550: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
2560: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
2570: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
2580: 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42  t, Expr *p){.  B
2590: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
25a0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
25b0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
25c0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
25d0: 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74  {.    mask = get
25e0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
25f0: 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72  ->iTable);.    r
2600: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a  eturn mask;.  }.
2610: 20 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62    mask = exprTab
2620: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2630: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
2640: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
2650: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2660: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66   p->pLeft);.  if
2670: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
2680: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
2690: 74 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c  t) ){.    mask |
26a0: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
26b0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
26c0: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a   p->x.pSelect);.
26d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73    }else{.    mas
26e0: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
26f0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2700: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  , p->x.pList);. 
2710: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
2720: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
2730: 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  sk exprListTable
2740: 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53  Usage(WhereMaskS
2750: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78  et *pMaskSet, Ex
2760: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
2770: 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61    int i;.  Bitma
2780: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69  sk mask = 0;.  i
2790: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
27a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
27b0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
27c0: 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70       mask |= exp
27d0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
27e0: 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  kSet, pList->a[i
27f0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ].pExpr);.    }.
2800: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73    }.  return mas
2810: 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d  k;.}.static Bitm
2820: 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61  ask exprSelectTa
2830: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
2840: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
2850: 20 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20   Select *pS){.  
2860: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30  Bitmask mask = 0
2870: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b  ;.  while( pS ){
2880: 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
2890: 72 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  rc = pS->pSrc;. 
28a0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
28b0: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
28c0: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69  askSet, pS->pELi
28d0: 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  st);.    mask |=
28e0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
28f0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
2900: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
2910: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
2920: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
2930: 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72  kSet, pS->pOrder
2940: 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  By);.    mask |=
2950: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
2960: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57  pMaskSet, pS->pW
2970: 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20  here);.    mask 
2980: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
2990: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
29a0: 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66  pHaving);.    if
29b0: 28 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30  ( ALWAYS(pSrc!=0
29c0: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
29d0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
29e0: 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69   i<pSrc->nSrc; i
29f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73  ++){.        mas
2a00: 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54  k |= exprSelectT
2a10: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2a20: 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  et, pSrc->a[i].p
2a30: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
2a40: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
2a50: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2a60: 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e  , pSrc->a[i].pOn
2a70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2a80: 0a 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50  .    pS = pS->pP
2a90: 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rior;.  }.  retu
2aa0: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn mask;.}../*.*
2ab0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
2ac0: 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61   the given opera
2ad0: 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  tor is one of th
2ae0: 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  e operators that
2af0: 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66   is.** allowed f
2b00: 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20  or an indexable 
2b10: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
2b20: 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20  m.  The allowed 
2b30: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a  operators are.**
2b40: 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20   "=", "<", ">", 
2b50: 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22  "<=", ">=", "IN"
2b60: 2c 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a  , and "IS NULL".
2b70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
2b80: 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b  lowedOp(int op){
2b90: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54  .  assert( TK_GT
2ba0: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c  >TK_EQ && TK_GT<
2bb0: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
2bc0: 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26  t( TK_LT>TK_EQ &
2bd0: 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b  & TK_LT<TK_GE );
2be0: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45  .  assert( TK_LE
2bf0: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c  >TK_EQ && TK_LE<
2c00: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
2c10: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b  t( TK_GE==TK_EQ+
2c20: 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70  4 );.  return op
2c30: 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d  ==TK_IN || (op>=
2c40: 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f  TK_EQ && op<=TK_
2c50: 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53  GE) || op==TK_IS
2c60: 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  NULL;.}../*.** S
2c70: 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20  wap two objects 
2c80: 6f 66 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f  of type TYPE..*/
2c90: 0a 23 64 65 66 69 6e 65 20 53 57 41 50 28 54 59  .#define SWAP(TY
2ca0: 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d  PE,A,B) {TYPE t=
2cb0: 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f  A; A=B; B=t;}../
2cc0: 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63  *.** Commute a c
2cd0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
2ce0: 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73  or.  Expressions
2cf0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
2d00: 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e  op Y".** are con
2d10: 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f  verted into "Y o
2d20: 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c  p X"..**.** If l
2d30: 65 66 74 2f 72 69 67 68 74 20 70 72 65 63 65 64  eft/right preced
2d40: 65 6e 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20  ence rules come 
2d50: 69 6e 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64  into play when d
2d60: 65 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a  etermining the.*
2d70: 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * collating sequ
2d80: 65 6e 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c 41  ence, then COLLA
2d90: 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65  TE operators are
2da0: 20 61 64 6a 75 73 74 65 64 20 74 6f 20 65 6e 73   adjusted to ens
2db0: 75 72 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ure.** that the 
2dc0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
2dd0: 63 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e  ce does not chan
2de0: 67 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ge.  For example
2df0: 3a 0a 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65 20  :.** "Y collate 
2e00: 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62 65 63  NOCASE op X" bec
2e10: 6f 6d 65 73 20 22 58 20 6f 70 20 59 22 20 62 65  omes "X op Y" be
2e20: 63 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74  cause any collat
2e30: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a  ion sequence on.
2e40: 2a 2a 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64  ** the left hand
2e50: 20 73 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61   side of a compa
2e60: 72 69 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  rison overrides 
2e70: 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  any collation se
2e80: 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63  quence .** attac
2e90: 68 65 64 20 74 6f 20 74 68 65 20 72 69 67 68 74  hed to the right
2ea0: 2e 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72  . For the same r
2eb0: 65 61 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c  eason the EP_Col
2ec0: 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20  late flag.** is 
2ed0: 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f  not commuted..*/
2ee0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
2ef0: 72 43 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a  rCommute(Parse *
2f00: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
2f10: 78 70 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52  xpr){.  u16 expR
2f20: 69 67 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70  ight = (pExpr->p
2f30: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
2f40: 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31  P_Collate);.  u1
2f50: 36 20 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78  6 expLeft = (pEx
2f60: 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73  pr->pLeft->flags
2f70: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a   & EP_Collate);.
2f80: 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65    assert( allowe
2f90: 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26  dOp(pExpr->op) &
2fa0: 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  & pExpr->op!=TK_
2fb0: 49 4e 20 29 3b 0a 20 20 69 66 28 20 65 78 70 52  IN );.  if( expR
2fc0: 69 67 68 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b  ight==expLeft ){
2fd0: 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 58  .    /* Either X
2fe0: 20 61 6e 64 20 59 20 62 6f 74 68 20 68 61 76 65   and Y both have
2ff0: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
3000: 72 20 6f 72 20 6e 65 69 74 68 65 72 20 64 6f 20  r or neither do 
3010: 2a 2f 0a 20 20 20 20 69 66 28 20 65 78 70 52 69  */.    if( expRi
3020: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ght ){.      /* 
3030: 42 6f 74 68 20 58 20 61 6e 64 20 59 20 68 61 76  Both X and Y hav
3040: 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  e COLLATE operat
3050: 6f 72 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ors.  Make sure 
3060: 58 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20  X is always.    
3070: 20 20 2a 2a 20 75 73 65 64 20 62 79 20 63 6c 65    ** used by cle
3080: 61 72 69 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c  aring the EP_Col
3090: 6c 61 74 65 20 66 6c 61 67 20 66 72 6f 6d 20 59  late flag from Y
30a0: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72  . */.      pExpr
30b0: 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ->pRight->flags 
30c0: 26 3d 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a  &= ~EP_Collate;.
30d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
30e0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
30f0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
3100: 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20  pLeft)!=0 ){.   
3110: 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 58 20     /* Neither X 
3120: 6e 6f 72 20 59 20 68 61 76 65 20 43 4f 4c 4c 41  nor Y have COLLA
3130: 54 45 20 6f 70 65 72 61 74 6f 72 73 2c 20 62 75  TE operators, bu
3140: 74 20 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65  t X has a non-de
3150: 66 61 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63  fault.      ** c
3160: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
3170: 65 2e 20 20 53 6f 20 61 64 64 20 74 68 65 20 45  e.  So add the E
3180: 50 5f 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72  P_Collate marker
3190: 20 6f 6e 20 58 20 74 6f 20 63 61 75 73 65 0a 20   on X to cause. 
31a0: 20 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65       ** it to be
31b0: 20 73 65 61 72 63 68 65 64 20 66 69 72 73 74 2e   searched first.
31c0: 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
31d0: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d  >pLeft->flags |=
31e0: 20 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20   EP_Collate;.   
31f0: 20 7d 0a 20 20 7d 0a 20 20 53 57 41 50 28 45 78   }.  }.  SWAP(Ex
3200: 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68  pr*,pExpr->pRigh
3210: 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  t,pExpr->pLeft);
3220: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
3230: 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61  >=TK_GT ){.    a
3240: 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b  ssert( TK_LT==TK
3250: 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73  _GT+2 );.    ass
3260: 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c  ert( TK_GE==TK_L
3270: 45 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  E+2 );.    asser
3280: 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29  t( TK_GT>TK_EQ )
3290: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
32a0: 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  _GT<TK_LE );.   
32b0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
32c0: 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78  op>=TK_GT && pEx
32d0: 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b  pr->op<=TK_GE );
32e0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
32f0: 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f   ((pExpr->op-TK_
3300: 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20  GT)^2)+TK_GT;.  
3310: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  }.}../*.** Trans
3320: 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20  late from TK_xx 
3330: 6f 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78  operator to WO_x
3340: 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74  x bitmask..*/.st
3350: 61 74 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f  atic u16 operato
3360: 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20  rMask(int op){. 
3370: 20 75 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74   u16 c;.  assert
3380: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20  ( allowedOp(op) 
3390: 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
33a0: 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f  IN ){.    c = WO
33b0: 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _IN;.  }else if(
33c0: 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
33d0: 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e  {.    c = WO_ISN
33e0: 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
33f0: 20 20 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51    assert( (WO_EQ
3400: 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20  <<(op-TK_EQ)) < 
3410: 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20  0x7fff );.    c 
3420: 3d 20 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28  = (u16)(WO_EQ<<(
3430: 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a  op-TK_EQ));.  }.
3440: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
3450: 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f  _ISNULL || c==WO
3460: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73  _ISNULL );.  ass
3470: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c  ert( op!=TK_IN |
3480: 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20  | c==WO_IN );.  
3490: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45  assert( op!=TK_E
34a0: 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b  Q || c==WO_EQ );
34b0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
34c0: 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54  K_LT || c==WO_LT
34d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
34e0: 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f  !=TK_LE || c==WO
34f0: 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _LE );.  assert(
3500: 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d   op!=TK_GT || c=
3510: 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65  =WO_GT );.  asse
3520: 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c  rt( op!=TK_GE ||
3530: 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72   c==WO_GE );.  r
3540: 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn c;.}../*.*
3550: 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65  * Advance to the
3560: 20 6e 65 78 74 20 57 68 65 72 65 54 65 72 6d 20   next WhereTerm 
3570: 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 63 63  that matches acc
3580: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72  ording to the cr
3590: 69 74 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c  iteria.** establ
35a0: 69 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 70  ished when the p
35b0: 53 63 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20  Scan object was 
35c0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77  initialized by w
35d0: 68 65 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a  hereScanInit()..
35e0: 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
35f0: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  f there are no m
3600: 6f 72 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65  ore matching Whe
3610: 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74  reTerms..*/.stat
3620: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68  ic WhereTerm *wh
3630: 65 72 65 53 63 61 6e 4e 65 78 74 28 57 68 65 72  ereScanNext(Wher
3640: 65 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20  eScan *pScan){. 
3650: 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
3660: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
3670: 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f  sor on the LHS o
3680: 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20  f the term */.  
3690: 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  int iColumn;    
36a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75       /* The colu
36b0: 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66  mn on the LHS of
36c0: 20 74 68 65 20 74 65 72 6d 2e 20 20 2d 31 20 66   the term.  -1 f
36d0: 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72  or IPK */.  Expr
36e0: 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
36f0: 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f   /* An expressio
3700: 6e 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a  n being tested *
3710: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
3720: 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72  *pWC;    /* Shor
3730: 74 68 61 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d  thand for pScan-
3740: 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65 72 65 54  >pWC */.  WhereT
3750: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f  erm *pTerm;    /
3760: 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67  * The term being
3770: 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74   tested */.  int
3780: 20 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20   k = pScan->k;  
3790: 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74    /* Where to st
37a0: 61 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a  art scanning */.
37b0: 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d  .  while( pScan-
37c0: 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e  >iEquiv<=pScan->
37d0: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43  nEquiv ){.    iC
37e0: 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75  ur = pScan->aEqu
37f0: 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  iv[pScan->iEquiv
3800: 2d 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e  -2];.    iColumn
3810: 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76   = pScan->aEquiv
3820: 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31  [pScan->iEquiv-1
3830: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70  ];.    while( (p
3840: 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29  WC = pScan->pWC)
3850: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  !=0 ){.      for
3860: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b  (pTerm=pWC->a+k;
3870: 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b   k<pWC->nTerm; k
3880: 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
3890: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
38a0: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
38b0: 72 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 54  r.         && pT
38c0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
38d0: 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  n==iColumn.     
38e0: 20 20 20 20 26 26 20 28 70 53 63 61 6e 2d 3e 69      && (pScan->i
38f0: 45 71 75 69 76 3c 3d 32 20 7c 7c 20 21 45 78 70  Equiv<=2 || !Exp
3900: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
3910: 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
3920: 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 20  omJoin)).       
3930: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
3940: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
3950: 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21  tor & WO_EQUIV)!
3960: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
3970: 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41   pScan->nEquiv<A
3980: 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e  rraySize(pScan->
3990: 61 45 71 75 69 76 29 0a 20 20 20 20 20 20 20 20  aEquiv).        
39a0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
39b0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
39c0: 20 20 20 20 70 58 20 3d 20 73 71 6c 69 74 65 33      pX = sqlite3
39d0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
39e0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
39f0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
3a00: 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f     assert( pX->o
3a10: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
3a30: 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45  j=0; j<pScan->nE
3a40: 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20  quiv; j+=2){.   
3a50: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
3a60: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d  Scan->aEquiv[j]=
3a70: 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20  =pX->iTable.    
3a80: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 53             && pS
3a90: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d  can->aEquiv[j+1]
3aa0: 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  ==pX->iColumn ){
3ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3ac0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3ad0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3ae0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3af0: 20 20 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e      if( j==pScan
3b00: 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20  ->nEquiv ){.    
3b10: 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d            pScan-
3b20: 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58 2d  >aEquiv[j] = pX-
3b30: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
3b40: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45         pScan->aE
3b50: 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e  quiv[j+1] = pX->
3b60: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
3b70: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45         pScan->nE
3b80: 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20  quiv += 2;.     
3b90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3ba0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
3bb0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
3bc0: 61 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70  ator & pScan->op
3bd0: 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  Mask)!=0 ){.    
3be0: 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66          /* Verif
3bf0: 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 61  y the affinity a
3c00: 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nd collating seq
3c10: 75 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20  uence match */. 
3c20: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
3c30: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20  Scan->zCollName 
3c40: 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  && (pTerm->eOper
3c50: 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
3c60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
3c70: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
3c80: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
3c90: 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73      Parse *pPars
3ca0: 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d  e = pWC->pWInfo-
3cb0: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
3cc0: 20 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72         pX = pTer
3cd0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
3ce0: 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
3cf0: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
3d00: 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69  yOk(pX, pScan->i
3d10: 64 78 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20  dxaff) ){.      
3d20: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
3d30: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
3d40: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
3d50: 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65    assert(pX->pLe
3d60: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ft);.           
3d70: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
3d80: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
3d90: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20  ollSeq(pParse,. 
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e   pX->pLeft, pX->
3de0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
3df0: 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
3e00: 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50  ==0 ) pColl = pP
3e10: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
3e20: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
3e30: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
3e40: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
3e50: 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c  me, pScan->zColl
3e60: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
3e70: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
3e80: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
3e90: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
3ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
3eb0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3ec0: 6f 72 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20  or & WO_EQ)!=0. 
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
3ee0: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
3ef0: 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d  r->pRight)->op==
3f00: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
3f10: 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54         && pX->iT
3f20: 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71  able==pScan->aEq
3f30: 75 69 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20  uiv[0].         
3f40: 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75      && pX->iColu
3f50: 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69  mn==pScan->aEqui
3f60: 76 5b 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20  v[1].           
3f70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3f80: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
3f90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3fa0: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d        pScan->k =
3fb0: 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20   k+1;.          
3fc0: 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a    return pTerm;.
3fd0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3fe0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3ff0: 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d      pScan->pWC =
4000: 20 70 53 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75   pScan->pWC->pOu
4010: 74 65 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30  ter;.      k = 0
4020: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61  ;.    }.    pSca
4030: 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e  n->pWC = pScan->
4040: 70 4f 72 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d  pOrigWC;.    k =
4050: 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69   0;.    pScan->i
4060: 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a  Equiv += 2;.  }.
4070: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
4080: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
4090: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73  a WHERE clause s
40a0: 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20  canner object.  
40b0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
40c0: 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   to the.** first
40d0: 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20   match.  Return 
40e0: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
40f0: 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a  e no matches..**
4100: 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20  .** The scanner 
4110: 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e  will be searchin
4120: 67 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  g the WHERE clau
4130: 73 65 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c  se pWC.  It will
4140: 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72   look.** for ter
4150: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ms of the form "
4160: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77  X <op> <expr>" w
4170: 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e  here X is column
4180: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
4190: 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54 68 65 20  e.** iCur.  The 
41a0: 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65  <op> must be one
41b0: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
41c0: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 6f  s described by o
41d0: 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pMask..**.** If 
41e0: 74 68 65 20 73 65 61 72 63 68 20 69 73 20 66 6f  the search is fo
41f0: 72 20 58 20 61 6e 64 20 74 68 65 20 57 48 45 52  r X and the WHER
4200: 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
4210: 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  s terms of the.*
4220: 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20  * form X=Y then 
4230: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
4240: 68 74 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74  ht also return t
4250: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
4260: 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70  .** "Y <op> <exp
4270: 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  r>".  The number
4280: 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72   of levels of tr
4290: 61 6e 73 69 74 69 76 69 74 79 20 69 73 20 6c 69  ansitivity is li
42a0: 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73  mited,.** but is
42b0: 20 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c   enough to handl
42c0: 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20  e most commonly 
42d0: 6f 63 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74  occurring SQL st
42e0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
42f0: 49 66 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20  If X is not the 
4300: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
4310: 4b 45 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20  KEY then X must 
4320: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
4330: 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78  th.** index pIdx
4340: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
4350: 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e  eTerm *whereScan
4360: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53 63 61  Init(.  WhereSca
4370: 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20  n *pScan,       
4380: 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63 61 6e  /* The WhereScan
4390: 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e   object being in
43a0: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57  itialized */.  W
43b0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
43c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
43d0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
43e0: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e   scanned */.  in
43f0: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
4400: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
4410: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
4420: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
4430: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
4440: 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  mn to scan for *
4450: 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20  /.  u32 opMask, 
4460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4470: 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63  perator(s) to sc
4480: 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  an for */.  Inde
4490: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
44a0: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
44b0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
44c0: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a  his index */.){.
44d0: 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d    int j;..  /* m
44e0: 65 6d 73 65 74 28 70 53 63 61 6e 2c 20 30 2c 20  emset(pScan, 0, 
44f0: 73 69 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b  sizeof(*pScan));
4500: 20 2a 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72   */.  pScan->pOr
4510: 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53  igWC = pWC;.  pS
4520: 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a  can->pWC = pWC;.
4530: 20 20 69 66 28 20 70 49 64 78 20 26 26 20 69 43    if( pIdx && iC
4540: 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
4550: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20  pScan->idxaff = 
4560: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
4570: 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  ol[iColumn].affi
4580: 6e 69 74 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  nity;.    for(j=
4590: 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  0; pIdx->aiColum
45a0: 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a  n[j]!=iColumn; j
45b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4e  ++){.      if( N
45c0: 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 4b  EVER(j>=pIdx->nK
45d0: 65 79 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 20  eyCol) ) return 
45e0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63  0;.    }.    pSc
45f0: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20  an->zCollName = 
4600: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b  pIdx->azColl[j];
4610: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53  .  }else{.    pS
4620: 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b  can->idxaff = 0;
4630: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  .    pScan->zCol
4640: 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  lName = 0;.  }. 
4650: 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d   pScan->opMask =
4660: 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e   opMask;.  pScan
4670: 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e  ->k = 0;.  pScan
4680: 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d 20 69 43  ->aEquiv[0] = iC
4690: 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71  ur;.  pScan->aEq
46a0: 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e  uiv[1] = iColumn
46b0: 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69  ;.  pScan->nEqui
46c0: 76 20 3d 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e  v = 2;.  pScan->
46d0: 69 45 71 75 69 76 20 3d 20 32 3b 0a 20 20 72 65  iEquiv = 2;.  re
46e0: 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65  turn whereScanNe
46f0: 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a  xt(pScan);.}../*
4700: 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61  .** Search for a
4710: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
4720: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
4730: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
4740: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a   <op> <expr>".**
4750: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 72 65   where X is a re
4760: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69  ference to the i
4770: 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  Column of table 
4780: 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73  iCur and <op> is
4790: 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57   one of.** the W
47a0: 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f  O_xx operator co
47b0: 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62 79  des specified by
47c0: 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65   the op paramete
47d0: 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  r..** Return a p
47e0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65  ointer to the te
47f0: 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  rm.  Return 0 if
4800: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
4810: 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74 75 72  * The term retur
4820: 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59 3d 3c  ned might by Y=<
4830: 65 78 70 72 3e 20 69 66 20 74 68 65 72 65 20 69  expr> if there i
4840: 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72  s another constr
4850: 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57  aint in.** the W
4860: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
4870: 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20   specifies that 
4880: 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68 20 63  X=Y.  Any such c
4890: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
48a0: 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64  be.** identified
48b0: 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55 49 56   by the WO_EQUIV
48c0: 20 62 69 74 20 69 6e 20 74 68 65 20 70 54 65 72   bit in the pTer
48d0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66 69 65  m->eOperator fie
48e0: 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45 71 75  ld.  The.** aEqu
48f0: 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64 73  iv[] array holds
4900: 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65   X and all its e
4910: 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69 74 68  quivalents, with
4920: 20 65 61 63 68 20 53 51 4c 20 76 61 72 69 61 62   each SQL variab
4930: 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20  le.** taking up 
4940: 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61 45 71  two slots in aEq
4950: 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69 72 73  uiv[].  The firs
4960: 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20 74 68  t slot is for th
4970: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a  e cursor number.
4980: 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  ** and the secon
4990: 64 20 69 73 20 66 6f 72 20 74 68 65 20 63 6f 6c  d is for the col
49a0: 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  umn number.  The
49b0: 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74 73 20  re are 22 slots 
49c0: 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73  in aEquiv[].** s
49d0: 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  o that means we 
49e0: 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70  can look for X p
49f0: 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f 74 68  lus up to 10 oth
4a00: 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61  er equivalent va
4a10: 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61  lues..** Hence a
4a20: 20 73 65 61 72 63 68 20 66 6f 72 20 58 20 77 69   search for X wi
4a30: 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e  ll return <expr>
4a40: 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41 31 3d   if X=A1 and A1=
4a50: 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20  A2 and A2=A3.** 
4a60: 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41  and ... and A9=A
4a70: 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72  10 and A10=<expr
4a80: 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  >..**.** If ther
4a90: 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74  e are multiple t
4aa0: 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
4ab0: 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
4ac0: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
4ad0: 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79  pr>".** then try
4ae0: 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74   for the one wit
4af0: 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65  h no dependencie
4b00: 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e  s on <expr> - in
4b10: 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77 68 65   other words whe
4b20: 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20  re.** <expr> is 
4b30: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
4b40: 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69  ssion of some ki
4b50: 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e  nd.  Only return
4b60: 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74   entries of.** t
4b70: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
4b80: 59 22 20 77 68 65 72 65 20 59 20 69 73 20 61 20  Y" where Y is a 
4b90: 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65  column in anothe
4ba0: 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65  r table if no te
4bb0: 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f  rms of.** the fo
4bc0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73  rm "X <op> <cons
4bd0: 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20  t-expr>" exist. 
4be0: 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69    If no terms wi
4bf0: 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48  th a constant RH
4c00: 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20  S.** exist, try 
4c10: 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d  to return a term
4c20: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75   that does not u
4c30: 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a  se WO_EQUIV..*/.
4c40: 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72 6d  static WhereTerm
4c50: 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68   *findTerm(.  Wh
4c60: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
4c70: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
4c80: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65   clause to be se
4c90: 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20  arched */.  int 
4ca0: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
4cb0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
4cc0: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69  er of LHS */.  i
4cd0: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
4ce0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
4cf0: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
4d00: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
4d10: 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d  dy,     /* RHS m
4d20: 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20  ust not overlap 
4d30: 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a  with this mask *
4d40: 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20  /.  u32 op,     
4d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
4d60: 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65  k of WO_xx value
4d70: 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65  s describing ope
4d80: 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78  rator */.  Index
4d90: 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
4da0: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
4db0: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
4dc0: 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e   index, if not N
4dd0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ULL */.){.  Wher
4de0: 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d  eTerm *pResult =
4df0: 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   0;.  WhereTerm 
4e00: 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20  *p;.  WhereScan 
4e10: 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65  scan;..  p = whe
4e20: 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
4e30: 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f  , pWC, iCur, iCo
4e40: 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b  lumn, op, pIdx);
4e50: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
4e60: 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
4e70: 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64  qRight & notRead
4e80: 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  y)==0 ){.      i
4e90: 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69 67 68  f( p->prereqRigh
4ea0: 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70 65  t==0 && (p->eOpe
4eb0: 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20  rator&WO_EQ)!=0 
4ec0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
4ed0: 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n p;.      }.   
4ee0: 20 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d     if( pResult==
4ef0: 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b  0 ) pResult = p;
4f00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77  .    }.    p = w
4f10: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63  hereScanNext(&sc
4f20: 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  an);.  }.  retur
4f30: 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a  n pResult;.}../*
4f40: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
4f50: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
4f60: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72  d exprAnalyze(Sr
4f70: 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61  cList*, WhereCla
4f80: 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  use*, int);../*.
4f90: 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c  ** Call exprAnal
4fa0: 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  yze on all terms
4fb0: 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
4fc0: 73 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  se.  .*/.static 
4fd0: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
4fe0: 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  All(.  SrcList *
4ff0: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
5000: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
5010: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
5020: 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 20 20  use *pWC        
5030: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
5040: 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79  ause to be analy
5050: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  zed */.){.  int 
5060: 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  i;.  for(i=pWC->
5070: 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  nTerm-1; i>=0; i
5080: 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61  --){.    exprAna
5090: 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70  lyze(pTabList, p
50a0: 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  WC, i);.  }.}..#
50b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
50c0: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
50d0: 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  TION./*.** Check
50e0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67   to see if the g
50f0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
5100: 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f  is a LIKE or GLO
5110: 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a  B operator that.
5120: 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69  ** can be optimi
5130: 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61  zed using inequa
5140: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
5150: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
5160: 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e  f it is.** so an
5170: 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  d false if not..
5180: 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66  **.** In order f
5190: 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  or the operator 
51a0: 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c  to be optimizibl
51b0: 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74 20  e, the RHS must 
51c0: 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c  be a string.** l
51d0: 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73  iteral that does
51e0: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
51f0: 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f  a wildcard.  .*/
5200: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69  .static int isLi
5210: 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73  keOrGlob(.  Pars
5220: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
5230: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
5240: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
5250: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
5260: 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
5270: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
5280: 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  ion */.  Expr **
5290: 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f  ppPrefix,  /* Po
52a0: 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49  inter to TK_STRI
52b0: 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  NG expression wi
52c0: 74 68 20 70 61 74 74 65 72 6e 20 70 72 65 66 69  th pattern prefi
52d0: 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43  x */.  int *pisC
52e0: 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65  omplete, /* True
52f0: 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c   if the only wil
5300: 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74 68  dcard is % in th
5310: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
5320: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61   */.  int *pnoCa
5330: 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  se      /* True 
5340: 69 66 20 75 70 70 65 72 63 61 73 65 20 69 73 20  if uppercase is 
5350: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f  equivalent to lo
5360: 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20  wercase */.){.  
5370: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
5380: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  0;         /* St
5390: 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c  ring on RHS of L
53a0: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
53b0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
53c0: 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20  *pLeft;      /* 
53d0: 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73  Right and left s
53e0: 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72  ize of LIKE oper
53f0: 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ator */.  ExprLi
5400: 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  st *pList;      
5410: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
5420: 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20  operands to the 
5430: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
5440: 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20  .  int c;       
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5460: 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20 69   One character i
5470: 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63  n z[] */.  int c
5480: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
5490: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
54a0: 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20  of non-wildcard 
54b0: 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72  prefix character
54c0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33  s */.  char wc[3
54d0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
54e0: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68    /* Wildcard ch
54f0: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71  aracters */.  sq
5500: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
5510: 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
5520: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
5530: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
5540: 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20  ue *pVal = 0;.  
5550: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
5560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
5570: 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a  code of pRight *
5580: 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  /..  if( !sqlite
5590: 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28  3IsLikeFunction(
55a0: 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61  db, pExpr, pnoCa
55b0: 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72  se, wc) ){.    r
55c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66  eturn 0;.  }.#if
55d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49  def SQLITE_EBCDI
55e0: 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65  C.  if( *pnoCase
55f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
5600: 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45  dif.  pList = pE
5610: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
5620: 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61  pLeft = pList->a
5630: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [1].pExpr;.  if(
5640: 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43   pLeft->op!=TK_C
5650: 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c  OLUMN .   || sql
5660: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
5670: 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f  (pLeft)!=SQLITE_
5680: 41 46 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20  AFF_TEXT .   || 
5690: 49 73 56 69 72 74 75 61 6c 28 70 4c 65 66 74 2d  IsVirtual(pLeft-
56a0: 3e 70 54 61 62 29 0a 20 20 29 7b 0a 20 20 20 20  >pTab).  ){.    
56b0: 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d  /* IMP: R-02065-
56c0: 34 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68  49465 The left-h
56d0: 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
56e0: 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65  LIKE or GLOB ope
56f0: 72 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a  rator must.    *
5700: 2a 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  * be the name of
5710: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
5720: 6d 6e 20 77 69 74 68 20 54 45 58 54 20 61 66 66  mn with TEXT aff
5730: 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65  inity. */.    re
5740: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73  turn 0;.  }.  as
5750: 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f  sert( pLeft->iCo
5760: 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a  lumn!=(-1) ); /*
5770: 20 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76   Because IPK nev
5780: 65 72 20 68 61 73 20 41 46 46 5f 54 45 58 54 20  er has AFF_TEXT 
5790: 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 70  */..  pRight = p
57a0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
57b0: 3b 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d  ;.  op = pRight-
57c0: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
57d0: 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20  K_VARIABLE ){.  
57e0: 20 20 56 64 62 65 20 2a 70 52 65 70 72 65 70 61    Vdbe *pReprepa
57f0: 72 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 52 65  re = pParse->pRe
5800: 70 72 65 70 61 72 65 3b 0a 20 20 20 20 69 6e 74  prepare;.    int
5810: 20 69 43 6f 6c 20 3d 20 70 52 69 67 68 74 2d 3e   iCol = pRight->
5820: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 56 61  iColumn;.    pVa
5830: 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  l = sqlite3VdbeG
5840: 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 70 52 65  etBoundValue(pRe
5850: 70 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53  prepare, iCol, S
5860: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b  QLITE_AFF_NONE);
5870: 0a 20 20 20 20 69 66 28 20 70 56 61 6c 20 26 26  .    if( pVal &&
5880: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
5890: 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54  ype(pVal)==SQLIT
58a0: 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20  E_TEXT ){.      
58b0: 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  z = (char *)sqli
58c0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
58d0: 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Val);.    }.    
58e0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
58f0: 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56  rmask(pParse->pV
5900: 64 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  dbe, iCol);.    
5910: 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e  assert( pRight->
5920: 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
5930: 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  || pRight->op==T
5940: 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
5950: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
5960: 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a  _STRING ){.    z
5970: 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f   = pRight->u.zTo
5980: 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ken;.  }.  if( z
5990: 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b   ){.    cnt = 0;
59a0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a  .    while( (c=z
59b0: 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d  [cnt])!=0 && c!=
59c0: 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31  wc[0] && c!=wc[1
59d0: 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b  ] && c!=wc[2] ){
59e0: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
59f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21    }.    if( cnt!
5a00: 3d 30 20 26 26 20 32 35 35 21 3d 28 75 38 29 7a  =0 && 255!=(u8)z
5a10: 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20 20 20  [cnt-1] ){.     
5a20: 20 45 78 70 72 20 2a 70 50 72 65 66 69 78 3b 0a   Expr *pPrefix;.
5a30: 20 20 20 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65        *pisComple
5a40: 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26  te = c==wc[0] &&
5a50: 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20   z[cnt+1]==0;.  
5a60: 20 20 20 20 70 50 72 65 66 69 78 20 3d 20 73 71      pPrefix = sq
5a70: 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
5a80: 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20 20 20  _STRING, z);.   
5a90: 20 20 20 69 66 28 20 70 50 72 65 66 69 78 20 29     if( pPrefix )
5aa0: 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b   pPrefix->u.zTok
5ab0: 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20 20 20  en[cnt] = 0;.   
5ac0: 20 20 20 2a 70 70 50 72 65 66 69 78 20 3d 20 70     *ppPrefix = p
5ad0: 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 69 66  Prefix;.      if
5ae0: 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ( op==TK_VARIABL
5af0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62  E ){.        Vdb
5b00: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
5b10: 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20 73 71  Vdbe;.        sq
5b20: 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
5b30: 61 73 6b 28 76 2c 20 70 52 69 67 68 74 2d 3e 69  ask(v, pRight->i
5b40: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
5b50: 20 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74   if( *pisComplet
5b60: 65 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a  e && pRight->u.z
5b70: 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20  Token[1] ){.    
5b80: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
5b90: 72 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20  rhs of the LIKE 
5ba0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
5bb0: 76 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68  variable, and th
5bc0: 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20  e current.      
5bd0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
5be0: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61  the variable mea
5bf0: 6e 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ns there is no n
5c00: 65 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  eed to invoke th
5c10: 65 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20  e LIKE.         
5c20: 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68   ** function, th
5c30: 65 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c  en no OP_Variabl
5c40: 65 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20  e will be added 
5c50: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
5c60: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69            ** Thi
5c70: 73 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d  s causes problem
5c80: 73 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  s for the sqlite
5c90: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
5ca0: 5f 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20  _name().        
5cb0: 20 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72    ** API. To wor
5cc0: 6b 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64  karound them, ad
5cd0: 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72  d a dummy OP_Var
5ce0: 69 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20 20  iable here..    
5cf0: 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20        */ .      
5d00: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
5d10: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
5d20: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
5d30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
5d40: 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
5d50: 70 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20 20  pRight, r1);.   
5d60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5d70: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73 71  beChangeP3(v, sq
5d80: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
5d90: 41 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20  Addr(v)-1, 0);. 
5da0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5db0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5dc0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
5dd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
5de0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
5df0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
5e00: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
5e10: 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74  ree(pVal);.  ret
5e20: 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65  urn (z!=0);.}.#e
5e30: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
5e40: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
5e50: 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64  ATION */...#ifnd
5e60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
5e70: 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
5e80: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
5e90: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
5ea0: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
5eb0: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20   form.**.**     
5ec0: 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48      column MATCH
5ed0: 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69   expr.**.** If i
5ee0: 74 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e  t is then return
5ef0: 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20   TRUE.  If not, 
5f00: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f  return FALSE..*/
5f10: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61  .static int isMa
5f20: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45  tchOfColumn(.  E
5f30: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
5f40: 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70  /* Test this exp
5f50: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
5f60: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
5f70: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ..  if( pExpr->o
5f80: 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p!=TK_FUNCTION )
5f90: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5fa0: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
5fb0: 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e  3StrICmp(pExpr->
5fc0: 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22  u.zToken,"match"
5fd0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
5fe0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
5ff0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
6000: 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  st;.  if( pList-
6010: 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20  >nExpr!=2 ){.   
6020: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6030: 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d   if( pList->a[1]
6040: 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b  .pExpr->op != TK
6050: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72  _COLUMN ){.    r
6060: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
6070: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
6080: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6090: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
60a0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ../*.** If the p
60b0: 42 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  Base expression 
60c0: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
60d0: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
60e0: 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69  ause of.** a joi
60f0: 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  n, then transfer
6100: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
6110: 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74   markings over t
6120: 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74  o derived..*/.st
6130: 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66  atic void transf
6140: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45  erJoinMarkings(E
6150: 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45  xpr *pDerived, E
6160: 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 69  xpr *pBase){.  i
6170: 66 28 20 70 44 65 72 69 76 65 64 20 29 7b 0a 20  f( pDerived ){. 
6180: 20 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c 61     pDerived->fla
6190: 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61  gs |= pBase->fla
61a0: 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  gs & EP_FromJoin
61b0: 3b 0a 20 20 20 20 70 44 65 72 69 76 65 64 2d 3e  ;.    pDerived->
61c0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
61d0: 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a  = pBase->iRightJ
61e0: 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 7d 0a  oinTable;.  }.}.
61f0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
6200: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
6210: 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64  IMIZATION) && !d
6220: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6230: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a  IT_SUBQUERY)./*.
6240: 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72  ** Analyze a ter
6250: 6d 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  m that consists 
6260: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f  of two or more O
6270: 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73  R-connected.** s
6280: 75 62 74 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a  ubterms.  So in:
6290: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57  .**.**     ... W
62a0: 48 45 52 45 20 20 28 61 3d 35 29 20 41 4e 44 20  HERE  (a=5) AND 
62b0: 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52 20 64  (b=7 OR c=9 OR d
62c0: 3d 31 33 29 20 41 4e 44 20 28 64 3d 31 33 29 0a  =13) AND (d=13).
62d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
62e0: 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e              ^^^^
62f0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
6300: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6310: 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 65 72  ine analyzes ter
6320: 6d 73 20 73 75 63 68 20 61 73 20 74 68 65 20 6d  ms such as the m
6330: 69 64 64 6c 65 20 74 65 72 6d 20 69 6e 20 74 68  iddle term in th
6340: 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e  e above example.
6350: 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72 54 65 72  .** A WhereOrTer
6360: 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6d 70  m object is comp
6370: 75 74 65 64 20 61 6e 64 20 61 74 74 61 63 68 65  uted and attache
6380: 64 20 74 6f 20 74 68 65 20 74 65 72 6d 20 75 6e  d to the term un
6390: 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c  der.** analysis,
63a0: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   regardless of t
63b0: 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68  he outcome of th
63c0: 65 20 61 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e  e analysis.  Hen
63d0: 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  ce:.**.**     Wh
63e0: 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 20  ereTerm.wtFlags 
63f0: 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46    |=  TERM_ORINF
6400: 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  O.**     WhereTe
6410: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20  rm.u.pOrInfo  = 
6420: 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61   a dynamically a
6430: 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 4f 72  llocated WhereOr
6440: 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a  Term object.**.*
6450: 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67  * The term being
6460: 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74 20 68   analyzed must h
6470: 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ave two or more 
6480: 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  of OR-connected 
6490: 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73  subterms..** A s
64a0: 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20 6d 69  ingle subterm mi
64b0: 67 68 74 20 62 65 20 61 20 73 65 74 20 6f 66 20  ght be a set of 
64c0: 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75  AND-connected su
64d0: 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45  b-subterms..** E
64e0: 78 61 6d 70 6c 65 73 20 6f 66 20 74 65 72 6d 73  xamples of terms
64f0: 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69 73 3a   under analysis:
6500: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29 20 20  .**.**     (A)  
6510: 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20     t1.x=t2.y OR 
6520: 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e  t1.x=t2.z OR t1.
6530: 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e  y=15 OR t1.z=t3.
6540: 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29 20 20  a+5.**     (B)  
6550: 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 65 78     x=expr1 OR ex
6560: 70 72 32 3d 78 20 4f 52 20 78 3d 65 78 70 72 33  pr2=x OR x=expr3
6570: 0a 2a 2a 20 20 20 20 20 28 43 29 20 20 20 20 20  .**     (C)     
6580: 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28 74 31  t1.x=t2.y OR (t1
6590: 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79  .x=t2.z AND t1.y
65a0: 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28 44 29 20  =15).**     (D) 
65b0: 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 28      x=expr1 OR (
65c0: 79 3e 31 31 20 41 4e 44 20 79 3c 32 32 20 41 4e  y>11 AND y<22 AN
65d0: 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f  D z LIKE '*hello
65e0: 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45 29 20 20  *').**     (E)  
65f0: 20 20 20 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e     (p.a=1 AND q.
6600: 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f  b=2 AND r.c=3) O
6610: 52 20 28 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79  R (p.x=4 AND q.y
6620: 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a  =5 AND r.z=6).**
6630: 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a  .** CASE 1:.**.*
6640: 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d  * If all subterm
6650: 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72  s are of the for
6660: 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72 20 73  m T.C=expr for s
6670: 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  ome single colum
6680: 6e 20 6f 66 20 43 20 61 6e 64 0a 2a 2a 20 61 20  n of C and.** a 
6690: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28  single table T (
66a0: 61 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d  as shown in exam
66b0: 70 6c 65 20 42 20 61 62 6f 76 65 29 20 74 68 65  ple B above) the
66c0: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76  n create a new v
66d0: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74  irtual.** term t
66e0: 68 61 74 20 69 73 20 61 6e 20 65 71 75 69 76 61  hat is an equiva
66f0: 6c 65 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69  lent IN expressi
6700: 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
6710: 72 64 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d  rds, if the term
6720: 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  .** being analyz
6730: 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed is:.**.**    
6740: 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20    x = expr1  OR 
6750: 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20   expr2 = x  OR  
6760: 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20  x = expr3.**.** 
6770: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
6780: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c  w virtual term l
6790: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
67a0: 20 20 20 20 20 78 20 49 4e 20 28 65 78 70 72 31       x IN (expr1
67b0: 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a  ,expr2,expr3).**
67c0: 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a  .** CASE 2:.**.*
67d0: 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d  * If all subterm
67e0: 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20  s are indexable 
67f0: 62 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  by a single tabl
6800: 65 20 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a  e T, then set.**
6810: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
6820: 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20  m.eOperator     
6830: 20 20 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f           =  WO_O
6840: 52 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  R.**     WhereTe
6850: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  rm.u.pOrInfo->in
6860: 64 65 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65  dexable  |=  the
6870: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
6880: 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a  or table T.**.**
6890: 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 22 69   A subterm is "i
68a0: 6e 64 65 78 61 62 6c 65 22 20 69 66 20 69 74 20  ndexable" if it 
68b0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  is of the form.*
68c0: 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70  * "T.C <op> <exp
68d0: 72 3e 22 20 77 68 65 72 65 20 43 20 69 73 20 61  r>" where C is a
68e0: 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ny column of tab
68f0: 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70  le T and .** <op
6900: 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c  > is one of "=",
6910: 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c   "<", "<=", ">",
6920: 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22   ">=", "IS NULL"
6930: 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20  , or "IN"..** A 
6940: 73 75 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20  subterm is also 
6950: 69 6e 64 65 78 61 62 6c 65 20 69 66 20 69 74 20  indexable if it 
6960: 69 73 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f  is an AND of two
6970: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73   or more.** subs
6980: 75 62 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74  ubterms at least
6990: 20 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73   one of which is
69a0: 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64   indexable.  Ind
69b0: 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73  exable AND .** s
69c0: 75 62 74 65 72 6d 73 20 68 61 76 65 20 74 68 65  ubterms have the
69d0: 69 72 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74  ir eOperator set
69e0: 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74   to WO_AND and t
69f0: 68 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41  hey have.** u.pA
6a00: 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20  ndInfo set to a 
6a10: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
6a20: 63 61 74 65 64 20 57 68 65 72 65 41 6e 64 54 65  cated WhereAndTe
6a30: 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  rm object..**.**
6a40: 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f   From another po
6a50: 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e  int of view, "in
6a60: 64 65 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74  dexable" means t
6a70: 68 61 74 20 74 68 65 20 73 75 62 74 65 72 6d 20  hat the subterm 
6a80: 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69  could.** potenti
6a90: 61 6c 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  ally be used wit
6aa0: 68 20 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e  h an index if an
6ab0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64   appropriate ind
6ac0: 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68  ex exists..** Th
6ad0: 69 73 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73  is analysis does
6ae0: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68   not consider wh
6af0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
6b00: 20 69 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74   index exists; t
6b10: 68 61 74 0a 2a 2a 20 69 73 20 64 65 63 69 64 65  hat.** is decide
6b20: 64 20 65 6c 73 65 77 68 65 72 65 2e 20 20 54 68  d elsewhere.  Th
6b30: 69 73 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  is analysis only
6b40: 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65   looks at whethe
6b50: 72 20 73 75 62 74 65 72 6d 73 0a 2a 2a 20 61 70  r subterms.** ap
6b60: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
6b70: 64 65 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a  dexing exist..**
6b80: 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73  .** All examples
6b90: 20 41 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f   A through E abo
6ba0: 76 65 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ve satisfy case 
6bb0: 32 2e 20 20 42 75 74 20 69 66 20 61 20 74 65 72  2.  But if a ter
6bc0: 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74 69 73  m.** also statis
6bd0: 66 69 65 73 20 63 61 73 65 20 31 20 28 73 75 63  fies case 1 (suc
6be0: 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f 77 20  h as B) we know 
6bf0: 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a  that the optimiz
6c00: 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79  er will.** alway
6c10: 73 20 70 72 65 66 65 72 20 63 61 73 65 20 31 2c  s prefer case 1,
6c20: 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65   so in that case
6c30: 20 77 65 20 70 72 65 74 65 6e 64 20 74 68 61 74   we pretend that
6c40: 20 63 61 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a   case 2 is not.*
6c50: 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a  * satisfied..**.
6c60: 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65 20 74  ** It might be t
6c70: 68 65 20 63 61 73 65 20 74 68 61 74 20 6d 75 6c  he case that mul
6c80: 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61 72 65  tiple tables are
6c90: 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f 72   indexable.  For
6ca0: 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29   example,.** (E)
6cb0: 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65 78 61   above is indexa
6cc0: 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c  ble on tables P,
6cd0: 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a   Q, and R..**.**
6ce0: 20 54 65 72 6d 73 20 74 68 61 74 20 73 61 74 69   Terms that sati
6cf0: 73 66 79 20 63 61 73 65 20 32 20 61 72 65 20 63  sfy case 2 are c
6d00: 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6c 6f  andidates for lo
6d10: 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a  okup by using.**
6d20: 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65   separate indice
6d30: 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 64 73  s to find rowids
6d40: 20 66 6f 72 20 65 61 63 68 20 73 75 62 74 65 72   for each subter
6d50: 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a  m and composing.
6d60: 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20  ** the union of 
6d70: 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 6e 67  all rowids using
6d80: 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74   a RowSet object
6d90: 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  .  This is simil
6da0: 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70  ar.** to "bitmap
6db0: 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f 74 68   indices" in oth
6dc0: 65 72 20 64 61 74 61 62 61 73 65 20 65 6e 67 69  er database engi
6dd0: 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52  nes..**.** OTHER
6de0: 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  WISE:.**.** If n
6df0: 65 69 74 68 65 72 20 63 61 73 65 20 31 20 6e 6f  either case 1 no
6e00: 72 20 63 61 73 65 20 32 20 61 70 70 6c 79 2c 20  r case 2 apply, 
6e10: 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20 65  then leave the e
6e20: 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 0a  Operator set to.
6e30: 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 74  ** zero.  This t
6e40: 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 75  erm is not usefu
6e50: 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f  l for search..*/
6e60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
6e70: 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a  rAnalyzeOrTerm(.
6e80: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
6ea0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
6eb0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
6ec0: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
6ed0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48   the complete WH
6ee0: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
6ef0: 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20  int idxTerm     
6f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
6f10: 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 72  ex of the OR-ter
6f20: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
6f30: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
6f40: 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43  fo *pWInfo = pWC
6f50: 2d 3e 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  ->pWInfo;       
6f60: 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
6f70: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
6f80: 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
6f90: 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
6fa0: 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  >pParse;        
6fb0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
6fc0: 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
6fd0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
6fe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6ff0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
7000: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ection */.  Wher
7010: 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26  eTerm *pTerm = &
7020: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
7030: 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20      /* The term 
7040: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
7050: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
7060: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20  = pTerm->pExpr; 
7070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7080: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  he expression of
7090: 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69   the term */.  i
70a0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70c0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
70d0: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65  ounters */.  Whe
70e0: 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b  reClause *pOrWc;
70f0: 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b 75         /* Breaku
7100: 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f 20  p of pTerm into 
7110: 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68  subterms */.  Wh
7120: 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
7130: 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75 62  ;       /* A Sub
7140: 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65  -term within the
7150: 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 72   pOrWc */.  Wher
7160: 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f  eOrInfo *pOrInfo
7170: 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f  ;     /* Additio
7180: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
7190: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
71a0: 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61  pTerm */.  Bitma
71b0: 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20  sk chngToIN;    
71c0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74       /* Tables t
71d0: 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66  hat might satisf
71e0: 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 69  y case 1 */.  Bi
71f0: 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b  tmask indexable;
7200: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
7210: 73 20 74 68 61 74 20 61 72 65 20 69 6e 64 65 78  s that are index
7220: 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e 67  able, satisfying
7230: 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a   case 2 */..  /*
7240: 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 20  .  ** Break the 
7250: 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 69  OR clause into i
7260: 74 73 20 73 65 70 61 72 61 74 65 20 73 75 62 74  ts separate subt
7270: 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74 65  erms.  The subte
7280: 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f  rms are.  ** sto
7290: 72 65 64 20 69 6e 20 61 20 57 68 65 72 65 43 6c  red in a WhereCl
72a0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 20 63  ause structure c
72b0: 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69 6e  ontaining within
72c0: 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66 6f   the WhereOrInfo
72d0: 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  .  ** object tha
72e0: 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f  t is attached to
72f0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52   the original OR
7300: 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 20   clause term..  
7310: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 54  */.  assert( (pT
7320: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
7330: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52  TERM_DYNAMIC|TER
7340: 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e  M_ORINFO|TERM_AN
7350: 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20  DINFO))==0 );.  
7360: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
7370: 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54  p==TK_OR );.  pT
7380: 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d  erm->u.pOrInfo =
7390: 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74   pOrInfo = sqlit
73a0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
73b0: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e  b, sizeof(*pOrIn
73c0: 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 49  fo));.  if( pOrI
73d0: 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  nfo==0 ) return;
73e0: 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  .  pTerm->wtFlag
73f0: 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  s |= TERM_ORINFO
7400: 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f 72  ;.  pOrWc = &pOr
7410: 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72  Info->wc;.  wher
7420: 65 43 6c 61 75 73 65 49 6e 69 74 28 70 4f 72 57  eClauseInit(pOrW
7430: 63 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 77 68  c, pWInfo);.  wh
7440: 65 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20  ereSplit(pOrWc, 
7450: 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20  pExpr, TK_OR);. 
7460: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
7470: 70 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20  pSrc, pOrWc);.  
7480: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
7490: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
74a0: 20 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e   assert( pOrWc->
74b0: 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f  nTerm>=2 );..  /
74c0: 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74  *.  ** Compute t
74d0: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
74e0: 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69   that might sati
74f0: 73 66 79 20 63 61 73 65 73 20 31 20 6f 72 20 32  sfy cases 1 or 2
7500: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62  ..  */.  indexab
7510: 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  le = ~(Bitmask)0
7520: 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e  ;.  chngToIN = ~
7530: 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f  (Bitmask)0;.  fo
7540: 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  r(i=pOrWc->nTerm
7550: 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57  -1, pOrTerm=pOrW
7560: 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e  c->a; i>=0 && in
7570: 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f  dexable; i--, pO
7580: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  rTerm++){.    if
7590: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  ( (pOrTerm->eOpe
75a0: 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c  rator & WO_SINGL
75b0: 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  E)==0 ){.      W
75c0: 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e  hereAndInfo *pAn
75d0: 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73  dInfo;.      ass
75e0: 65 72 74 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77  ert( (pOrTerm->w
75f0: 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 41  tFlags & (TERM_A
7600: 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e  NDINFO|TERM_ORIN
7610: 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  FO))==0 );.     
7620: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20   chngToIN = 0;. 
7630: 20 20 20 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20       pAndInfo = 
7640: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
7650: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
7660: 41 6e 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20  AndInfo));.     
7670: 20 69 66 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b   if( pAndInfo ){
7680: 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c  .        WhereCl
7690: 61 75 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20  ause *pAndWC;.  
76a0: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
76b0: 2a 70 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20  *pAndTerm;.     
76c0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
76d0: 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b    Bitmask b = 0;
76e0: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
76f0: 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70  ->u.pAndInfo = p
7700: 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AndInfo;.       
7710: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
7720: 73 20 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46  s |= TERM_ANDINF
7730: 4f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  O;.        pOrTe
7740: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
7750: 57 4f 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20  WO_AND;.        
7760: 70 41 6e 64 57 43 20 3d 20 26 70 41 6e 64 49 6e  pAndWC = &pAndIn
7770: 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20  fo->wc;.        
7780: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
7790: 70 41 6e 64 57 43 2c 20 70 57 43 2d 3e 70 57 49  pAndWC, pWC->pWI
77a0: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 77 68  nfo);.        wh
77b0: 65 72 65 53 70 6c 69 74 28 70 41 6e 64 57 43 2c  ereSplit(pAndWC,
77c0: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c   pOrTerm->pExpr,
77d0: 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 20 20   TK_AND);.      
77e0: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
77f0: 28 70 53 72 63 2c 20 70 41 6e 64 57 43 29 3b 0a  (pSrc, pAndWC);.
7800: 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 2d 3e          pAndWC->
7810: 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20  pOuter = pWC;.  
7820: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7830: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7840: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
7850: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
7860: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  d ){.          f
7870: 6f 72 28 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d  or(j=0, pAndTerm
7880: 3d 70 41 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41  =pAndWC->a; j<pA
7890: 6e 64 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b  ndWC->nTerm; j++
78a0: 2c 20 70 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20  , pAndTerm++){. 
78b0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
78c0: 74 28 20 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78  t( pAndTerm->pEx
78d0: 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pr );.          
78e0: 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28    if( allowedOp(
78f0: 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d  pAndTerm->pExpr-
7900: 3e 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >op) ){.        
7910: 20 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61        b |= getMa
7920: 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
7930: 6b 53 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e  kSet, pAndTerm->
7940: 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20  leftCursor);.   
7950: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7960: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
7970: 0a 20 20 20 20 20 20 20 20 69 6e 64 65 78 61 62  .        indexab
7980: 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d  le &= b;.      }
7990: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
79a0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
79b0: 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b  & TERM_COPIED ){
79c0: 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74  .      /* Skip t
79d0: 68 69 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77  his term for now
79e0: 2e 20 20 57 65 20 72 65 76 69 73 69 74 20 69 74  .  We revisit it
79f0: 20 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73   when we process
7a00: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f   the.      ** co
7a10: 72 72 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d  rresponding TERM
7a20: 5f 56 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f  _VIRTUAL term */
7a30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7a40: 20 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20    Bitmask b;.   
7a50: 20 20 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 26     b = getMask(&
7a60: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
7a70: 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  , pOrTerm->leftC
7a80: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66  ursor);.      if
7a90: 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61  ( pOrTerm->wtFla
7aa0: 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
7ab0: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65  L ){.        Whe
7ac0: 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d  reTerm *pOther =
7ad0: 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65   &pOrWc->a[pOrTe
7ae0: 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20  rm->iParent];.  
7af0: 20 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61        b |= getMa
7b00: 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
7b10: 6b 53 65 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65  kSet, pOther->le
7b20: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
7b30: 20 7d 0a 20 20 20 20 20 20 69 6e 64 65 78 61 62   }.      indexab
7b40: 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 69  le &= b;.      i
7b50: 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  f( (pOrTerm->eOp
7b60: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d  erator & WO_EQ)=
7b70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  =0 ){.        ch
7b80: 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20  ngToIN = 0;.    
7b90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7ba0: 20 63 68 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a   chngToIN &= b;.
7bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7bc0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63  }..  /*.  ** Rec
7bd0: 6f 72 64 20 74 68 65 20 73 65 74 20 6f 66 20 74  ord the set of t
7be0: 61 62 6c 65 73 20 74 68 61 74 20 73 61 74 69 73  ables that satis
7bf0: 66 79 20 63 61 73 65 20 32 2e 20 20 54 68 65 20  fy case 2.  The 
7c00: 73 65 74 20 6d 69 67 68 74 20 62 65 0a 20 20 2a  set might be.  *
7c10: 2a 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  * empty..  */.  
7c20: 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
7c30: 6c 65 20 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a  le = indexable;.
7c40: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
7c50: 6f 72 20 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d  or = indexable==
7c60: 30 20 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a  0 ? 0 : WO_OR;..
7c70: 20 20 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f    /*.  ** chngTo
7c80: 49 4e 20 68 6f 6c 64 73 20 61 20 73 65 74 20 6f  IN holds a set o
7c90: 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 2a 6d  f tables that *m
7ca0: 69 67 68 74 2a 20 73 61 74 69 73 66 79 20 63 61  ight* satisfy ca
7cb0: 73 65 20 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20  se 1.  But.  ** 
7cc0: 77 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f  we have to do so
7cd0: 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68  me additional ch
7ce0: 65 63 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66  ecking to see if
7cf0: 20 63 61 73 65 20 31 20 72 65 61 6c 6c 79 0a 20   case 1 really. 
7d00: 20 2a 2a 20 69 73 20 73 61 74 69 73 66 69 65 64   ** is satisfied
7d10: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67  ..  **.  ** chng
7d20: 54 6f 49 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65  ToIN will hold e
7d30: 69 74 68 65 72 20 30 2c 20 31 2c 20 6f 72 20 32  ither 0, 1, or 2
7d40: 20 62 69 74 73 2e 20 20 54 68 65 20 30 2d 62 69   bits.  The 0-bi
7d50: 74 20 63 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a  t case means.  *
7d60: 2a 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  * that there is 
7d70: 6e 6f 20 70 6f 73 73 69 62 69 6c 69 74 79 20 6f  no possibility o
7d80: 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74  f transforming t
7d90: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74  he OR clause int
7da0: 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65  o an.  ** IN ope
7db0: 72 61 74 6f 72 20 62 65 63 61 75 73 65 20 6f 6e  rator because on
7dc0: 65 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20  e or more terms 
7dd0: 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  in the OR clause
7de0: 20 63 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f   contain.  ** so
7df0: 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
7e00: 61 6e 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d  an == on a colum
7e10: 6e 20 69 6e 20 74 68 65 20 73 69 6e 67 6c 65 20  n in the single 
7e20: 74 61 62 6c 65 2e 20 20 54 68 65 20 31 2d 62 69  table.  The 1-bi
7e30: 74 0a 20 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e  t.  ** case mean
7e40: 73 20 74 68 61 74 20 65 76 65 72 79 20 74 65 72  s that every ter
7e50: 6d 20 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75  m of the OR clau
7e60: 73 65 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  se is of the for
7e70: 6d 0a 20 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f  m.  ** "table.co
7e80: 6c 75 6d 6e 3d 65 78 70 72 22 20 66 6f 72 20 73  lumn=expr" for s
7e90: 6f 6d 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  ome single table
7ea0: 2e 20 20 54 68 65 20 6f 6e 65 20 62 69 74 20 74  .  The one bit t
7eb0: 68 61 74 20 69 73 20 73 65 74 0a 20 20 2a 2a 20  hat is set.  ** 
7ec0: 77 69 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20  will correspond 
7ed0: 74 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61  to the common ta
7ee0: 62 6c 65 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e  ble.  We still n
7ef0: 65 65 64 20 74 6f 20 63 68 65 63 6b 20 74 6f 20  eed to check to 
7f00: 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 74  make.  ** sure t
7f10: 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69  he same column i
7f20: 73 20 75 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65  s used on all te
7f30: 72 6d 73 2e 20 20 54 68 65 20 32 2d 62 69 74 20  rms.  The 2-bit 
7f40: 63 61 73 65 20 69 73 20 77 68 65 6e 0a 20 20 2a  case is when.  *
7f50: 2a 20 74 68 65 20 61 6c 6c 20 74 65 72 6d 73 20  * the all terms 
7f60: 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  are of the form 
7f70: 22 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74  "table1.column=t
7f80: 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20  able2.column".  
7f90: 49 74 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  It.  ** might be
7fa0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 6f 72   possible to for
7fb0: 6d 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  m an IN operator
7fc0: 20 77 69 74 68 20 65 69 74 68 65 72 20 74 61 62   with either tab
7fd0: 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20  le1.column.  ** 
7fe0: 6f 72 20 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e  or table2.column
7ff0: 20 61 73 20 74 68 65 20 4c 48 53 20 69 66 20 65   as the LHS if e
8000: 69 74 68 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20  ither is common 
8010: 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  to every term of
8020: 0a 20 20 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61  .  ** the OR cla
8030: 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  use..  **.  ** N
8040: 6f 74 65 20 74 68 61 74 20 74 65 72 6d 73 20 6f  ote that terms o
8050: 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c  f the form "tabl
8060: 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e  e.column1=table.
8070: 63 6f 6c 75 6d 6e 32 22 20 28 74 68 65 0a 20 20  column2" (the.  
8080: 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e  ** same table on
8090: 20 62 6f 74 68 20 73 69 7a 65 73 20 6f 66 20 74   both sizes of t
80a0: 68 65 20 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65  he ==) cannot be
80b0: 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f   optimized..  */
80c0: 0a 20 20 69 66 28 20 63 68 6e 67 54 6f 49 4e 20  .  if( chngToIN 
80d0: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43  ){.    int okToC
80e0: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20  hngToIN = 0;    
80f0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
8100: 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e  conversion to IN
8110: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20   is valid */.   
8120: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d   int iColumn = -
8130: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  1;         /* Co
8140: 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68  lumn index on lh
8150: 73 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  s of IN operator
8160: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72   */.    int iCur
8170: 73 6f 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  sor = -1;       
8180: 20 20 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f    /* Table curso
8190: 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  r common to all 
81a0: 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74  terms */.    int
81b0: 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   j = 0;         
81c0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
81d0: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f  ounter */..    /
81e0: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74  * Search for a t
81f0: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  able and column 
8200: 74 68 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20  that appears on 
8210: 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a  one side or the.
8220: 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20      ** other of 
8230: 74 68 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20  the == operator 
8240: 69 6e 20 65 76 65 72 79 20 73 75 62 74 65 72 6d  in every subterm
8250: 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 61 6e  .  That table an
8260: 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20  d column.    ** 
8270: 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64  will be recorded
8280: 20 69 6e 20 69 43 75 72 73 6f 72 20 61 6e 64 20   in iCursor and 
8290: 69 43 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20  iColumn.  There 
82a0: 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 6e 79  might not be any
82b0: 0a 20 20 20 20 2a 2a 20 73 75 63 68 20 74 61 62  .    ** such tab
82c0: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20  le and column.  
82d0: 53 65 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  Set okToChngToIN
82e0: 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61   if an appropria
82f0: 74 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  te table.    ** 
8300: 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f  and column is fo
8310: 75 6e 64 20 62 75 74 20 6c 65 61 76 65 20 6f 6b  und but leave ok
8320: 54 6f 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65  ToChngToIN false
8330: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   if not found.. 
8340: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d     */.    for(j=
8350: 30 3b 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43  0; j<2 && !okToC
8360: 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20  hngToIN; j++){. 
8370: 20 20 20 20 20 70 4f 72 54 65 72 6d 20 3d 20 70       pOrTerm = p
8380: 4f 72 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66  OrWc->a;.      f
8390: 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  or(i=pOrWc->nTer
83a0: 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  m-1; i>=0; i--, 
83b0: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
83c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
83d0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
83e0: 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
83f0: 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61    pOrTerm->wtFla
8400: 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f  gs &= ~TERM_OR_O
8410: 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  K;.        if( p
8420: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
8430: 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  or==iCursor ){. 
8440: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
8450: 20 69 73 20 74 68 65 20 32 2d 62 69 74 20 63 61   is the 2-bit ca
8460: 73 65 20 61 6e 64 20 77 65 20 61 72 65 20 6f 6e  se and we are on
8470: 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72   the second iter
8480: 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20  ation and.      
8490: 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74      ** current t
84a0: 65 72 6d 20 69 73 20 66 72 6f 6d 20 74 68 65 20  erm is from the 
84b0: 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2e  first iteration.
84c0: 20 20 53 6f 20 73 6b 69 70 20 74 68 69 73 20 74    So skip this t
84d0: 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  erm. */.        
84e0: 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29    assert( j==1 )
84f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
8500: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
8510: 20 20 20 20 20 20 20 20 69 66 28 20 28 63 68 6e          if( (chn
8520: 67 54 6f 49 4e 20 26 20 67 65 74 4d 61 73 6b 28  gToIN & getMask(
8530: 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
8540: 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  t, pOrTerm->left
8550: 43 75 72 73 6f 72 29 29 3d 3d 30 20 29 7b 0a 20  Cursor))==0 ){. 
8560: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
8570: 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 6f 66   term must be of
8580: 20 74 68 65 20 66 6f 72 6d 20 74 31 2e 61 3d 3d   the form t1.a==
8590: 74 32 2e 62 20 77 68 65 72 65 20 74 32 20 69 73  t2.b where t2 is
85a0: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
85b0: 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 73 65    ** chngToIN se
85c0: 74 20 62 75 74 20 74 31 20 69 73 20 6e 6f 74 2e  t but t1 is not.
85d0: 20 20 54 68 69 73 20 74 65 72 6d 20 77 69 6c 6c    This term will
85e0: 20 62 65 20 65 69 74 68 65 72 20 70 72 65 63 65   be either prece
85f0: 65 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  eded.          *
8600: 2a 20 6f 72 20 66 6f 6c 6c 77 65 64 20 62 79 20  * or follwed by 
8610: 61 6e 20 69 6e 76 65 72 74 65 64 20 63 6f 70 79  an inverted copy
8620: 20 28 74 32 2e 62 3d 3d 74 31 2e 61 29 2e 20 20   (t2.b==t1.a).  
8630: 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 0a  Skip this term .
8640: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
8650: 20 75 73 65 20 69 74 73 20 69 6e 76 65 72 73 69   use its inversi
8660: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  on. */.         
8670: 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65   testcase( pOrTe
8680: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
8690: 52 4d 5f 43 4f 50 49 45 44 20 29 3b 0a 20 20 20  RM_COPIED );.   
86a0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
86b0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
86c0: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
86d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
86e0: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 77  sert( pOrTerm->w
86f0: 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43  tFlags & (TERM_C
8700: 4f 50 49 45 44 7c 54 45 52 4d 5f 56 49 52 54 55  OPIED|TERM_VIRTU
8710: 41 4c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  AL) );.         
8720: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8730: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 43 6f     }.        iCo
8740: 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  lumn = pOrTerm->
8750: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
8760: 20 20 20 20 20 20 69 43 75 72 73 6f 72 20 3d 20        iCursor = 
8770: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
8780: 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65  sor;.        bre
8790: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
87a0: 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
87b0: 20 20 20 20 20 2f 2a 20 4e 6f 20 63 61 6e 64 69       /* No candi
87c0: 64 61 74 65 20 74 61 62 6c 65 2b 63 6f 6c 75 6d  date table+colum
87d0: 6e 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 54 68  n was found.  Th
87e0: 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75  is can only occu
87f0: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  r.        ** on 
8800: 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61  the second itera
8810: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
8820: 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a  assert( j==1 );.
8830: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8840: 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 63 68 6e  IsPowerOfTwo(chn
8850: 67 54 6f 49 4e 29 20 29 3b 0a 20 20 20 20 20 20  gToIN) );.      
8860: 20 20 61 73 73 65 72 74 28 20 63 68 6e 67 54 6f    assert( chngTo
8870: 49 4e 3d 3d 67 65 74 4d 61 73 6b 28 26 70 57 49  IN==getMask(&pWI
8880: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69  nfo->sMaskSet, i
8890: 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20  Cursor) );.     
88a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
88b0: 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
88c0: 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20  ( j==1 );..     
88d0: 20 2f 2a 20 57 65 20 68 61 76 65 20 66 6f 75 6e   /* We have foun
88e0: 64 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 61  d a candidate ta
88f0: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20  ble and column. 
8900: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
8910: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74   that.      ** t
8920: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  able and column 
8930: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65  is common to eve
8940: 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 4f  ry term in the O
8950: 52 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  R clause */.    
8960: 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d    okToChngToIN =
8970: 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20   1;.      for(; 
8980: 69 3e 3d 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67  i>=0 && okToChng
8990: 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  ToIN; i--, pOrTe
89a0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  rm++){.        a
89b0: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
89c0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
89d0: 51 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Q );.        if(
89e0: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
89f0: 72 73 6f 72 21 3d 69 43 75 72 73 6f 72 20 29 7b  rsor!=iCursor ){
8a00: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 54 65  .          pOrTe
8a10: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e  rm->wtFlags &= ~
8a20: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20  TERM_OR_OK;.    
8a30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
8a40: 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  rTerm->u.leftCol
8a50: 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a  umn!=iColumn ){.
8a60: 20 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68            okToCh
8a70: 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20  ngToIN = 0;.    
8a80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8a90: 20 20 20 20 20 69 6e 74 20 61 66 66 4c 65 66 74       int affLeft
8aa0: 2c 20 61 66 66 52 69 67 68 74 3b 0a 20 20 20 20  , affRight;.    
8ab0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
8ac0: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
8ad0: 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e  is also a column
8ae0: 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e  , then the affin
8af0: 69 74 69 65 73 0a 20 20 20 20 20 20 20 20 20 20  ities.          
8b00: 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69 67 68 74  ** of both right
8b10: 20 61 6e 64 20 6c 65 66 74 20 73 69 64 65 73 20   and left sides 
8b20: 6d 75 73 74 20 62 65 20 73 75 63 68 20 74 68 61  must be such tha
8b30: 74 20 6e 6f 20 74 79 70 65 0a 20 20 20 20 20 20  t no type.      
8b40: 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f      ** conversio
8b50: 6e 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ns are required 
8b60: 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 20 28  on the right.  (
8b70: 54 69 63 6b 65 74 20 23 32 32 34 39 29 0a 20 20  Ticket #2249).  
8b80: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
8b90: 20 20 20 20 20 61 66 66 52 69 67 68 74 20 3d 20       affRight = 
8ba0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
8bb0: 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78  ity(pOrTerm->pEx
8bc0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
8bd0: 20 20 20 20 20 20 20 61 66 66 4c 65 66 74 20 3d         affLeft =
8be0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
8bf0: 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45  nity(pOrTerm->pE
8c00: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
8c10: 20 20 20 20 20 20 20 69 66 28 20 61 66 66 52 69         if( affRi
8c20: 67 68 74 21 3d 30 20 26 26 20 61 66 66 52 69 67  ght!=0 && affRig
8c30: 68 74 21 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20  ht!=affLeft ){. 
8c40: 20 20 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43             okToC
8c50: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20  hngToIN = 0;.   
8c60: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
8c70: 20 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72            pOrTer
8c80: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
8c90: 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  RM_OR_OK;.      
8ca0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
8cb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
8cc0: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
8cd0: 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49  int, okToChngToI
8ce0: 4e 20 69 73 20 74 72 75 65 20 69 66 20 6f 72 69  N is true if ori
8cf0: 67 69 6e 61 6c 20 70 54 65 72 6d 20 73 61 74 69  ginal pTerm sati
8d00: 73 66 69 65 73 0a 20 20 20 20 2a 2a 20 63 61 73  sfies.    ** cas
8d10: 65 20 31 2e 20 20 49 6e 20 74 68 61 74 20 63 61  e 1.  In that ca
8d20: 73 65 2c 20 63 6f 6e 73 74 72 75 63 74 20 61 20  se, construct a 
8d30: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
8d40: 20 74 68 61 74 20 69 73 20 0a 20 20 20 20 2a 2a   that is .    **
8d50: 20 70 54 65 72 6d 20 63 6f 6e 76 65 72 74 65 64   pTerm converted
8d60: 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72   into an IN oper
8d70: 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ator..    */.   
8d80: 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49   if( okToChngToI
8d90: 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N ){.      Expr 
8da0: 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20 20 20  *pDup;          
8db0: 20 20 2f 2a 20 41 20 74 72 61 6e 73 69 65 6e 74    /* A transient
8dc0: 20 64 75 70 6c 69 63 61 74 65 20 65 78 70 72 65   duplicate expre
8dd0: 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
8de0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
8df0: 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 52 48 53   0;   /* The RHS
8e00: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
8e10: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  tor */.      Exp
8e20: 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b 20 20 20  r *pLeft = 0;   
8e30: 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f      /* The LHS o
8e40: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
8e50: 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  r */.      Expr 
8e60: 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
8e70: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
8e80: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
8e90: 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f  ..      for(i=pO
8ea0: 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f  rWc->nTerm-1, pO
8eb0: 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20  rTerm=pOrWc->a; 
8ec0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  i>=0; i--, pOrTe
8ed0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
8ee0: 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46  f( (pOrTerm->wtF
8ef0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f  lags & TERM_OR_O
8f00: 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  K)==0 ) continue
8f10: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
8f20: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
8f30: 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
8f40: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8f50: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
8f60: 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a  sor==iCursor );.
8f70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8f80: 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  pOrTerm->u.leftC
8f90: 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29  olumn==iColumn )
8fa0: 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  ;.        pDup =
8fb0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
8fc0: 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  db, pOrTerm->pEx
8fd0: 70 72 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a  pr->pRight, 0);.
8fe0: 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20          pList = 
8ff0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
9000: 70 70 65 6e 64 28 70 57 49 6e 66 6f 2d 3e 70 50  ppend(pWInfo->pP
9010: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75  arse, pList, pDu
9020: 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66  p);.        pLef
9030: 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  t = pOrTerm->pEx
9040: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
9050: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
9060: 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20   pLeft!=0 );.   
9070: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
9080: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
9090: 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  ft, 0);.      pN
90a0: 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  ew = sqlite3PExp
90b0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c  r(pParse, TK_IN,
90c0: 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20   pDup, 0, 0);.  
90d0: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
90e0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
90f0: 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e  ew;.        tran
9100: 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73  sferJoinMarkings
9110: 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20  (pNew, pExpr);. 
9120: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
9130: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9140: 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65  pNew, EP_xIsSele
9150: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ct) );.        p
9160: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70  New->x.pList = p
9170: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64  List;.        id
9180: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
9190: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
91a0: 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  ew, TERM_VIRTUAL
91b0: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
91c0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
91d0: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20  ( idxNew==0 );. 
91e0: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
91f0: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
9200: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70  xNew);.        p
9210: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
9220: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20  dxTerm];.       
9230: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e   pWC->a[idxNew].
9240: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
9250: 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  m;.        pTerm
9260: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
9270: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9280: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
9290: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
92a0: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
92b0: 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
92c0: 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50 3b 20 20  tor = WO_NOOP;  
92d0: 2f 2a 20 63 61 73 65 20 31 20 74 72 75 6d 70 73  /* case 1 trumps
92e0: 20 63 61 73 65 20 32 20 2a 2f 0a 20 20 20 20 7d   case 2 */.    }
92f0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
9300: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52   !SQLITE_OMIT_OR
9310: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26  _OPTIMIZATION &&
9320: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55   !SQLITE_OMIT_SU
9330: 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  BQUERY */../*.**
9340: 20 54 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   The input to th
9350: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
9360: 20 57 68 65 72 65 54 65 72 6d 20 73 74 72 75 63   WhereTerm struc
9370: 74 75 72 65 20 77 69 74 68 20 6f 6e 6c 79 20 74  ture with only t
9380: 68 65 0a 2a 2a 20 22 70 45 78 70 72 22 20 66 69  he.** "pExpr" fi
9390: 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20 20  eld filled in.  
93a0: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
93b0: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 61 6e  routine is to an
93c0: 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75 62  alyze the.** sub
93d0: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70  expression and p
93e0: 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74 68 65 20  opulate all the 
93f0: 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20  other fields of 
9400: 74 68 65 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a  the WhereTerm.**
9410: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
9420: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
9430: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
9440: 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e 20  rm "<expr> <op> 
9450: 58 22 20 69 74 20 67 65 74 73 20 63 6f 6d 6d 75  X" it gets commu
9460: 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  ted.** to the st
9470: 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66 20 22  andard form of "
9480: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 0a  X <op> <expr>"..
9490: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
94a0: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
94b0: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59  e form "X <op> Y
94c0: 22 20 77 68 65 72 65 20 62 6f 74 68 20 58 20 61  " where both X a
94d0: 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63 6f 6c 75  nd Y are.** colu
94e0: 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72  mns, then the or
94f0: 69 67 69 6e 61 6c 20 65 78 70 72 65 73 73 69 6f  iginal expressio
9500: 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  n is unchanged a
9510: 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  nd a new virtual
9520: 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74 68 65 20  .** term of the 
9530: 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20 58 22 20  form "Y <op> X" 
9540: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
9550: 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64  WHERE clause and
9560: 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 73 65 70  .** analyzed sep
9570: 61 72 61 74 65 6c 79 2e 20 20 54 68 65 20 6f 72  arately.  The or
9580: 69 67 69 6e 61 6c 20 74 65 72 6d 20 69 73 20 6d  iginal term is m
9590: 61 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f  arked with TERM_
95a0: 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64 20 74 68  COPIED.** and th
95b0: 65 20 6e 65 77 20 74 65 72 6d 20 69 73 20 6d 61  e new term is ma
95c0: 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f 44  rked with TERM_D
95d0: 59 4e 41 4d 49 43 20 28 62 65 63 61 75 73 65 20  YNAMIC (because 
95e0: 69 74 27 73 20 70 45 78 70 72 0a 2a 2a 20 6e 65  it's pExpr.** ne
95f0: 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
9600: 77 69 74 68 20 74 68 65 20 57 68 65 72 65 43 6c  with the WhereCl
9610: 61 75 73 65 29 20 61 6e 64 20 54 45 52 4d 5f 56  ause) and TERM_V
9620: 49 52 54 55 41 4c 20 28 62 65 63 61 75 73 65 20  IRTUAL (because 
9630: 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f 6d 6d 75  it.** is a commu
9640: 74 65 64 20 63 6f 70 79 20 6f 66 20 61 20 70 72  ted copy of a pr
9650: 69 6f 72 20 74 65 72 6d 2e 29 20 20 54 68 65 20  ior term.)  The 
9660: 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 68 61  original term ha
9670: 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20 61 6e  s nChild=1.** an
9680: 64 20 74 68 65 20 63 6f 70 79 20 68 61 73 20 69  d the copy has i
9690: 64 78 50 61 72 65 6e 74 20 73 65 74 20 74 6f 20  dxParent set to 
96a0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
96b0: 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e 0a   original term..
96c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
96d0: 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72  xprAnalyze(.  Sr
96e0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
96f0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46          /* the F
9700: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
9710: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
9720: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
9730: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
9740: 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20  .  int idxTerm  
9750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9760: 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 65 72  Index of the ter
9770: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
9780: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
9790: 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43  fo *pWInfo = pWC
97a0: 2d 3e 70 57 49 6e 66 6f 3b 20 2f 2a 20 57 48 45  ->pWInfo; /* WHE
97b0: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
97c0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
97d0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
97e0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
97f0: 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74     /* The term t
9800: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
9810: 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
9820: 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 20 20  *pMaskSet;      
9830: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 74 61      /* Set of ta
9840: 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b 73 20  ble index masks 
9850: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
9860: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9870: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
9880: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e  ression to be an
9890: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d  alyzed */.  Bitm
98a0: 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20  ask prereqLeft; 
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
98c0: 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66  Prerequesites of
98d0: 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66   the pExpr->pLef
98e0: 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  t */.  Bitmask p
98f0: 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 20  rereqAll;       
9900: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65          /* Prere
9910: 71 75 65 73 69 74 65 73 20 6f 66 20 70 45 78 70  quesites of pExp
9920: 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65  r */.  Bitmask e
9930: 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b 20 20  xtraRight = 0;  
9940: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
9950: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e   dependencies on
9960: 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20   LEFT JOIN */.  
9970: 45 78 70 72 20 2a 70 53 74 72 31 20 3d 20 30 3b  Expr *pStr1 = 0;
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9990: 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f   /* RHS of LIKE/
99a0: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
99b0: 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74  .  int isComplet
99c0: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
99d0: 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49      /* RHS of LI
99e0: 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77 69 74  KE/GLOB ends wit
99f0: 68 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20  h wildcard */.  
9a00: 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20  int noCase = 0; 
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a20: 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20 64 69   /* LIKE/GLOB di
9a30: 73 74 69 6e 67 75 69 73 68 65 73 20 63 61 73 65  stinguishes case
9a40: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a60: 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65         /* Top-le
9a70: 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20 70  vel operator.  p
9a80: 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61  Expr->op */.  Pa
9a90: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
9aa0: 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 2f  Info->pParse;  /
9ab0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
9ac0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
9ad0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9ae0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
9af0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
9b00: 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  /..  if( db->mal
9b10: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
9b20: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
9b30: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
9b40: 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b  dxTerm];.  pMask
9b50: 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  Set = &pWInfo->s
9b60: 4d 61 73 6b 53 65 74 3b 0a 20 20 70 45 78 70 72  MaskSet;.  pExpr
9b70: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
9b80: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
9b90: 2d 3e 6f 70 21 3d 54 4b 5f 41 53 20 26 26 20 70  ->op!=TK_AS && p
9ba0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
9bb0: 4c 41 54 45 20 29 3b 0a 20 20 70 72 65 72 65 71  LATE );.  prereq
9bc0: 4c 65 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65  Left = exprTable
9bd0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
9be0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
9bf0: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
9c00: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
9c10: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9c20: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
9c30: 20 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72   );.    if( Expr
9c40: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
9c50: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
9c60: 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   ){.      pTerm-
9c70: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
9c80: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
9c90: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
9ca0: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  xpr->x.pSelect);
9cb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9cc0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
9cd0: 69 67 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54  ight = exprListT
9ce0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
9cf0: 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  et, pExpr->x.pLi
9d00: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  st);.    }.  }el
9d10: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53  se if( op==TK_IS
9d20: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65 72  NULL ){.    pTer
9d30: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
9d40: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
9d50: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
9d60: 67 68 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55  ght = exprTableU
9d70: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
9d80: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
9d90: 20 7d 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d   }.  prereqAll =
9da0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
9db0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29  pMaskSet, pExpr)
9dc0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
9dd0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
9de0: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
9df0: 20 20 20 42 69 74 6d 61 73 6b 20 78 20 3d 20 67     Bitmask x = g
9e00: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
9e10: 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f   pExpr->iRightJo
9e20: 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 72  inTable);.    pr
9e30: 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20  ereqAll |= x;.  
9e40: 20 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 78    extraRight = x
9e50: 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73  -1;  /* ON claus
9e60: 65 20 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20  e terms may not 
9e70: 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
9e80: 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20 20  index.          
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
9ea0: 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66  on left table of
9eb0: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54   a LEFT JOIN.  T
9ec0: 69 63 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a 20  icket #3015 */. 
9ed0: 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72   }.  pTerm->prer
9ee0: 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c  eqAll = prereqAl
9ef0: 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74  l;.  pTerm->left
9f00: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70  Cursor = -1;.  p
9f10: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
9f20: 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70  -1;.  pTerm->eOp
9f30: 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66  erator = 0;.  if
9f40: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20  ( allowedOp(op) 
9f50: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65  ){.    Expr *pLe
9f60: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
9f70: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70  SkipCollate(pExp
9f80: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 45  r->pLeft);.    E
9f90: 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 73 71  xpr *pRight = sq
9fa0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
9fb0: 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67  late(pExpr->pRig
9fc0: 68 74 29 3b 0a 20 20 20 20 75 31 36 20 6f 70 4d  ht);.    u16 opM
9fd0: 61 73 6b 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72  ask = (pTerm->pr
9fe0: 65 72 65 71 52 69 67 68 74 20 26 20 70 72 65 72  ereqRight & prer
9ff0: 65 71 4c 65 66 74 29 3d 3d 30 20 3f 20 57 4f 5f  eqLeft)==0 ? WO_
a000: 41 4c 4c 20 3a 20 57 4f 5f 45 51 55 49 56 3b 0a  ALL : WO_EQUIV;.
a010: 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f      if( pLeft->o
a020: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
a030: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66        pTerm->lef
a040: 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d  tCursor = pLeft-
a050: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
a060: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
a070: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
a080: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  umn;.      pTerm
a090: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70  ->eOperator = op
a0a0: 65 72 61 74 6f 72 4d 61 73 6b 28 6f 70 29 20 26  eratorMask(op) &
a0b0: 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20   opMask;.    }. 
a0c0: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 26 26     if( pRight &&
a0d0: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
a0e0: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
a0f0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b  WhereTerm *pNew;
a100: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75  .      Expr *pDu
a110: 70 3b 0a 20 20 20 20 20 20 75 31 36 20 65 45 78  p;.      u16 eEx
a120: 74 72 61 4f 70 20 3d 20 30 3b 20 20 20 20 20 20  traOp = 0;      
a130: 20 20 2f 2a 20 45 78 74 72 61 20 62 69 74 73 20    /* Extra bits 
a140: 66 6f 72 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61  for pNew->eOpera
a150: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  tor */.      if(
a160: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
a170: 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  or>=0 ){.       
a180: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
a190: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
a1a0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
a1b0: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
a1c0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
a1d0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
a1e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
a1f0: 65 6c 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b  elete(db, pDup);
a200: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
a210: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
a220: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
a230: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
a240: 70 57 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f  pWC, pDup, TERM_
a250: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
a260: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69  AMIC);.        i
a270: 66 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72  f( idxNew==0 ) r
a280: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70  eturn;.        p
a290: 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  New = &pWC->a[id
a2a0: 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 70  xNew];.        p
a2b0: 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  New->iParent = i
a2c0: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  dxTerm;.        
a2d0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
a2e0: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
a2f0: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
a300: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65  = 1;.        pTe
a310: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
a320: 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20  ERM_COPIED;.    
a330: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
a340: 70 3d 3d 54 4b 5f 45 51 0a 20 20 20 20 20 20 20  p==TK_EQ.       
a350: 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
a360: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
a370: 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20  FromJoin).      
a380: 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
a390: 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
a3a0: 4c 49 54 45 5f 54 72 61 6e 73 69 74 69 76 65 29  LITE_Transitive)
a3b0: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
a3c0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
a3d0: 65 72 61 74 6f 72 20 7c 3d 20 57 4f 5f 45 51 55  erator |= WO_EQU
a3e0: 49 56 3b 0a 20 20 20 20 20 20 20 20 20 20 65 45  IV;.          eE
a3f0: 78 74 72 61 4f 70 20 3d 20 57 4f 5f 45 51 55 49  xtraOp = WO_EQUI
a400: 56 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  V;.        }.   
a410: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a420: 20 20 70 44 75 70 20 3d 20 70 45 78 70 72 3b 0a    pDup = pExpr;.
a430: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70          pNew = p
a440: 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
a450: 20 20 20 20 65 78 70 72 43 6f 6d 6d 75 74 65 28      exprCommute(
a460: 70 50 61 72 73 65 2c 20 70 44 75 70 29 3b 0a 20  pParse, pDup);. 
a470: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
a480: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
a490: 61 74 65 28 70 44 75 70 2d 3e 70 4c 65 66 74 29  ate(pDup->pLeft)
a4a0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65  ;.      pNew->le
a4b0: 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74  ftCursor = pLeft
a4c0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
a4d0: 70 4e 65 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  pNew->u.leftColu
a4e0: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
a4f0: 75 6d 6e 3b 0a 20 20 20 20 20 20 74 65 73 74 63  umn;.      testc
a500: 61 73 65 28 20 28 70 72 65 72 65 71 4c 65 66 74  ase( (prereqLeft
a510: 20 7c 20 65 78 74 72 61 52 69 67 68 74 29 20 21   | extraRight) !
a520: 3d 20 70 72 65 72 65 71 4c 65 66 74 20 29 3b 0a  = prereqLeft );.
a530: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
a540: 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71  eqRight = prereq
a550: 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68  Left | extraRigh
a560: 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  t;.      pNew->p
a570: 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65  rereqAll = prere
a580: 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77  qAll;.      pNew
a590: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 28 6f  ->eOperator = (o
a5a0: 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 44 75 70  peratorMask(pDup
a5b0: 2d 3e 6f 70 29 20 2b 20 65 45 78 74 72 61 4f 70  ->op) + eExtraOp
a5c0: 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20  ) & opMask;.    
a5d0: 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  }.  }..#ifndef S
a5e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
a5f0: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  EN_OPTIMIZATION.
a600: 20 20 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69    /* If a term i
a610: 73 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70  s the BETWEEN op
a620: 65 72 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74  erator, create t
a630: 77 6f 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74  wo new virtual t
a640: 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64  erms.  ** that d
a650: 65 66 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20  efine the range 
a660: 74 68 61 74 20 74 68 65 20 42 45 54 57 45 45 4e  that the BETWEEN
a670: 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f   implements.  Fo
a680: 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  r example:.  **.
a690: 20 20 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57    **      a BETW
a6a0: 45 45 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a  EEN b AND c.  **
a6b0: 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74  .  ** is convert
a6c0: 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20  ed into:.  **.  
a6d0: 2a 2a 20 20 20 20 20 20 28 61 20 42 45 54 57 45  **      (a BETWE
a6e0: 45 4e 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20  EN b AND c) AND 
a6f0: 28 61 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63  (a>=b) AND (a<=c
a700: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
a710: 74 77 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72  two new terms ar
a720: 65 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65  e added onto the
a730: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72   end of the Wher
a740: 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a  eClause object..
a750: 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72    ** The new ter
a760: 6d 73 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22  ms are "dynamic"
a770: 20 61 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65   and are childre
a780: 6e 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  n of the origina
a790: 6c 20 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74  l BETWEEN.  ** t
a7a0: 65 72 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73  erm.  That means
a7b0: 20 74 68 61 74 20 69 66 20 74 68 65 20 42 45 54   that if the BET
a7c0: 57 45 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64  WEEN term is cod
a7d0: 65 64 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e  ed, the children
a7e0: 20 61 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65   are.  ** skippe
a7f0: 64 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63  d.  Or, if the c
a800: 68 69 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69  hildren are sati
a810: 73 66 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65  sfied by an inde
a820: 78 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  x, the original.
a830: 20 20 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72    ** BETWEEN ter
a840: 6d 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20  m is skipped..  
a850: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45  */.  else if( pE
a860: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57  xpr->op==TK_BETW
a870: 45 45 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d  EEN && pWC->op==
a880: 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78  TK_AND ){.    Ex
a890: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
a8a0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
a8b0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
a8c0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f  tatic const u8 o
a8d0: 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54  ps[] = {TK_GE, T
a8e0: 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72  K_LE};.    asser
a8f0: 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20  t( pList!=0 );. 
a900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
a910: 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20  ->nExpr==2 );.  
a920: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
a930: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
a940: 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20   *pNewExpr;.    
a950: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
a960: 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73      pNewExpr = s
a970: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
a980: 73 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20  se, ops[i], .   
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a9b0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
a9c0: 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20  pr->pLeft, 0),. 
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a9f0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
aa00: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
aa10: 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  , 0), 0);.      
aa20: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
aa30: 69 6e 67 73 28 70 4e 65 77 45 78 70 72 2c 20 70  ings(pNewExpr, p
aa40: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 64 78  Expr);.      idx
aa50: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
aa60: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
aa70: 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54  wExpr, TERM_VIRT
aa80: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
aa90: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
aaa0: 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a  e( idxNew==0 );.
aab0: 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a        exprAnalyz
aac0: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
aad0: 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72  New);.      pTer
aae0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
aaf0: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d  erm];.      pWC-
ab00: 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65  >a[idxNew].iPare
ab10: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
ab20: 20 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e    }.    pTerm->n
ab30: 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23  Child = 2;.  }.#
ab40: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
ab50: 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54  OMIT_BETWEEN_OPT
ab60: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
ab70: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
ab80: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
ab90: 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69  ZATION) && !defi
aba0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
abb0: 53 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41  SUBQUERY).  /* A
abc0: 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68  nalyze a term th
abd0: 61 74 20 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f  at is composed o
abe0: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75  f two or more su
abf0: 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64  bterms connected
ac00: 20 62 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f   by.  ** an OR o
ac10: 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20  perator..  */.  
ac20: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
ac30: 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20  op==TK_OR ){.   
ac40: 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e 6f 70   assert( pWC->op
ac50: 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20  ==TK_AND );.    
ac60: 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72  exprAnalyzeOrTer
ac70: 6d 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  m(pSrc, pWC, idx
ac80: 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d  Term);.    pTerm
ac90: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
aca0: 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  rm];.  }.#endif 
acb0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  /* SQLITE_OMIT_O
acc0: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  R_OPTIMIZATION *
acd0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
ace0: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
acf0: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64  MIZATION.  /* Ad
ad00: 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  d constraints to
ad10: 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72   reduce the sear
ad20: 63 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49  ch space on a LI
ad30: 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20  KE or GLOB.  ** 
ad40: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20  operator..  **. 
ad50: 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65   ** A like patte
ad60: 72 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rn of the form "
ad70: 78 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20 69  x LIKE 'abc%'" i
ad80: 73 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63  s changed into c
ad90: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a  onstraints.  **.
ada0: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e    **          x>
adb0: 3d 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61 62  ='abc' AND x<'ab
adc0: 64 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61  d' AND x LIKE 'a
add0: 62 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  bc%'.  **.  ** T
ade0: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
adf0: 72 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 20  r of the prefix 
ae00: 22 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65  "abc" is increme
ae10: 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65  nted to form the
ae20: 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f  .  ** terminatio
ae30: 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64  n condition "abd
ae40: 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  "..  */.  if( pW
ae50: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20  C->op==TK_AND . 
ae60: 20 20 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f    && isLikeOrGlo
ae70: 62 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  b(pParse, pExpr,
ae80: 20 26 70 53 74 72 31 2c 20 26 69 73 43 6f 6d 70   &pStr1, &isComp
ae90: 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20  lete, &noCase). 
aea0: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c   ){.    Expr *pL
aeb0: 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 48  eft;       /* LH
aec0: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f  S of LIKE/GLOB o
aed0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45  perator */.    E
aee0: 78 70 72 20 2a 70 53 74 72 32 3b 20 20 20 20 20  xpr *pStr2;     
aef0: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53 74    /* Copy of pSt
af00: 72 31 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b 45  r1 - RHS of LIKE
af10: 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a  /GLOB operator *
af20: 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  /.    Expr *pNew
af30: 45 78 70 72 31 3b 0a 20 20 20 20 45 78 70 72 20  Expr1;.    Expr 
af40: 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20  *pNewExpr2;.    
af50: 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20 20 20  int idxNew1;.   
af60: 20 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20 20   int idxNew2;.  
af70: 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6c 53 65 71    Token sCollSeq
af80: 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f  Name;  /* Name o
af90: 66 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  f collating sequ
afa0: 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65  ence */..    pLe
afb0: 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ft = pExpr->x.pL
afc0: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
afd0: 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c  .    pStr2 = sql
afe0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
aff0: 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69  pStr1, 0);.    i
b000: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
b010: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38  iled ){.      u8
b020: 20 63 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f   c, *pC;       /
b030: 2a 20 4c 61 73 74 20 63 68 61 72 61 63 74 65 72  * Last character
b040: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
b050: 74 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20  t wildcard */.  
b060: 20 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70      pC = (u8*)&p
b070: 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73  Str2->u.zToken[s
b080: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
b090: 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d  Str2->u.zToken)-
b0a0: 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70  1];.      c = *p
b0b0: 43 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43  C;.      if( noC
b0c0: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ase ){.        /
b0d0: 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74  * The point is t
b0e0: 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
b0f0: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62  last character b
b100: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a  efore the first.
b110: 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63          ** wildc
b120: 61 72 64 2e 20 20 42 75 74 20 69 66 20 77 65 20  ard.  But if we 
b130: 69 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74  increment '@', t
b140: 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74  hat will push it
b150: 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
b160: 20 20 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20    ** alphabetic 
b170: 72 61 6e 67 65 20 77 68 65 72 65 20 63 61 73 65  range where case
b180: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c   conversions wil
b190: 6c 20 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20  l mess up the . 
b1a0: 20 20 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61         ** inequa
b1b0: 6c 69 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20  lity.  To avoid 
b1c0: 74 68 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  this, make sure 
b1d0: 74 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20  to also run the 
b1e0: 66 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  full.        ** 
b1f0: 4c 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64  LIKE on all cand
b200: 69 64 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  idate expression
b210: 73 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68  s by clearing th
b220: 65 20 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61  e isComplete fla
b230: 67 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  g.        */.   
b240: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d       if( c=='A'-
b250: 31 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d  1 ) isComplete =
b260: 20 30 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   0;.        c = 
b270: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
b280: 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a  wer[c];.      }.
b290: 20 20 20 20 20 20 2a 70 43 20 3d 20 63 20 2b 20        *pC = c + 
b2a0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 6f  1;.    }.    sCo
b2b0: 6c 6c 53 65 71 4e 61 6d 65 2e 7a 20 3d 20 6e 6f  llSeqName.z = no
b2c0: 43 61 73 65 20 3f 20 22 4e 4f 43 41 53 45 22 20  Case ? "NOCASE" 
b2d0: 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  : "BINARY";.    
b2e0: 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e 6e 20 3d  sCollSeqName.n =
b2f0: 20 36 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72   6;.    pNewExpr
b300: 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  1 = sqlite3ExprD
b310: 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29  up(db, pLeft, 0)
b320: 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31 20  ;.    pNewExpr1 
b330: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
b340: 50 61 72 73 65 2c 20 54 4b 5f 47 45 2c 20 0a 20  Parse, TK_GE, . 
b350: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b360: 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54  3ExprAddCollateT
b370: 6f 6b 65 6e 28 70 50 61 72 73 65 2c 70 4e 65 77  oken(pParse,pNew
b380: 45 78 70 72 31 2c 26 73 43 6f 6c 6c 53 65 71 4e  Expr1,&sCollSeqN
b390: 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ame),.          
b3a0: 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20   pStr1, 0);.    
b3b0: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
b3c0: 69 6e 67 73 28 70 4e 65 77 45 78 70 72 31 2c 20  ings(pNewExpr1, 
b3d0: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 64 78 4e  pExpr);.    idxN
b3e0: 65 77 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73  ew1 = whereClaus
b3f0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
b400: 77 45 78 70 72 31 2c 20 54 45 52 4d 5f 56 49 52  wExpr1, TERM_VIR
b410: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
b420: 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  C);.    testcase
b430: 28 20 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a  ( idxNew1==0 );.
b440: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
b450: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
b460: 77 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70  w1);.    pNewExp
b470: 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
b480: 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30  Dup(db, pLeft, 0
b490: 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32  );.    pNewExpr2
b4a0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
b4b0: 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20  pParse, TK_LT,. 
b4c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b4d0: 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54  3ExprAddCollateT
b4e0: 6f 6b 65 6e 28 70 50 61 72 73 65 2c 70 4e 65 77  oken(pParse,pNew
b4f0: 45 78 70 72 32 2c 26 73 43 6f 6c 6c 53 65 71 4e  Expr2,&sCollSeqN
b500: 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ame),.          
b510: 20 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20   pStr2, 0);.    
b520: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
b530: 69 6e 67 73 28 70 4e 65 77 45 78 70 72 32 2c 20  ings(pNewExpr2, 
b540: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 64 78 4e  pExpr);.    idxN
b550: 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73  ew2 = whereClaus
b560: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
b570: 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52  wExpr2, TERM_VIR
b580: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
b590: 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  C);.    testcase
b5a0: 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a  ( idxNew2==0 );.
b5b0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
b5c0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
b5d0: 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  w2);.    pTerm =
b5e0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
b5f0: 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d  ];.    if( isCom
b600: 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70  plete ){.      p
b610: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69  WC->a[idxNew1].i
b620: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
b630: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
b640: 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20  dxNew2].iParent 
b650: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
b660: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
b670: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   2;.    }.  }.#e
b680: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
b690: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
b6a0: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
b6b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
b6c0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
b6d0: 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61  Add a WO_MATCH a
b6e0: 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f  uxiliary term to
b6f0: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
b700: 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  set if the.  ** 
b710: 63 75 72 72 65 6e 74 20 65 78 70 72 65 73 73 69  current expressi
b720: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
b730: 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48  m:  column MATCH
b740: 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73   expr..  ** This
b750: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
b760: 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65 73  used by the xBes
b770: 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f  tIndex methods o
b780: 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74  f.  ** virtual t
b790: 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69  ables.  The nati
b7a0: 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  ve query optimiz
b7b0: 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65  er does not atte
b7c0: 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61  mpt.  ** to do a
b7d0: 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54  nything with MAT
b7e0: 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  CH functions..  
b7f0: 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68  */.  if( isMatch
b800: 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20  OfColumn(pExpr) 
b810: 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  ){.    int idxNe
b820: 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  w;.    Expr *pRi
b830: 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20  ght, *pLeft;.   
b840: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77   WhereTerm *pNew
b850: 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73  Term;.    Bitmas
b860: 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20  k prereqColumn, 
b870: 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20  prereqExpr;..   
b880: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
b890: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
b8a0: 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20  Expr;.    pLeft 
b8b0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
b8c0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
b8d0: 20 20 70 72 65 72 65 71 45 78 70 72 20 3d 20 65    prereqExpr = e
b8e0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
b8f0: 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b  askSet, pRight);
b900: 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d  .    prereqColum
b910: 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  n = exprTableUsa
b920: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65  ge(pMaskSet, pLe
b930: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72  ft);.    if( (pr
b940: 65 72 65 71 45 78 70 72 20 26 20 70 72 65 72 65  ereqExpr & prere
b950: 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20  qColumn)==0 ){. 
b960: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
b970: 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45  xpr;.      pNewE
b980: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
b990: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41  pr(pParse, TK_MA
b9a0: 54 43 48 2c 20 0a 20 20 20 20 20 20 20 20 20 20  TCH, .          
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9c0: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78      0, sqlite3Ex
b9d0: 70 72 44 75 70 28 64 62 2c 20 70 52 69 67 68 74  prDup(db, pRight
b9e0: 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  , 0), 0);.      
b9f0: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
ba00: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
ba10: 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56  pNewExpr, TERM_V
ba20: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
ba30: 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MIC);.      test
ba40: 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20  case( idxNew==0 
ba50: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  );.      pNewTer
ba60: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
ba70: 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
ba80: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
ba90: 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20   = prereqExpr;. 
baa0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c       pNewTerm->l
bab0: 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
bac0: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
bad0: 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66   pNewTerm->u.lef
bae0: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
baf0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
bb00: 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61  pNewTerm->eOpera
bb10: 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a  tor = WO_MATCH;.
bb20: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
bb30: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
bb40: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  m;.      pTerm =
bb50: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
bb60: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
bb70: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
bb80: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
bb90: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
bba0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
bbb0: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
bbc0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
bbd0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
bbe0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
bbf0: 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
bc00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
bc10: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
bc20: 41 54 34 0a 20 20 2f 2a 20 57 68 65 6e 20 73 71  AT4.  /* When sq
bc30: 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f  lite_stat3 histo
bc40: 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61  gram data is ava
bc50: 69 6c 61 62 6c 65 20 61 6e 20 6f 70 65 72 61 74  ilable an operat
bc60: 6f 72 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66  or of the.  ** f
bc70: 6f 72 6d 20 22 78 20 49 53 20 4e 4f 54 20 4e 55  orm "x IS NOT NU
bc80: 4c 4c 22 20 63 61 6e 20 73 6f 6d 65 74 69 6d 65  LL" can sometime
bc90: 73 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 6d  s be evaluated m
bca0: 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79 0a  ore efficiently.
bcb0: 20 20 2a 2a 20 61 73 20 22 78 3e 4e 55 4c 4c 22    ** as "x>NULL"
bcc0: 20 69 66 20 78 20 69 73 20 6e 6f 74 20 61 6e 20   if x is not an 
bcd0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
bce0: 4b 45 59 2e 20 20 53 6f 20 63 6f 6e 73 74 72 75  KEY.  So constru
bcf0: 63 74 20 61 0a 20 20 2a 2a 20 76 69 72 74 75 61  ct a.  ** virtua
bd00: 6c 20 74 65 72 6d 20 6f 66 20 74 68 61 74 20 66  l term of that f
bd10: 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  orm..  **.  ** N
bd20: 6f 74 65 20 74 68 61 74 20 74 68 65 20 76 69 72  ote that the vir
bd30: 74 75 61 6c 20 74 65 72 6d 20 6d 75 73 74 20 62  tual term must b
bd40: 65 20 74 61 67 67 65 64 20 77 69 74 68 20 54 45  e tagged with TE
bd50: 52 4d 5f 56 4e 55 4c 4c 2e 20 20 54 68 69 73 0a  RM_VNULL.  This.
bd60: 20 20 2a 2a 20 54 45 52 4d 5f 56 4e 55 4c 4c 20    ** TERM_VNULL 
bd70: 74 61 67 20 77 69 6c 6c 20 73 75 70 70 72 65 73  tag will suppres
bd80: 73 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63  s the not-null c
bd90: 68 65 63 6b 20 61 74 20 74 68 65 20 62 65 67 69  heck at the begi
bda0: 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74 68  nning.  ** of th
bdb0: 65 20 6c 6f 6f 70 2e 20 20 57 69 74 68 6f 75 74  e loop.  Without
bdc0: 20 74 68 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20   the TERM_VNULL 
bdd0: 66 6c 61 67 2c 20 74 68 65 20 6e 6f 74 2d 6e 75  flag, the not-nu
bde0: 6c 6c 20 63 68 65 63 6b 20 61 74 0a 20 20 2a 2a  ll check at.  **
bdf0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
be00: 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 70 72 65 76  e loop will prev
be10: 65 6e 74 20 61 6e 79 20 72 65 73 75 6c 74 73 20  ent any results 
be20: 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 74 75 72  from being retur
be30: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
be40: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f  pExpr->op==TK_NO
be50: 54 4e 55 4c 4c 0a 20 20 20 26 26 20 70 45 78 70  TNULL.   && pExp
be60: 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  r->pLeft->op==TK
be70: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45  _COLUMN.   && pE
be80: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c  xpr->pLeft->iCol
be90: 75 6d 6e 3e 3d 30 0a 20 20 20 26 26 20 4f 70 74  umn>=0.   && Opt
bea0: 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
beb0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74  (db, SQLITE_Stat
bec0: 33 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72  3).  ){.    Expr
bed0: 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20   *pNewExpr;.    
bee0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
bef0: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
bf00: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
bf10: 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54  WhereTerm *pNewT
bf20: 65 72 6d 3b 0a 0a 20 20 20 20 70 4e 65 77 45 78  erm;..    pNewEx
bf30: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
bf40: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 54 2c  r(pParse, TK_GT,
bf50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
bf70: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
bf80: 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20  pLeft, 0),.     
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 45         sqlite3PE
bfb0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e  xpr(pParse, TK_N
bfc0: 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 2c 20 30  ULL, 0, 0, 0), 0
bfd0: 29 3b 0a 0a 20 20 20 20 69 64 78 4e 65 77 20 3d  );..    idxNew =
bfe0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
bff0: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
c000: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c020: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
c030: 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 56  M_DYNAMIC|TERM_V
c040: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20 69  NULL);.    if( i
c050: 64 78 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70  dxNew ){.      p
c060: 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e  NewTerm = &pWC->
c070: 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20  a[idxNew];.     
c080: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
c090: 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20  qRight = 0;.    
c0a0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74    pNewTerm->left
c0b0: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
c0c0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
c0d0: 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  ewTerm->u.leftCo
c0e0: 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43  lumn = pLeft->iC
c0f0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65  olumn;.      pNe
c100: 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  wTerm->eOperator
c110: 20 3d 20 57 4f 5f 47 54 3b 0a 20 20 20 20 20 20   = WO_GT;.      
c120: 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e  pNewTerm->iParen
c130: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
c140: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
c150: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
c160: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
c170: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72   = 1;.      pTer
c180: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
c190: 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20  RM_COPIED;.     
c1a0: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
c1b0: 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72  qAll = pTerm->pr
c1c0: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ereqAll;.    }. 
c1d0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
c1e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
c1f0: 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 20 20  _OR_STAT4 */..  
c200: 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c  /* Prevent ON cl
c210: 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 61 20  ause terms of a 
c220: 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62  LEFT JOIN from b
c230: 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64 72 69  eing used to dri
c240: 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78  ve.  ** an index
c250: 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 74   for tables to t
c260: 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a  he left of the j
c270: 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72  oin..  */.  pTer
c280: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 7c  m->prereqRight |
c290: 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a  = extraRight;.}.
c2a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
c2b0: 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 70 4c  tion searches pL
c2c0: 69 73 74 20 66 6f 72 20 61 20 65 6e 74 72 79 20  ist for a entry 
c2d0: 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65  that matches the
c2e0: 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a   iCol-th column.
c2f0: 2a 2a 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78  ** of index pIdx
c300: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20  ..**.** If such 
c310: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
c320: 20 66 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65   found, its inde
c330: 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20  x in pList->a[] 
c340: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a  is returned. If.
c350: 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e  ** no expression
c360: 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73   is found, -1 is
c370: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
c380: 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64  atic int findInd
c390: 65 78 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a  exCol(.  Parse *
c3a0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
c3b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
c3c0: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  e context */.  E
c3d0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c3f0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * Expression lis
c400: 74 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  t to search */. 
c410: 20 69 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20   int iBase,     
c420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c430: 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74   /* Cursor for t
c440: 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
c450: 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49  with pIdx */.  I
c460: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
c470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c480: 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68  * Index to match
c490: 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20   column of */.  
c4a0: 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20  int iCol        
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4c0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  /* Column of ind
c4d0: 65 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29  ex to match */.)
c4e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  {.  int i;.  con
c4f0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
c500: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43   pIdx->azColl[iC
c510: 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ol];..  for(i=0;
c520: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
c530: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
c540: 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  *p = sqlite3Expr
c550: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73  SkipCollate(pLis
c560: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
c570: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
c580: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26  K_COLUMN.     &&
c590: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64   p->iColumn==pId
c5a0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c  x->aiColumn[iCol
c5b0: 5d 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 54 61  ].     && p->iTa
c5c0: 62 6c 65 3d 3d 69 42 61 73 65 0a 20 20 20 20 29  ble==iBase.    )
c5d0: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
c5e0: 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
c5f0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
c600: 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  se, pList->a[i].
c610: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
c620: 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20  ( ALWAYS(pColl) 
c630: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
c640: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
c650: 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
c660: 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20       return i;. 
c670: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
c680: 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ..  return -1;.}
c690: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
c6a0: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
c6b0: 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c  NCT expression-l
c6c0: 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ist passed as th
c6d0: 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
c6e0: 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74  .** is redundant
c6f0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e  ..**.** A DISTIN
c700: 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e  CT list is redun
c710: 64 61 6e 74 20 69 66 20 74 68 65 20 64 61 74 61  dant if the data
c720: 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 73 6f  base contains so
c730: 6d 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20  me subset of.** 
c740: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65  columns that are
c750: 20 75 6e 69 71 75 65 20 61 6e 64 20 6e 6f 6e 2d   unique and non-
c760: 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  null..*/.static 
c770: 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52 65  int isDistinctRe
c780: 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73 65  dundant(.  Parse
c790: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
c7a0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
c7b0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
c7c0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
c7d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52         /* The FR
c7e0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
c7f0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
c800: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c810: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
c820: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73    ExprList *pDis
c830: 74 69 6e 63 74 20 20 20 20 20 20 20 2f 2a 20 54  tinct       /* T
c840: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74 68  he result set th
c850: 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 44  at needs to be D
c860: 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20  ISTINCT */.){.  
c870: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
c880: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
c890: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
c8b0: 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f   int iBase;..  /
c8c0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f  * If there is mo
c8d0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c  re than one tabl
c8e0: 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 20  e or sub-select 
c8f0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
c900: 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  se of.  ** this 
c910: 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20 77  query, then it w
c920: 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  ill not be possi
c930: 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74  ble to show that
c940: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a 20   the DISTINCT . 
c950: 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72 65   ** clause is re
c960: 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  dundant. */.  if
c970: 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
c980: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
c990: 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c 69    iBase = pTabLi
c9a0: 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
c9b0: 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c  ;.  pTab = pTabL
c9c0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  ist->a[0].pTab;.
c9d0: 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  /* If any of 
c9e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
c9f0: 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e  is an IPK column
ca00: 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65 2c   on table iBase,
ca10: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20 20   then return .  
ca20: 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54  ** true. Note: T
ca30: 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69  he (p->iTable==i
ca40: 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74 68  Base) part of th
ca50: 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20 66  is test may be f
ca60: 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a  alse if the.  **
ca70: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
ca80: 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
ca90: 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  sub-query..  */.
caa0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69    for(i=0; i<pDi
cab0: 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69  stinct->nExpr; i
cac0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
cad0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
cae0: 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74 69  ipCollate(pDisti
caf0: 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  nct->a[i].pExpr)
cb00: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ;.    if( p->op=
cb10: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d  =TK_COLUMN && p-
cb20: 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20 26  >iTable==iBase &
cb30: 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  & p->iColumn<0 )
cb40: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
cb50: 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
cb60: 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e  h all indices on
cb70: 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65 63   the table, chec
cb80: 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65 65  king each to see
cb90: 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a   if it makes.  *
cba0: 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71  * the DISTINCT q
cbb0: 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64 61  ualifier redunda
cbc0: 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20 69  nt. It does so i
cbd0: 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  f:.  **.  **   1
cbe0: 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 69  . The index is i
cbf0: 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e  tself UNIQUE, an
cc00: 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e  d.  **.  **   2.
cc10: 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75   All of the colu
cc20: 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
cc30: 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72 74   are either part
cc40: 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e 63   of the pDistinc
cc50: 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73 74  t.  **      list
cc60: 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57 48  , or else the WH
cc70: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
cc80: 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68  ins a term of th
cc90: 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a  e form "col=X",.
cca0: 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65 20    **      where 
ccb0: 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  X is a constant 
ccc0: 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61  value. The colla
ccd0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 6f  tion sequences o
cce0: 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20  f the.  **      
ccf0: 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20 73  comparison and s
cd00: 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72 65  elect-list expre
cd10: 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63  ssions must matc
cd20: 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20 69  h those of the i
cd30: 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
cd40: 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73    3. All of thos
cd50: 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  e index columns 
cd60: 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57 48  for which the WH
cd70: 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20  ERE clause does 
cd80: 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f  not.  **      co
cd90: 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20  ntain a "col=X" 
cda0: 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63 74  term are subject
cdb0: 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63   to a NOT NULL c
cdc0: 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a  onstraint..  */.
cdd0: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
cde0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
cdf0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
ce00: 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  {.    if( pIdx->
ce10: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
ce20: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
ce30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
ce40: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nKeyCol; i++){
ce50: 0a 20 20 20 20 20 20 69 31 36 20 69 43 6f 6c 20  .      i16 iCol 
ce60: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
ce70: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  [i];.      if( 0
ce80: 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  ==findTerm(pWC, 
ce90: 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42  iBase, iCol, ~(B
cea0: 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c  itmask)0, WO_EQ,
ceb0: 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20   pIdx) ){.      
cec0: 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 20 3d 20    int iIdxCol = 
ced0: 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61  findIndexCol(pPa
cee0: 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20  rse, pDistinct, 
cef0: 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3b  iBase, pIdx, i);
cf00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 49 64  .        if( iId
cf10: 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61 62 2d 3e  xCol<0 || pTab->
cf20: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
cf30: 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ll==0 ){.       
cf40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
cf50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
cf60: 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64  }.    if( i==pId
cf70: 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20  x->nKeyCol ){.  
cf80: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65      /* This inde
cf90: 78 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  x implies that t
cfa0: 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
cfb0: 69 66 69 65 72 20 69 73 20 72 65 64 75 6e 64 61  ifier is redunda
cfc0: 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  nt. */.      ret
cfd0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
cfe0: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
cff0: 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  ../*.** Estimate
d000: 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f   the logarithm o
d010: 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75  f the input valu
d020: 65 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a  e to base 2..*/.
d030: 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65 73  static LogEst es
d040: 74 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b 0a  tLog(LogEst N){.
d050: 20 20 4c 6f 67 45 73 74 20 78 20 3d 20 73 71 6c    LogEst x = sql
d060: 69 74 65 33 4c 6f 67 45 73 74 28 4e 29 3b 0a 20  ite3LogEst(N);. 
d070: 20 72 65 74 75 72 6e 20 78 3e 33 33 20 3f 20 78   return x>33 ? x
d080: 20 2d 20 33 33 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a   - 33 : 0;.}../*
d090: 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73  .** Two routines
d0a0: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68   for printing th
d0b0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  e content of an 
d0c0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
d0d0: 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  fo.** structure.
d0e0: 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69    Used for testi
d0f0: 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
d100: 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68   only.  If neith
d110: 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53  er.** SQLITE_TES
d120: 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55  T or SQLITE_DEBU
d130: 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74  G are defined, t
d140: 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e  hen these routin
d150: 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73  es.** are no-ops
d160: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
d170: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
d180: 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64  RTUALTABLE) && d
d190: 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43  efined(WHERETRAC
d1a0: 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61 74 69  E_ENABLED).stati
d1b0: 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58  c void TRACE_IDX
d1c0: 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f  _INPUTS(sqlite3_
d1d0: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
d1e0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
d1f0: 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
d200: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  e ) return;.  fo
d210: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
d220: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
d230: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
d240: 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61  rintf("  constra
d250: 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20  int[%d]: col=%d 
d260: 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20  termid=%d op=%d 
d270: 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20  usabled=%d\n",. 
d280: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
d290: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
d2a0: 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ].iColumn,.     
d2b0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
d2c0: 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c  [i].iTermOffset,
d2d0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
d2e0: 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20  traint[i].op,.  
d2f0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
d300: 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a  int[i].usable);.
d310: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
d320: 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b  <p->nOrderBy; i+
d330: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
d340: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72  ebugPrintf("  or
d350: 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25  derby[%d]: col=%
d360: 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20  d desc=%d\n",.  
d370: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
d380: 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43  ->aOrderBy[i].iC
d390: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d  olumn,.       p-
d3a0: 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73  >aOrderBy[i].des
d3b0: 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  c);.  }.}.static
d3c0: 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f   void TRACE_IDX_
d3d0: 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f  OUTPUTS(sqlite3_
d3e0: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
d3f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
d400: 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
d410: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  e ) return;.  fo
d420: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
d430: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
d440: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
d450: 72 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25  rintf("  usage[%
d460: 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f  d]: argvIdx=%d o
d470: 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  mit=%d\n",.     
d480: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
d490: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
d4a0: 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20  i].argvIndex,.  
d4b0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
d4c0: 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74  intUsage[i].omit
d4d0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
d4e0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69  DebugPrintf("  i
d4f0: 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e  dxNum=%d\n", p->
d500: 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74  idxNum);.  sqlit
d510: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
d520: 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70   idxStr=%s\n", p
d530: 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c  ->idxStr);.  sql
d540: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
d550: 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  "  orderByConsum
d560: 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64  ed=%d\n", p->ord
d570: 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20  erByConsumed);. 
d580: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d590: 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64  ntf("  estimated
d5a0: 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65  Cost=%g\n", p->e
d5b0: 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20  stimatedCost);. 
d5c0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d5d0: 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64  ntf("  estimated
d5e0: 52 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d  Rows=%lld\n", p-
d5f0: 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b  >estimatedRows);
d600: 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
d610: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
d620: 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41  S(A).#define TRA
d630: 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41  CE_IDX_OUTPUTS(A
d640: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ).#endif..#ifnde
d650: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
d660: 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
d670: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
d680: 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
d690: 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69  use term pTerm i
d6a0: 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72  s of a form wher
d6b0: 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65  e it.** could be
d6c0: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
d6d0: 64 65 78 20 74 6f 20 61 63 63 65 73 73 20 70 53  dex to access pS
d6e0: 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20  rc, assuming an 
d6f0: 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69  appropriate.** i
d700: 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f  ndex existed..*/
d710: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d  .static int term
d720: 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20  CanDriveIndex(. 
d730: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
d740: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
d750: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
d760: 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f  term to check */
d770: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
d780: 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20  t_item *pSrc,   
d790: 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72    /* Table we ar
d7a0: 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65  e trying to acce
d7b0: 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ss */.  Bitmask 
d7c0: 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20 20 20  notReady        
d7d0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
d7e0: 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20   in outer loops 
d7f0: 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29  of the join */.)
d800: 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20  {.  char aff;.  
d810: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
d820: 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75  ursor!=pSrc->iCu
d830: 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rsor ) return 0;
d840: 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  .  if( (pTerm->e
d850: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
d860: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
d870: 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70  .  if( (pTerm->p
d880: 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74  rereqRight & not
d890: 52 65 61 64 79 29 21 3d 30 20 29 20 72 65 74 75  Ready)!=0 ) retu
d8a0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54 65 72  rn 0;.  if( pTer
d8b0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3c  m->u.leftColumn<
d8c0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
d8d0: 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  aff = pSrc->pTab
d8e0: 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e  ->aCol[pTerm->u.
d8f0: 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  leftColumn].affi
d900: 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71 6c  nity;.  if( !sql
d910: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
d920: 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  yOk(pTerm->pExpr
d930: 2c 20 61 66 66 29 20 29 20 72 65 74 75 72 6e 20  , aff) ) return 
d940: 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  0;.  return 1;.}
d950: 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65  .#endif...#ifnde
d960: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
d970: 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
d980: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
d990: 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74  e to construct t
d9a0: 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
d9b0: 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  for an automatic
d9c0: 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f   index.** and to
d9d0: 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65 72   set up the Wher
d9e0: 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c  eLevel object pL
d9f0: 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68 65  evel so that the
da00: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
da10: 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66 20  ** makes use of 
da20: 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
da30: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
da40: 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75 74  oid constructAut
da50: 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50  omaticIndex(.  P
da60: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
da70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
da80: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
da90: 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
daa0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
dab0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
dac0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
dad0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
dae0: 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
daf0: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
db00: 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74 20  to get the next 
db10: 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61  index */.  Bitma
db20: 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
db30: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
db40: 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61  f cursors that a
db50: 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
db60: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
db70: 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20 20   *pLevel        
db80: 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 69    /* Write new i
db90: 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ndex here */.){.
dba0: 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20    int nKeyCol;  
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dbc0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
dbd0: 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72  ns in the constr
dbe0: 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20  ucted index */. 
dbf0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
dc00: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
dc10: 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
dc20: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
dc30: 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
dc40: 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20   *pWCEnd;       
dc50: 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43     /* End of pWC
dc60: 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65 78  ->a[] */.  Index
dc70: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
dc80: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
dc90: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
dca0: 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
dcb0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcd0: 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74 61   /* Prepared sta
dce0: 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
dcf0: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
dd00: 6e 74 20 61 64 64 72 49 6e 69 74 3b 20 20 20 20  nt addrInit;    
dd10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
dd20: 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e 69  dress of the ini
dd30: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61  tialization bypa
dd40: 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62  ss jump */.  Tab
dd50: 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20  le *pTable;     
dd60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
dd70: 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65  table being inde
dd80: 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  xed */.  int add
dd90: 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
dda0: 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
ddb0: 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f  he index fill lo
ddc0: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  op */.  int regR
ddd0: 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20  ecord;          
dde0: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
ddf0: 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78  holding an index
de00: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
de10: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
de20: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
de30: 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  mn counter */.  
de40: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
de50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
de60: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
de70: 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20   int mxBitCol;  
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de90: 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69  Maximum column i
dea0: 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  n pSrc->colUsed 
deb0: 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  */.  CollSeq *pC
dec0: 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
ded0: 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
dee0: 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63  quence to on a c
def0: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65  olumn */.  Where
df00: 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
df10: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f         /* The Lo
df20: 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  op object */.  c
df30: 68 61 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20 20  har *zNotUsed;  
df40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
df50: 74 72 61 20 73 70 61 63 65 20 6f 6e 20 74 68 65  tra space on the
df60: 20 65 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f 0a   end of pIdx */.
df70: 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c    Bitmask idxCol
df80: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
df90: 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d   Bitmap of colum
dfa0: 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65  ns used for inde
dfb0: 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73  xing */.  Bitmas
dfc0: 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20  k extraCols;    
dfd0: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20        /* Bitmap 
dfe0: 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
dff0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65  lumns */.  u8 se
e000: 6e 74 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20  ntWarning = 0;  
e010: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
e020: 66 20 61 20 77 61 72 6e 6e 69 6e 67 20 68 61 73  f a warnning has
e030: 20 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a   been issued */.
e040: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
e050: 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72  ode to skip over
e060: 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e   the creation an
e070: 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  d initialization
e080: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61   of the.  ** tra
e090: 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20  nsient index on 
e0a0: 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  2nd and subseque
e0b0: 6e 74 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66  nt iterations of
e0c0: 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20   the loop. */.  
e0d0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
e0e0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
e0f0: 30 20 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20  0 );.  addrInit 
e100: 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
e110: 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a  e(pParse);..  /*
e120: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
e130: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61  r of columns tha
e140: 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20  t will be added 
e150: 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  to the index.  *
e160: 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61  * and used to ma
e170: 74 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65  tch WHERE clause
e180: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
e190: 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20    nKeyCol = 0;. 
e1a0: 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e   pTable = pSrc->
e1b0: 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d  pTab;.  pWCEnd =
e1c0: 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54   &pWC->a[pWC->nT
e1d0: 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20  erm];.  pLoop = 
e1e0: 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
e1f0: 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20    idxCols = 0;. 
e200: 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
e210: 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
e220: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
e230: 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
e240: 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
e250: 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20  , notReady) ){. 
e260: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
e270: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
e280: 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  umn;.      Bitma
e290: 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e  sk cMask = iCol>
e2a0: 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42  =BMS ? MASKBIT(B
e2b0: 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28  MS-1) : MASKBIT(
e2c0: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73  iCol);.      tes
e2d0: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
e2e0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
e2f0: 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20  se( iCol==BMS-1 
e300: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 65  );.      if( !se
e310: 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20  ntWarning ){.   
e320: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
e330: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f  (SQLITE_WARNING_
e340: 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20  AUTOINDEX,.     
e350: 20 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69         "automati
e360: 63 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73  c index on %s(%s
e370: 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  )", pTable->zNam
e380: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e,.            p
e390: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  Table->aCol[iCol
e3a0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
e3b0: 20 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20    sentWarning = 
e3c0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
e3d0: 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20   if( (idxCols & 
e3e0: 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  cMask)==0 ){.   
e3f0: 20 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f       if( whereLo
e400: 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d  opResize(pParse-
e410: 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79  >db, pLoop, nKey
e420: 43 6f 6c 2b 31 29 20 29 20 72 65 74 75 72 6e 3b  Col+1) ) return;
e430: 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
e440: 61 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b  aLTerm[nKeyCol++
e450: 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
e460: 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d     idxCols |= cM
e470: 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
e480: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
e490: 20 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b 0a 20 20   nKeyCol>0 );.  
e4a0: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
e4b0: 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  Eq = pLoop->nLTe
e4c0: 72 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20  rm = nKeyCol;.  
e4d0: 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
e4e0: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
e4f0: 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   | WHERE_IDX_ONL
e500: 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45  Y | WHERE_INDEXE
e510: 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D.              
e520: 20 20 20 20 20 20 20 7c 20 57 48 45 52 45 5f 41         | WHERE_A
e530: 55 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a  UTO_INDEX;..  /*
e540: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
e550: 72 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20  r of additional 
e560: 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74  columns needed t
e570: 6f 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20  o create a.  ** 
e580: 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20  covering index. 
e590: 20 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64   A "covering ind
e5a0: 65 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ex" is an index 
e5b0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c  that contains al
e5c0: 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74  l.  ** columns t
e5d0: 68 61 74 20 61 72 65 20 6e 65 65 64 65 64 20 62  hat are needed b
e5e0: 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 57 69  y the query.  Wi
e5f0: 74 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  th a covering in
e600: 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72  dex, the.  ** or
e610: 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76  iginal table nev
e620: 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61  er needs to be a
e630: 63 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61  ccessed.  Automa
e640: 74 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74  tic indices must
e650: 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72  .  ** be a cover
e660: 69 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75 73  ing index becaus
e670: 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c  e the index will
e680: 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 20   not be updated 
e690: 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  if the.  ** orig
e6a0: 69 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67  inal table chang
e6b0: 65 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  es and the index
e6c0: 20 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f   and table canno
e6d0: 74 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20  t both be used. 
e6e0: 20 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f   ** if they go o
e6f0: 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f  ut of sync..  */
e700: 0a 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70  .  extraCols = p
e710: 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28  Src->colUsed & (
e720: 7e 69 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42  ~idxCols | MASKB
e730: 49 54 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78  IT(BMS-1));.  mx
e740: 42 69 74 43 6f 6c 20 3d 20 28 70 54 61 62 6c 65  BitCol = (pTable
e750: 2d 3e 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29  ->nCol >= BMS-1)
e760: 20 3f 20 42 4d 53 2d 31 20 3a 20 70 54 61 62 6c   ? BMS-1 : pTabl
e770: 65 2d 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73 74 63  e->nCol;.  testc
e780: 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ase( pTable->nCo
e790: 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65  l==BMS-1 );.  te
e7a0: 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e  stcase( pTable->
e7b0: 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20  nCol==BMS-2 );. 
e7c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69   for(i=0; i<mxBi
e7d0: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
e7e0: 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20  if( extraCols & 
e7f0: 4d 41 53 4b 42 49 54 28 69 29 20 29 20 6e 4b 65  MASKBIT(i) ) nKe
e800: 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  yCol++;.  }.  if
e810: 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  ( pSrc->colUsed 
e820: 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  & MASKBIT(BMS-1)
e830: 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c 20   ){.    nKeyCol 
e840: 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  += pTable->nCol 
e850: 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 20  - BMS + 1;.  }. 
e860: 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
e870: 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
e880: 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f  EQ | WHERE_IDX_O
e890: 4e 4c 59 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74  NLY;..  /* Const
e8a0: 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f  ruct the Index o
e8b0: 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69 62  bject to describ
e8c0: 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a  e this index */.
e8d0: 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33    pIdx = sqlite3
e8e0: 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a  AllocateIndexObj
e8f0: 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ect(pParse->db, 
e900: 6e 4b 65 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a  nKeyCol+1, 0, &z
e910: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
e920: 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e  pIdx==0 ) return
e930: 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ;.  pLoop->u.btr
e940: 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  ee.pIndex = pIdx
e950: 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  ;.  pIdx->zName 
e960: 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a  = "auto-index";.
e970: 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d    pIdx->pTable =
e980: 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30   pTable;.  n = 0
e990: 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b  ;.  idxCols = 0;
e9a0: 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
e9b0: 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
e9c0: 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
e9d0: 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
e9e0: 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
e9f0: 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b  rc, notReady) ){
ea00: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
ea10: 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
ea20: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74  olumn;.      Bit
ea30: 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f  mask cMask = iCo
ea40: 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54  l>=BMS ? MASKBIT
ea50: 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49  (BMS-1) : MASKBI
ea60: 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74  T(iCol);.      t
ea70: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
ea80: 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  MS-1 );.      te
ea90: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
eaa0: 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  S );.      if( (
eab0: 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29  idxCols & cMask)
eac0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ==0 ){.        E
ead0: 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
eae0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
eaf0: 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b  idxCols |= cMask
eb00: 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
eb10: 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54  aiColumn[n] = pT
eb20: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
eb30: 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  n;.        pColl
eb40: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
eb50: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
eb60: 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74  Parse, pX->pLeft
eb70: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
eb80: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
eb90: 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59 53 28  oll[n] = ALWAYS(
eba0: 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e  pColl) ? pColl->
ebb0: 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52 59 22  zName : "BINARY"
ebc0: 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  ;.        n++;. 
ebd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ebe0: 0a 20 20 61 73 73 65 72 74 28 20 28 75 33 32 29  .  assert( (u32)
ebf0: 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  n==pLoop->u.btre
ec00: 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41  e.nEq );..  /* A
ec10: 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  dd additional co
ec20: 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
ec30: 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74  make the automat
ec40: 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20  ic index into.  
ec50: 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  ** a covering in
ec60: 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  dex */.  for(i=0
ec70: 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b  ; i<mxBitCol; i+
ec80: 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72  +){.    if( extr
ec90: 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28  aCols & MASKBIT(
eca0: 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  i) ){.      pIdx
ecb0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
ecc0: 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  i;.      pIdx->a
ecd0: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41  zColl[n] = "BINA
ece0: 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a  RY";.      n++;.
ecf0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
ed00: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
ed10: 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29  MASKBIT(BMS-1) )
ed20: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d  {.    for(i=BMS-
ed30: 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f  1; i<pTable->nCo
ed40: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
ed50: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
ed60: 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78   = i;.      pIdx
ed70: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42  ->azColl[n] = "B
ed80: 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b  INARY";.      n+
ed90: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  +;.    }.  }.  a
eda0: 73 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f  ssert( n==nKeyCo
edb0: 6c 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43  l );.  pIdx->aiC
edc0: 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 2d 31 3b 0a 20  olumn[n] = -1;. 
edd0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
ede0: 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 0a 20 20   = "BINARY";..  
edf0: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75  /* Create the au
ee00: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f  tomatic index */
ee10: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65  .  assert( pLeve
ee20: 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b  l->iIdxCur>=0 );
ee30: 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  .  pLevel->iIdxC
ee40: 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
ee50: 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  b++;.  sqlite3Vd
ee60: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
ee70: 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c  penAutoindex, pL
ee80: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e  evel->iIdxCur, n
ee90: 4b 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c  KeyCol+1);.  sql
eea0: 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
eeb0: 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
eec0: 78 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  x);.  VdbeCommen
eed0: 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20  t((v, "for %s", 
eee0: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b  pTable->zName));
eef0: 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20  ..  /* Fill the 
ef00: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
ef10: 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  with content */.
ef20: 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
ef30: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
ef40: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76   OP_Rewind, pLev
ef50: 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20  el->iTabCur);.  
ef60: 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
ef70: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
ef80: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
ef90: 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
efa0: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70  (pParse, pIdx, p
efb0: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20  Level->iTabCur, 
efc0: 72 65 67 52 65 63 6f 72 64 2c 20 30 2c 20 30 2c  regRecord, 0, 0,
efd0: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
efe0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
eff0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65  P_IdxInsert, pLe
f000: 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65  vel->iIdxCur, re
f010: 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
f020: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
f030: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
f040: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
f050: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f060: 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c   OP_Next, pLevel
f070: 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64 72 54  ->iTabCur, addrT
f080: 6f 70 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  op+1);.  sqlite3
f090: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
f0a0: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
f0b0: 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20  S_AUTOINDEX);.  
f0c0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
f0d0: 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b  ere(v, addrTop);
f0e0: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
f0f0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
f100: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a   regRecord);.  .
f110: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77    /* Jump here w
f120: 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65  hen skipping the
f130: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
f140: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
f150: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
f160: 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  Init);.}.#endif 
f170: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  /* SQLITE_OMIT_A
f180: 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a  UTOMATIC_INDEX *
f190: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
f1a0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
f1b0: 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  BLE./*.** Alloca
f1c0: 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  te and populate 
f1d0: 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  an sqlite3_index
f1e0: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  _info structure.
f1f0: 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
f200: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
f210: 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
f220: 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73  ventually releas
f230: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
f240: 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74 68  ** by passing th
f250: 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
f260: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
f270: 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66  ion to sqlite3_f
f280: 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
f290: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
f2a0: 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64  nfo *allocateInd
f2b0: 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20  exInfo(.  Parse 
f2c0: 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65 72 65  *pParse,.  Where
f2d0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 73  Clause *pWC,.  s
f2e0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
f2f0: 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72  em *pSrc,.  Expr
f300: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 0a 29  List *pOrderBy.)
f310: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
f320: 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72  int nTerm;.  str
f330: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
f340: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49  x_constraint *pI
f350: 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74  dxCons;.  struct
f360: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
f370: 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65  rderby *pIdxOrde
f380: 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71  rBy;.  struct sq
f390: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
f3a0: 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55  traint_usage *pU
f3b0: 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72  sage;.  WhereTer
f3c0: 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
f3d0: 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69  nOrderBy;.  sqli
f3e0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
f3f0: 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20  pIdxInfo;..  /* 
f400: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
f410: 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45   of possible WHE
f420: 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
f430: 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a  aints referring.
f440: 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72    ** to this vir
f450: 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
f460: 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70  for(i=nTerm=0, p
f470: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
f480: 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
f490: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
f4a0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
f4b0: 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
f4c0: 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
f4d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50  .    assert( IsP
f4e0: 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d  owerOfTwo(pTerm-
f4f0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f  >eOperator & ~WO
f500: 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74  _EQUIV) );.    t
f510: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
f520: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
f530: 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  N );.    testcas
f540: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
f550: 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  tor & WO_ISNULL 
f560: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
f570: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
f580: 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74  O_ISNULL) ) cont
f590: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
f5a0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
f5b0: 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74  ERM_VNULL ) cont
f5c0: 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b  inue;.    nTerm+
f5d0: 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  +;.  }..  /* If 
f5e0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
f5f0: 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c  use contains onl
f600: 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  y columns in the
f610: 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76   current .  ** v
f620: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65  irtual table the
f630: 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  n allocate space
f640: 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42   for the aOrderB
f650: 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74  y part of.  ** t
f660: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
f670: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  _info structure.
f680: 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79  .  */.  nOrderBy
f690: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64   = 0;.  if( pOrd
f6a0: 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  erBy ){.    int 
f6b0: 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  n = pOrderBy->nE
f6c0: 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  xpr;.    for(i=0
f6d0: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
f6e0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
f6f0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
f700: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
f710: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
f720: 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  OLUMN || pExpr->
f730: 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43  iTable!=pSrc->iC
f740: 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20  ursor ) break;. 
f750: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
f760: 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72  n){.      nOrder
f770: 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  By = n;.    }.  
f780: 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
f790: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
f7a0: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
f7b0: 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66  e.  */.  pIdxInf
f7c0: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
f7d0: 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
f7e0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78  db, sizeof(*pIdx
f7f0: 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20  Info).          
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f810: 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78   + (sizeof(*pIdx
f820: 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a  Cons) + sizeof(*
f830: 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20  pUsage))*nTerm. 
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65            + size
f860: 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29  of(*pIdxOrderBy)
f870: 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69  *nOrderBy );.  i
f880: 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29  f( pIdxInfo==0 )
f890: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
f8a0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
f8b0: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a  ut of memory");.
f8c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
f8d0: 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
f8e0: 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ze the structure
f8f0: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69  .  The sqlite3_i
f900: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
f910: 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a  ure contains.  *
f920: 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68  * many fields th
f930: 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20  at are declared 
f940: 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65  "const" to preve
f950: 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72  nt xBestIndex fr
f960: 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67  om.  ** changing
f970: 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20   them.  We have 
f980: 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79  to do some funky
f990: 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65   casting in orde
f9a0: 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61  r to.  ** initia
f9b0: 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64  lize those field
f9c0: 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f  s..  */.  pIdxCo
f9d0: 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ns = (struct sql
f9e0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
f9f0: 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  raint*)&pIdxInfo
fa00: 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72  [1];.  pIdxOrder
fa10: 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  By = (struct sql
fa20: 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
fa30: 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54  by*)&pIdxCons[nT
fa40: 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d  erm];.  pUsage =
fa50: 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
fa60: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
fa70: 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72  t_usage*)&pIdxOr
fa80: 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b  derBy[nOrderBy];
fa90: 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
faa0: 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
fab0: 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e   = nTerm;.  *(in
fac0: 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  t*)&pIdxInfo->nO
fad0: 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42  rderBy = nOrderB
fae0: 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
faf0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
fb00: 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
fb10: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20  fo->aConstraint 
fb20: 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28  = pIdxCons;.  *(
fb30: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
fb40: 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26  ndex_orderby**)&
fb50: 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72  pIdxInfo->aOrder
fb60: 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79  By = pIdxOrderBy
fb70: 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
fb80: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
fb90: 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70  raint_usage**)&p
fba0: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
fbb0: 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20  aintUsage =.    
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
fc00: 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d  Usage;..  for(i=
fc10: 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  j=0, pTerm=pWC->
fc20: 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
fc30: 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
fc40: 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 69      u8 op;.    i
fc50: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
fc60: 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
fc70: 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
fc80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49 73  ;.    assert( Is
fc90: 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d  PowerOfTwo(pTerm
fca0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57  ->eOperator & ~W
fcb0: 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20  O_EQUIV) );.    
fcc0: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
fcd0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
fce0: 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IN );.    testca
fcf0: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
fd00: 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
fd10: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72   );.    if( pTer
fd20: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
fd30: 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e  WO_ISNULL) ) con
fd40: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
fd50: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
fd60: 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e  TERM_VNULL ) con
fd70: 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 43  tinue;.    pIdxC
fd80: 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  ons[j].iColumn =
fd90: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
fda0: 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f  lumn;.    pIdxCo
fdb0: 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65  ns[j].iTermOffse
fdc0: 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20  t = i;.    op = 
fdd0: 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72  (u8)pTerm->eOper
fde0: 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20  ator & WO_ALL;. 
fdf0: 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e     if( op==WO_IN
fe00: 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20   ) op = WO_EQ;. 
fe10: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f     pIdxCons[j].o
fe20: 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54  p = op;.    /* T
fe30: 68 65 20 64 69 72 65 63 74 20 61 73 73 69 67 6e  he direct assign
fe40: 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76  ment in the prev
fe50: 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73  ious line is pos
fe60: 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75  sible only becau
fe70: 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f  se.    ** the WO
fe80: 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44  _ and SQLITE_IND
fe90: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63  EX_CONSTRAINT_ c
fea0: 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69 63  odes are identic
feb0: 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20  al.  The.    ** 
fec0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
fed0: 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66 61  s verify this fa
fee0: 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ct. */.    asser
fef0: 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45  t( WO_EQ==SQLITE
ff00: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
ff10: 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65  T_EQ );.    asse
ff20: 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54  rt( WO_LT==SQLIT
ff30: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
ff40: 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73  NT_LT );.    ass
ff50: 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49  ert( WO_LE==SQLI
ff60: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
ff70: 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73  INT_LE );.    as
ff80: 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c  sert( WO_GT==SQL
ff90: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
ffa0: 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61  AINT_GT );.    a
ffb0: 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51  ssert( WO_GE==SQ
ffc0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
ffd0: 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20  RAINT_GE );.    
ffe0: 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48  assert( WO_MATCH
fff0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
10000 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20  ONSTRAINT_MATCH 
10010 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
10020 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
10030 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57  & (WO_IN|WO_EQ|W
10040 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54  O_LT|WO_LE|WO_GT
10050 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29  |WO_GE|WO_MATCH)
10060 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d   );.    j++;.  }
10070 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
10080 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
10090 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
100a0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
100b0 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72  Expr;.    pIdxOr
100c0 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
100d0 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
100e0 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72  n;.    pIdxOrder
100f0 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72  By[i].desc = pOr
10100 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
10110 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  Order;.  }..  re
10120 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d  turn pIdxInfo;.}
10130 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ../*.** The tabl
10140 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e  e object referen
10150 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ce passed as the
10160 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
10170 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
10180 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73  n.** must repres
10190 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  ent a virtual ta
101a0 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ble. This functi
101b0 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78  on invokes the x
101c0 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d  BestIndex().** m
101d0 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72  ethod of the vir
101e0 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20  tual table with 
101f0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
10200 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  x_info object th
10210 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61  at.** comes in a
10220 73 20 74 68 65 20 33 72 64 20 61 72 67 75 6d 65  s the 3rd argume
10230 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
10240 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
10250 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70   error occurs, p
10260 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74  Parse is populat
10270 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
10280 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a   message and a.*
10290 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  * non-zero value
102a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
102b0 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65  herwise, 0 is re
102c0 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f  turned and the o
102d0 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66  utput.** part of
102e0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
102f0 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
10300 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61  e is left popula
10310 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  ted..**.** Wheth
10320 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72  er or not an err
10330 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  or is returned, 
10340 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  it is the respon
10350 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a  sibility of the.
10360 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  ** caller to eve
10370 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e  ntually free p->
10380 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65  idxStr if p->nee
10390 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e  dToFreeIdxStr in
103a0 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20  dicates.** that 
103b0 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  this is required
103c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
103d0 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50 61  vtabBestIndex(Pa
103e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
103f0 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65  le *pTab, sqlite
10400 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
10410 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
10420 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65   *pVtab = sqlite
10430 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73  3GetVTable(pPars
10440 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56  e->db, pTab)->pV
10450 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tab;.  int i;.  
10460 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45  int rc;..  TRACE
10470 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a  _IDX_INPUTS(p);.
10480 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d    rc = pVtab->pM
10490 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65  odule->xBestInde
104a0 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54  x(pVtab, p);.  T
104b0 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
104c0 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d  (p);..  if( rc!=
104d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
104e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
104f0 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70  NOMEM ){.      p
10500 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
10510 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
10520 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61   }else if( !pVta
10530 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  b->zErrMsg ){.  
10540 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10550 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
10560 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
10570 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rc));.    }else{
10580 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
10590 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
105a0 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72  %s", pVtab->zErr
105b0 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Msg);.    }.  }.
105c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
105d0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
105e0 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67    pVtab->zErrMsg
105f0 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30   = 0;..  for(i=0
10600 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
10610 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  nt; i++){.    if
10620 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  ( !p->aConstrain
10630 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70  t[i].usable && p
10640 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
10650 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e  ge[i].argvIndex>
10660 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
10670 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
10680 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 74  e, .          "t
10690 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e  able %s: xBestIn
106a0 64 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20  dex returned an 
106b0 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70  invalid plan", p
106c0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
106d0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
106e0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d   pParse->nErr;.}
106f0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
10700 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
10710 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f  VIRTUALTABLE) */
10720 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
10730 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
10740 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT4./*.** Est
10750 69 6d 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69  imate the locati
10760 6f 6e 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c  on of a particul
10770 61 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c  ar key among all
10780 20 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69   keys in an.** i
10790 6e 64 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65  ndex.  Store the
107a0 20 72 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61   results in aSta
107b0 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  t as follows:.**
107c0 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20  .**    aStat[0] 
107d0 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72       Est. number
107e0 20 6f 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68   of rows less th
107f0 61 6e 20 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53  an pVal.**    aS
10800 74 61 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e  tat[1]      Est.
10810 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
10820 65 71 75 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a  equal to pVal.**
10830 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
10840 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
10850 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10860 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20  whereKeyStats(. 
10870 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
10880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10890 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
108a0 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
108b0 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
108c0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
108d0 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e   consider domain
108e0 20 6f 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65   of */.  Unpacke
108f0 64 52 65 63 6f 72 64 20 2a 70 52 65 63 2c 20 20  dRecord *pRec,  
10900 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f       /* Vector o
10910 66 20 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73  f values to cons
10920 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f  ider */.  int ro
10930 75 6e 64 55 70 2c 20 20 20 20 20 20 20 20 20 20  undUp,          
10940 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75        /* Round u
10950 70 20 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e  p if true.  Roun
10960 64 20 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20  d down if false 
10970 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53  */.  tRowcnt *aS
10980 74 61 74 20 20 20 20 20 20 20 20 20 20 20 20 20  tat             
10990 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77   /* OUT: stats w
109a0 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29  ritten here */.)
109b0 7b 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20  {.  IndexSample 
109c0 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d  *aSample = pIdx-
109d0 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20  >aSample;.  int 
109e0 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
109f0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
10a00 20 6f 66 20 72 65 71 75 69 72 65 64 20 73 74 61   of required sta
10a10 74 73 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63  ts in anEq[] etc
10a20 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20  . */.  int iMin 
10a30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10a40 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73     /* Smallest s
10a50 61 6d 70 6c 65 20 6e 6f 74 20 79 65 74 20 74 65  ample not yet te
10a60 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 20  sted */.  int i 
10a70 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b  = pIdx->nSample;
10a80 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73        /* Smalles
10a90 74 20 73 61 6d 70 6c 65 20 6c 61 72 67 65 72 20  t sample larger 
10aa0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
10ab0 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69   pRec */.  int i
10ac0 54 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Test;           
10ad0 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 73         /* Next s
10ae0 61 6d 70 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f  ample to test */
10af0 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20  .  int res;     
10b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10b10 2a 20 52 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70  * Result of comp
10b20 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
10b30 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
10b40 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53  ITE_DEBUG.  UNUS
10b50 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 70 50  ED_PARAMETER( pP
10b60 61 72 73 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20  arse );.#endif. 
10b70 20 61 73 73 65 72 74 28 20 70 52 65 63 21 3d 30   assert( pRec!=0
10b80 20 29 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 52 65   );.  iCol = pRe
10b90 63 2d 3e 6e 46 69 65 6c 64 20 2d 20 31 3b 0a 20  c->nField - 1;. 
10ba0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
10bb0 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73  Sample>0 );.  as
10bc0 73 65 72 74 28 20 70 52 65 63 2d 3e 6e 46 69 65  sert( pRec->nFie
10bd0 6c 64 3e 30 20 26 26 20 69 43 6f 6c 3c 70 49 64  ld>0 && iCol<pId
10be0 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b  x->nSampleCol );
10bf0 0a 20 20 64 6f 7b 0a 20 20 20 20 69 54 65 73 74  .  do{.    iTest
10c00 20 3d 20 28 69 4d 69 6e 2b 69 29 2f 32 3b 0a 20   = (iMin+i)/2;. 
10c10 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
10c20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
10c30 65 28 61 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d  e(aSample[iTest]
10c40 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 54 65 73  .n, aSample[iTes
10c50 74 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20 20  t].p, pRec);.   
10c60 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
10c70 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74      iMin = iTest
10c80 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +1;.    }else{. 
10c90 20 20 20 20 20 69 20 3d 20 69 54 65 73 74 3b 0a       i = iTest;.
10ca0 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
10cb0 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 20 29 3b  res && iMin<i );
10cc0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
10cd0 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66  DEBUG.  /* The f
10ce0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
10cf0 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b  statements check
10d00 20 74 68 61 74 20 74 68 65 20 62 69 6e 61 72 79   that the binary
10d10 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a   search code.  *
10d20 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68  * above found th
10d30 65 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20  e right answer. 
10d40 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
10d50 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68  s no purpose oth
10d60 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20  er.  ** than to 
10d70 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72  invoke the asser
10d80 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  ts.  */.  if( re
10d90 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  s==0 ){.    /* I
10da0 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74 72  f (res==0) is tr
10db0 75 65 2c 20 74 68 65 6e 20 73 61 6d 70 6c 65 20  ue, then sample 
10dc0 24 69 20 6d 75 73 74 20 62 65 20 65 71 75 61 6c  $i must be equal
10dd0 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 20 20   to pRec */.    
10de0 61 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e  assert( i<pIdx->
10df0 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 61  nSample );.    a
10e00 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
10e10 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
10e20 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c  re(aSample[i].n,
10e30 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70   aSample[i].p, p
10e40 52 65 63 29 0a 20 20 20 20 20 20 20 20 20 7c 7c  Rec).         ||
10e50 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
10e60 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7d  locFailed );.  }
10e70 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68  else{.    /* Oth
10e80 65 72 77 69 73 65 2c 20 70 52 65 63 20 6d 75 73  erwise, pRec mus
10e90 74 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  t be smaller tha
10ea0 6e 20 73 61 6d 70 6c 65 20 24 69 20 61 6e 64 20  n sample $i and 
10eb0 6c 61 72 67 65 72 20 74 68 61 6e 0a 20 20 20 20  larger than.    
10ec0 2a 2a 20 73 61 6d 70 6c 65 20 28 24 69 2d 31 29  ** sample ($i-1)
10ed0 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
10ee0 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  ( i==pIdx->nSamp
10ef0 6c 65 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  le .         || 
10f00 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
10f10 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
10f20 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  [i].n, aSample[i
10f30 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20 20 20  ].p, pRec)>0.   
10f40 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
10f50 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
10f60 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  d );.    assert(
10f70 20 69 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c   i==0.         |
10f80 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  | sqlite3VdbeRec
10f90 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
10fa0 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70  le[i-1].n, aSamp
10fb0 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29  le[i-1].p, pRec)
10fc0 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  <0.         || p
10fd0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
10fe0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7d 0a 23  cFailed );.  }.#
10ff0 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53  endif /* ifdef S
11000 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a  QLITE_DEBUG */..
11010 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
11020 6e 74 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69  nt, aSample[i] i
11030 73 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70  s the first samp
11040 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74  le that is great
11050 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 6f 72 20  er than.  ** or 
11060 65 71 75 61 6c 20 74 6f 20 70 56 61 6c 2e 20 20  equal to pVal.  
11070 4f 72 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e  Or if i==pIdx->n
11080 53 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 6c 6c  Sample, then all
11090 20 73 61 6d 70 6c 65 73 20 61 72 65 20 6c 65 73   samples are les
110a0 73 0a 20 20 2a 2a 20 74 68 61 6e 20 70 56 61 6c  s.  ** than pVal
110b0 2e 20 20 49 66 20 61 53 61 6d 70 6c 65 5b 69 5d  .  If aSample[i]
110c0 3d 3d 70 56 61 6c 2c 20 74 68 65 6e 20 72 65 73  ==pVal, then res
110d0 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ==0..  */.  if( 
110e0 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 61 53  res==0 ){.    aS
110f0 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65  tat[0] = aSample
11100 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a  [i].anLt[iCol];.
11110 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61      aStat[1] = a
11120 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69  Sample[i].anEq[i
11130 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Col];.  }else{. 
11140 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
11150 72 2c 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b  r, iUpper, iGap;
11160 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b  .    if( i==0 ){
11170 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20  .      iLower = 
11180 30 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20  0;.      iUpper 
11190 3d 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 61 6e 4c  = aSample[0].anL
111a0 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 65 6c  t[iCol];.    }el
111b0 73 65 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72  se{.      iUpper
111c0 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d   = i>=pIdx->nSam
111d0 70 6c 65 20 3f 20 70 49 64 78 2d 3e 61 69 52 6f  ple ? pIdx->aiRo
111e0 77 45 73 74 5b 30 5d 20 3a 20 61 53 61 6d 70 6c  wEst[0] : aSampl
111f0 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b  e[i].anLt[iCol];
11200 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20  .      iLower = 
11210 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 61 6e 45  aSample[i-1].anE
11220 71 5b 69 43 6f 6c 5d 20 2b 20 61 53 61 6d 70 6c  q[iCol] + aSampl
11230 65 5b 69 2d 31 5d 2e 61 6e 4c 74 5b 69 43 6f 6c  e[i-1].anLt[iCol
11240 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74  ];.    }.    aSt
11250 61 74 5b 31 5d 20 3d 20 28 70 49 64 78 2d 3e 6e  at[1] = (pIdx->n
11260 4b 65 79 43 6f 6c 3e 69 43 6f 6c 20 3f 20 70 49  KeyCol>iCol ? pI
11270 64 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f 6c 5d  dx->aAvgEq[iCol]
11280 20 3a 20 31 29 3b 0a 20 20 20 20 69 66 28 20 69   : 1);.    if( i
11290 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b  Lower>=iUpper ){
112a0 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 30 3b  .      iGap = 0;
112b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
112c0 20 20 69 47 61 70 20 3d 20 69 55 70 70 65 72 20    iGap = iUpper 
112d0 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a  - iLower;.    }.
112e0 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20      if( roundUp 
112f0 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  ){.      iGap = 
11300 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20  (iGap*2)/3;.    
11310 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61  }else{.      iGa
11320 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20 20  p = iGap/3;.    
11330 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d  }.    aStat[0] =
11340 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a   iLower + iGap;.
11350 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
11360 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
11370 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
11380 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
11390 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
113a0 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  estimate the num
113b0 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
113c0 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64   will be visited
113d0 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20  .** by scanning 
113e0 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72  an index for a r
113f0 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20  ange of values. 
11400 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61  The range may ha
11410 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62  ve an upper.** b
11420 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f  ound, a lower bo
11430 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68  und, or both. Th
11440 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
11450 65 72 6d 73 20 74 68 61 74 20 73 65 74 20 74 68  erms that set th
11460 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c  e upper.** and l
11470 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20  ower bounds are 
11480 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20 70  represented by p
11490 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
114a0 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46   respectively. F
114b0 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61  or.** example, a
114c0 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64  ssuming that ind
114d0 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29  ex p is on t1(a)
114e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
114f0 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20  OM t1 WHERE a > 
11500 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a  ? AND a < ? ....
11510 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11520 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20        |_____|   
11530 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20  |_____|.**      
11540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11550 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20   |         |.** 
11560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11570 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55      pLower    pU
11580 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69  pper.**.** If ei
11590 74 68 65 72 20 6f 66 20 74 68 65 20 75 70 70 65  ther of the uppe
115a0 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64  r or lower bound
115b0 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c   is not present,
115c0 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61   then NULL is pa
115d0 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65  ssed in.** place
115e0 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f   of the correspo
115f0 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e  nding WhereTerm.
11600 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
11610 20 69 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e 70   in (pBuilder->p
11620 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
11630 29 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  ) is the index o
11640 66 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63  f the index.** c
11650 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f  olumn subject to
11660 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74   the range const
11670 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76  raint. Or, equiv
11680 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d  alently, the num
11690 62 65 72 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69  ber of.** equali
116a0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  ty constraints o
116b0 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20  ptimized by the 
116c0 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73  proposed index s
116d0 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  can. For example
116e0 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e  ,.** assuming in
116f0 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61  dex p is on t1(a
11700 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51  , b), and the SQ
11710 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a  L query is:.**.*
11720 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
11730 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20  WHERE a = ? AND 
11740 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20  b > ? AND b < ? 
11750 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e  ....**.** then n
11760 45 71 20 69 73 20 73 65 74 20 74 6f 20 31 20 28  Eq is set to 1 (
11770 61 73 20 74 68 65 20 72 61 6e 67 65 20 72 65 73  as the range res
11780 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20  tricted column, 
11790 62 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  b, is the second
117a0 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63   .** left-most c
117b0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
117c0 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  ex). Or, if the 
117d0 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  query is:.**.** 
117e0 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
117f0 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20  ERE a > ? AND a 
11800 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68  < ? ....**.** th
11810 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f  en nEq is set to
11820 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74   0..**.** When t
11830 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11840 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69  called, *pnOut i
11850 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 71 6c  s set to the sql
11860 69 74 65 33 4c 6f 67 45 73 74 28 29 20 6f 66 20  ite3LogEst() of 
11870 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
11880 20 72 6f 77 73 20 74 68 61 74 20 74 68 65 20 69   rows that the i
11890 6e 64 65 78 20 73 63 61 6e 20 69 73 20 65 78 70  ndex scan is exp
118a0 65 63 74 65 64 20 74 6f 20 76 69 73 69 74 20 77  ected to visit w
118b0 69 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69  ithout .** consi
118c0 64 65 72 69 6e 67 20 74 68 65 20 72 61 6e 67 65  dering the range
118d0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 66   constraints. If
118e0 20 6e 45 71 20 69 73 20 30 2c 20 74 68 69 73 20   nEq is 0, this 
118f0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
11900 20 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65   .** rows in the
11910 20 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e 67   index. Assuming
11920 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
11930 2c 20 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a 75  , *pnOut is adju
11940 73 74 65 64 20 28 72 65 64 75 63 65 64 29 0a 2a  sted (reduced).*
11950 2a 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  * to account for
11960 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 74 72   the range contr
11970 61 69 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e 64  aints pLower and
11980 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20   pUpper..** .** 
11990 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f  In the absence o
119a0 66 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 41  f sqlite_stat4 A
119b0 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72 20  NALYZE data, or 
119c0 69 66 20 73 75 63 68 20 64 61 74 61 20 63 61 6e  if such data can
119d0 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20  not be.** used, 
119e0 65 61 63 68 20 72 61 6e 67 65 20 69 6e 65 71 75  each range inequ
119f0 61 6c 69 74 79 20 72 65 64 75 63 65 73 20 74 68  ality reduces th
11a00 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62  e search space b
11a10 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 34 2e  y a factor of 4.
11a20 20 0a 2a 2a 20 48 65 6e 63 65 20 61 20 70 61 69   .** Hence a pai
11a30 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73  r of constraints
11a40 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72   (x>? AND x<?) r
11a50 65 64 75 63 65 73 20 74 68 65 20 65 78 70 65 63  educes the expec
11a60 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  ted number of.**
11a70 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   rows visited by
11a80 20 61 20 66 61 63 74 6f 72 20 6f 66 20 31 36 2e   a factor of 16.
11a90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
11aa0 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74  hereRangeScanEst
11ab0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
11ac0 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
11ad0 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
11ae0 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
11af0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
11b00 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
11b10 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77   WhereTerm *pLow
11b20 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62  er,   /* Lower b
11b30 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
11b40 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d  e. ex: "x>123" M
11b50 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
11b60 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70    WhereTerm *pUp
11b70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20  per,   /* Upper 
11b80 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
11b90 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20  ge. ex: "x<455" 
11ba0 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
11bb0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
11bc0 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66  oop     /* Modif
11bd0 79 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64 20  y the .nOut and 
11be0 6d 61 79 62 65 20 2e 72 52 75 6e 20 66 69 65 6c  maybe .rRun fiel
11bf0 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ds */.){.  int r
11c00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11c10 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f   int nOut = pLoo
11c20 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45 73  p->nOut;.  LogEs
11c30 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20  t nNew;..#ifdef 
11c40 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
11c50 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 49  AT3_OR_STAT4.  I
11c60 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d  ndex *p = pLoop-
11c70 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
11c80 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f  .  int nEq = pLo
11c90 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
11ca0 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70  ..  if( p->nSamp
11cb0 6c 65 3e 30 0a 20 20 20 26 26 20 6e 45 71 3d 3d  le>0.   && nEq==
11cc0 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
11cd0 6c 69 64 0a 20 20 20 26 26 20 6e 45 71 3c 70 2d  lid.   && nEq<p-
11ce0 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 26  >nSampleCol.   &
11cf0 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
11d00 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62  abled(pParse->db
11d10 2c 20 53 51 4c 49 54 45 5f 53 74 61 74 33 29 20  , SQLITE_Stat3) 
11d20 0a 20 20 29 7b 0a 20 20 20 20 55 6e 70 61 63 6b  .  ){.    Unpack
11d30 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d  edRecord *pRec =
11d40 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b   pBuilder->pRec;
11d50 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32  .    tRowcnt a[2
11d60 5d 3b 0a 20 20 20 20 75 38 20 61 66 66 3b 0a 0a  ];.    u8 aff;..
11d70 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20      /* Variable 
11d80 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62 65 20 73  iLower will be s
11d90 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61  et to the estima
11da0 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
11db0 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a 20 20 20   of rows in .   
11dc0 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68   ** the index th
11dd0 61 74 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e  at are less than
11de0 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
11df0 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71 75   of the range qu
11e00 65 72 79 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20  ery. The.    ** 
11e10 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62 65 69 6e  lower bound bein
11e20 67 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74  g the concatenat
11e30 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64 20 24 4c  ion of $P and $L
11e40 2c 20 77 68 65 72 65 20 24 50 20 69 73 20 74 68  , where $P is th
11e50 65 0a 20 20 20 20 2a 2a 20 6b 65 79 2d 70 72 65  e.    ** key-pre
11e60 66 69 78 20 66 6f 72 6d 65 64 20 62 79 20 74 68  fix formed by th
11e70 65 20 6e 45 71 20 76 61 6c 75 65 73 20 6d 61 74  e nEq values mat
11e80 63 68 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ched against the
11e90 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73 74 0a 20   nEq left-most. 
11ea0 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66     ** columns of
11eb0 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20   the index, and 
11ec0 24 4c 20 69 73 20 74 68 65 20 76 61 6c 75 65 20  $L is the value 
11ed0 69 6e 20 70 4c 6f 77 65 72 2e 0a 20 20 20 20 2a  in pLower..    *
11ee0 2a 0a 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20  *.    ** Or, if 
11ef0 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f  pLower is NULL o
11f00 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65  r $L cannot be e
11f10 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74  xtracted from it
11f20 20 28 62 65 63 61 75 73 65 20 69 74 0a 20 20 20   (because it.   
11f30 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 69 6d   ** is not a sim
11f40 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f 72 20  ple variable or 
11f50 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29 2c 20  literal value), 
11f60 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  the lower bound 
11f70 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 61  of the.    ** ra
11f80 6e 67 65 20 69 73 20 24 50 2e 20 44 75 65 20 74  nge is $P. Due t
11f90 6f 20 61 20 71 75 69 72 6b 20 69 6e 20 74 68 65  o a quirk in the
11fa0 20 77 61 79 20 77 68 65 72 65 4b 65 79 53 74 61   way whereKeySta
11fb0 74 73 28 29 20 77 6f 72 6b 73 2c 20 65 76 65 6e  ts() works, even
11fc0 0a 20 20 20 20 2a 2a 20 69 66 20 24 4c 20 69 73  .    ** if $L is
11fd0 20 61 76 61 69 6c 61 62 6c 65 2c 20 77 68 65 72   available, wher
11fe0 65 4b 65 79 53 74 61 74 73 28 29 20 69 73 20 63  eKeyStats() is c
11ff0 61 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68 20 28  alled for both (
12000 24 50 29 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20  $P) and .    ** 
12010 28 24 50 3a 24 4c 29 20 61 6e 64 20 74 68 65 20  ($P:$L) and the 
12020 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 74 77  larger of the tw
12030 6f 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  o returned value
12040 73 20 75 73 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  s used..    **. 
12050 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c     ** Similarly,
12060 20 69 55 70 70 65 72 20 69 73 20 74 6f 20 62 65   iUpper is to be
12070 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69   set to the esti
12080 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
12090 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a  er of rows.    *
120a0 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  * less than the 
120b0 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  upper bound of t
120c0 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20  he range query. 
120d0 57 68 65 72 65 20 74 68 65 20 75 70 70 65 72 20  Where the upper 
120e0 62 6f 75 6e 64 0a 20 20 20 20 2a 2a 20 69 73 20  bound.    ** is 
120f0 65 69 74 68 65 72 20 28 24 50 29 20 6f 72 20 28  either ($P) or (
12100 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20 65  $P:$U). Again, e
12110 76 65 6e 20 69 66 20 24 55 20 69 73 20 61 76 61  ven if $U is ava
12120 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76 61 6c  ilable, both val
12130 75 65 73 0a 20 20 20 20 2a 2a 20 6f 66 20 69 55  ues.    ** of iU
12140 70 70 65 72 20 61 72 65 20 72 65 71 75 65 73 74  pper are request
12150 65 64 20 6f 66 20 77 68 65 72 65 4b 65 79 53 74  ed of whereKeySt
12160 61 74 73 28 29 20 61 6e 64 20 74 68 65 20 73 6d  ats() and the sm
12170 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20 20 20 20  aller used..    
12180 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69  */.    tRowcnt i
12190 4c 6f 77 65 72 3b 0a 20 20 20 20 74 52 6f 77 63  Lower;.    tRowc
121a0 6e 74 20 69 55 70 70 65 72 3b 0a 0a 20 20 20 20  nt iUpper;..    
121b0 69 66 28 20 6e 45 71 3d 3d 70 2d 3e 6e 4b 65 79  if( nEq==p->nKey
121c0 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 61 66 66  Col ){.      aff
121d0 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   = SQLITE_AFF_IN
121e0 54 45 47 45 52 3b 0a 20 20 20 20 7d 65 6c 73 65  TEGER;.    }else
121f0 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 70 2d  {.      aff = p-
12200 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d  >pTable->aCol[p-
12210 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e  >aiColumn[nEq]].
12220 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 7d 0a  affinity;.    }.
12230 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65      /* Determine
12240 20 69 4c 6f 77 65 72 20 61 6e 64 20 69 55 70 70   iLower and iUpp
12250 65 72 20 75 73 69 6e 67 20 28 24 50 29 20 6f 6e  er using ($P) on
12260 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  ly. */.    if( n
12270 45 71 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  Eq==0 ){.      i
12280 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  Lower = 0;.     
12290 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 61 69 52   iUpper = p->aiR
122a0 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 7d 65  owEst[0];.    }e
122b0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  lse{.      /* No
122c0 74 65 3a 20 74 68 69 73 20 63 61 6c 6c 20 63 6f  te: this call co
122d0 75 6c 64 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  uld be optimized
122e0 20 61 77 61 79 20 2d 20 73 69 6e 63 65 20 74 68   away - since th
122f0 65 20 73 61 6d 65 20 76 61 6c 75 65 73 20 6d 75  e same values mu
12300 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 68 61 76  st .      ** hav
12310 65 20 62 65 65 6e 20 72 65 71 75 65 73 74 65 64  e been requested
12320 20 77 68 65 6e 20 74 65 73 74 69 6e 67 20 6b 65   when testing ke
12330 79 20 24 50 20 69 6e 20 77 68 65 72 65 45 71 75  y $P in whereEqu
12340 61 6c 53 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f  alScanEst().  */
12350 0a 20 20 20 20 20 20 77 68 65 72 65 4b 65 79 53  .      whereKeyS
12360 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
12370 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20  pRec, 0, a);.   
12380 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d     iLower = a[0]
12390 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d  ;.      iUpper =
123a0 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20   a[0] + a[1];.  
123b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70    }..    /* If p
123c0 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65  ossible, improve
123d0 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65   on the iLower e
123e0 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24  stimate using ($
123f0 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 69 66  P:$L). */.    if
12400 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  ( pLower ){.    
12410 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20    int bOk;      
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12430 20 54 72 75 65 20 69 66 20 76 61 6c 75 65 20 69   True if value i
12440 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
12450 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20   pExpr */.      
12460 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c  Expr *pExpr = pL
12470 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  ower->pExpr->pRi
12480 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ght;.      asser
12490 74 28 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65  t( (pLower->eOpe
124a0 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57  rator & (WO_GT|W
124b0 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20 20  O_GE))!=0 );.   
124c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
124d0 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
124e0 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52  e(pParse, p, &pR
124f0 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  ec, pExpr, aff, 
12500 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20  nEq, &bOk);.    
12510 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12520 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20  _OK && bOk ){.  
12530 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e        tRowcnt iN
12540 65 77 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  ew;.        wher
12550 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
12560 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29  , p, pRec, 0, a)
12570 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d  ;.        iNew =
12580 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65 72   a[0] + ((pLower
12590 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
125a0 5f 47 54 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29  _GT) ? a[1] : 0)
125b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4e  ;.        if( iN
125c0 65 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77  ew>iLower ) iLow
125d0 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20  er = iNew;.     
125e0 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20     nOut--;.     
125f0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
12600 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d   If possible, im
12610 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 55 70  prove on the iUp
12620 70 65 72 20 65 73 74 69 6d 61 74 65 20 75 73 69  per estimate usi
12630 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20  ng ($P:$U). */. 
12640 20 20 20 69 66 28 20 70 55 70 70 65 72 20 29 7b     if( pUpper ){
12650 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20  .      int bOk; 
12660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12670 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61     /* True if va
12680 6c 75 65 20 69 73 20 65 78 74 72 61 63 74 65 64  lue is extracted
12690 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20   from pExpr */. 
126a0 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
126b0 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72   = pUpper->pExpr
126c0 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
126d0 61 73 73 65 72 74 28 20 28 70 55 70 70 65 72 2d  assert( (pUpper-
126e0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
126f0 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29  _LT|WO_LE))!=0 )
12700 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
12710 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
12720 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70  tValue(pParse, p
12730 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20  , &pRec, pExpr, 
12740 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b  aff, nEq, &bOk);
12750 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
12760 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20  QLITE_OK && bOk 
12770 29 7b 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63  ){.        tRowc
12780 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20  nt iNew;.       
12790 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
127a0 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20  Parse, p, pRec, 
127b0 31 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 69  1, a);.        i
127c0 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70  New = a[0] + ((p
127d0 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Upper->eOperator
127e0 20 26 20 57 4f 5f 4c 45 29 20 3f 20 61 5b 31 5d   & WO_LE) ? a[1]
127f0 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69   : 0);.        i
12800 66 28 20 69 4e 65 77 3c 69 55 70 70 65 72 20 29  f( iNew<iUpper )
12810 20 69 55 70 70 65 72 20 3d 20 69 4e 65 77 3b 0a   iUpper = iNew;.
12820 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a          nOut--;.
12830 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
12840 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65     pBuilder->pRe
12850 63 20 3d 20 70 52 65 63 3b 0a 20 20 20 20 69 66  c = pRec;.    if
12860 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12870 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 55 70  ){.      if( iUp
12880 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b 0a 20 20  per>iLower ){.  
12890 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c        nNew = sql
128a0 69 74 65 33 4c 6f 67 45 73 74 28 69 55 70 70 65  ite3LogEst(iUppe
128b0 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20  r - iLower);.   
128c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
128d0 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20 20 20 20    nNew = 10;    
128e0 20 20 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d      assert( 10==
128f0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29  sqlite3LogEst(2)
12900 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
12910 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20    if( nNew<nOut 
12920 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20  ){.        nOut 
12930 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a  = nNew;.      }.
12940 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75        pLoop->nOu
12950 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74  t = (LogEst)nOut
12960 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  ;.      WHERETRA
12970 43 45 28 30 78 31 30 2c 20 28 22 72 61 6e 67 65  CE(0x10, ("range
12980 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25   scan regions: %
12990 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22  u..%u  est=%d\n"
129a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
129b0 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29             (u32)
129c0 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70  iLower, (u32)iUp
129d0 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 20  per, nOut));.   
129e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
129f0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  _OK;.    }.  }.#
12a00 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
12a10 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b  RAMETER(pParse);
12a20 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
12a30 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b 0a 23  TER(pBuilder);.#
12a40 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
12a50 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72  pLower || pUpper
12a60 20 29 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a   );.  /* TUNING:
12a70 20 20 45 61 63 68 20 69 6e 65 71 75 61 6c 69 74    Each inequalit
12a80 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 64  y constraint red
12a90 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20  uces the search 
12aa0 73 70 61 63 65 20 34 2d 66 6f 6c 64 2e 0a 20 20  space 4-fold..  
12ab0 2a 2a 20 41 20 42 45 54 57 45 45 4e 20 6f 70 65  ** A BETWEEN ope
12ac0 72 61 74 6f 72 2c 20 74 68 65 72 65 66 6f 72 65  rator, therefore
12ad0 2c 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65  , reduces the se
12ae0 61 72 63 68 20 73 70 61 63 65 20 31 36 2d 66 6f  arch space 16-fo
12af0 6c 64 20 2a 2f 0a 20 20 6e 4e 65 77 20 3d 20 6e  ld */.  nNew = n
12b00 4f 75 74 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65  Out;.  if( pLowe
12b10 72 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e 77 74  r && (pLower->wt
12b20 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
12b30 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4e  LL)==0 ){.    nN
12b40 65 77 20 2d 3d 20 32 30 3b 20 20 20 20 20 20 20  ew -= 20;       
12b50 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c   assert( 20==sql
12b60 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b  ite3LogEst(4) );
12b70 0a 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 7d  .    nOut--;.  }
12b80 0a 20 20 69 66 28 20 70 55 70 70 65 72 20 29 7b  .  if( pUpper ){
12b90 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20 32 30 3b  .    nNew -= 20;
12ba0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
12bb0 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  20==sqlite3LogEs
12bc0 74 28 34 29 20 29 3b 0a 20 20 20 20 6e 4f 75 74  t(4) );.    nOut
12bd0 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4e  --;.  }.  if( nN
12be0 65 77 3c 31 30 20 29 20 6e 4e 65 77 20 3d 20 31  ew<10 ) nNew = 1
12bf0 30 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f  0;.  if( nNew<nO
12c00 75 74 20 29 20 6e 4f 75 74 20 3d 20 6e 4e 65 77  ut ) nOut = nNew
12c10 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20  ;.  pLoop->nOut 
12c20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a  = (LogEst)nOut;.
12c30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12c40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
12c50 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
12c60 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT4./*.** Estima
12c70 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
12c80 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
12c90 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65  be returned base
12ca0 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c  d on.** an equal
12cb0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 78  ity constraint x
12cc0 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65 72 65  =VALUE and where
12cd0 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63 63 75   that VALUE occu
12ce0 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73  rs in.** the his
12cf0 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20 54 68  togram data.  Th
12d00 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68  is only works wh
12d10 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65 66 74  en x is the left
12d20 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  -most.** column 
12d30 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20  of an index and 
12d40 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73  sqlite_stat3 his
12d50 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61  togram data is a
12d60 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20  vailable.** for 
12d70 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57 68 65  that index.  Whe
12d80 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68  n pExpr==NULL th
12d90 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e  at means the con
12da0 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78  straint is.** "x
12db0 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61   IS NULL" instea
12dc0 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a  d of "x=VALUE"..
12dd0 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
12de0 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f  estimated row co
12df0 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20  unt into *pnRow 
12e00 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
12e10 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61  E_OK. .** If una
12e20 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65  ble to make an e
12e30 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a  stimate, leave *
12e40 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20  pnRow unchanged 
12e50 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  and return.** no
12e60 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  n-zero..**.** Th
12e70 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66  is routine can f
12e80 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61  ail if it is una
12e90 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f  ble to load a co
12ea0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
12eb0 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72  .** required for
12ec0 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73   string comparis
12ed0 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65  on, or if unable
12ee0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
12ef0 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46  ory.** for a UTF
12f00 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75   conversion requ
12f10 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  ired for compari
12f20 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20  son.  The error 
12f30 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  is stored.** in 
12f40 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
12f50 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
12f60 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c 53 63  int whereEqualSc
12f70 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
12f80 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
12f90 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
12fa0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
12fb0 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  xt */.  WhereLoo
12fc0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
12fd0 65 72 2c 0a 20 20 45 78 70 72 20 2a 70 45 78 70  er,.  Expr *pExp
12fe0 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78  r,         /* Ex
12ff0 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c  pression for VAL
13000 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41 4c 55  UE in the x=VALU
13010 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  E constraint */.
13020 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77    tRowcnt *pnRow
13030 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
13040 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20  the revised row 
13050 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f  estimate here */
13060 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  .){.  Index *p =
13070 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
13080 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
13090 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 42 75  .  int nEq = pBu
130a0 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
130b0 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55 6e 70 61  tree.nEq;.  Unpa
130c0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63  ckedRecord *pRec
130d0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65   = pBuilder->pRe
130e0 63 3b 0a 20 20 75 38 20 61 66 66 3b 20 20 20 20  c;.  u8 aff;    
130f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13100 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74  * Column affinit
13110 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  y */.  int rc;  
13120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13130 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20   /* Subfunction 
13140 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
13150 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20   tRowcnt a[2];  
13160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
13170 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e  atistics */.  in
13180 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74  t bOk;..  assert
13190 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73  ( nEq>=1 );.  as
131a0 73 65 72 74 28 20 6e 45 71 3c 3d 28 70 2d 3e 6e  sert( nEq<=(p->n
131b0 4b 65 79 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 61  KeyCol+1) );.  a
131c0 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c  ssert( p->aSampl
131d0 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
131e0 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29  ( p->nSample>0 )
131f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69  ;.  assert( pBui
13200 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c  lder->nRecValid<
13210 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nEq );..  /* If 
13220 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61  values are not a
13230 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c  vailable for all
13240 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69   fields of the i
13250 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74  ndex to the left
13260 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e  .  ** of this on
13270 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63  e, no estimate c
13280 61 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75  an be made. Retu
13290 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
132a0 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75  ND. */.  if( pBu
132b0 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
132c0 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20  <(nEq-1) ){.    
132d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
132e0 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f  TFOUND;.  }..  /
132f0 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74  * This is an opt
13300 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20  imization only. 
13310 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
13320 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
13330 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c  Value().  ** bel
13340 6f 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20  ow would return 
13350 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20  the same value. 
13360 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 70 2d   */.  if( nEq>p-
13370 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20  >nKeyCol ){.    
13380 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  *pnRow = 1;.    
13390 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
133a0 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 20 3d 20 70  ;.  }..  aff = p
133b0 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70  ->pTable->aCol[p
133c0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31  ->aiColumn[nEq-1
133d0 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 72  ]].affinity;.  r
133e0 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34  c = sqlite3Stat4
133f0 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50  ProbeSetValue(pP
13400 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20  arse, p, &pRec, 
13410 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2d  pExpr, aff, nEq-
13420 31 2c 20 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69  1, &bOk);.  pBui
13430 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65  lder->pRec = pRe
13440 63 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  c;.  if( rc!=SQL
13450 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
13460 72 63 3b 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30  rc;.  if( bOk==0
13470 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
13480 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75  _NOTFOUND;.  pBu
13490 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
134a0 20 3d 20 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65   = nEq;..  where
134b0 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
134c0 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b   p, pRec, 0, a);
134d0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
134e0 31 30 2c 28 22 65 71 75 61 6c 69 74 79 20 73 63  10,("equality sc
134f0 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e  an regions: %d\n
13500 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a  ", (int)a[1]));.
13510 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b    *pnRow = a[1];
13520 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .  .  return rc;
13530 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
13540 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
13550 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69  _OR_STAT4 */..#i
13560 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
13570 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
13580 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
13590 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
135a0 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
135b0 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20   returned based 
135c0 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73  on.** an IN cons
135d0 74 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65  traint where the
135e0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
135f0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
13600 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74  tor.** is a list
13610 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61   of values.  Exa
13620 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
13630 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31     WHERE x IN (1
13640 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72  ,2,3,4).**.** Wr
13650 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
13660 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
13670 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
13680 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
13690 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
136a0 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
136b0 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
136c0 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
136d0 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
136e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
136f0 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
13700 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
13710 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
13720 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
13730 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
13740 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
13750 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
13760 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
13770 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
13780 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
13790 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
137a0 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
137b0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
137c0 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
137d0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
137e0 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61  eInScanEst(.  Pa
137f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
13800 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
13810 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
13820 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
13830 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
13840 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c  Builder,.  ExprL
13850 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
13860 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73  /* The value lis
13870 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  t on the RHS of 
13880 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c  "x IN (v1,v2,v3,
13890 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63  ...)" */.  tRowc
138a0 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20  nt *pnRow       
138b0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
138c0 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
138d0 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  e here */.){.  I
138e0 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64  ndex *p = pBuild
138f0 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
13900 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20  e.pIndex;.  int 
13910 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69  nRecValid = pBui
13920 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b  lder->nRecValid;
13930 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13940 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 53 75  TE_OK;     /* Su
13950 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e  bfunction return
13960 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63   code */.  tRowc
13970 6e 74 20 6e 45 73 74 3b 20 20 20 20 20 20 20 20  nt nEst;        
13980 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13990 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  rows for a singl
139a0 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52 6f 77  e term */.  tRow
139b0 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b  cnt nRowEst = 0;
139c0 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d      /* New estim
139d0 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
139e0 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69  r of rows */.  i
139f0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
13a00 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
13a10 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
13a20 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21  ert( p->aSample!
13a30 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  =0 );.  for(i=0;
13a40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
13a50 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  & i<pList->nExpr
13a60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74  ; i++){.    nEst
13a70 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30   = p->aiRowEst[0
13a80 5d 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  ];.    rc = wher
13a90 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50  eEqualScanEst(pP
13aa0 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
13ab0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
13ac0 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e  r, &nEst);.    n
13ad0 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a  RowEst += nEst;.
13ae0 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52      pBuilder->nR
13af0 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61  ecValid = nRecVa
13b00 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  lid;.  }..  if( 
13b10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13b20 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74  .    if( nRowEst
13b30 20 3e 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30   > p->aiRowEst[0
13b40 5d 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 70 2d  ] ) nRowEst = p-
13b50 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20  >aiRowEst[0];.  
13b60 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45    *pnRow = nRowE
13b70 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41  st;.    WHERETRA
13b80 43 45 28 30 78 31 30 2c 28 22 49 4e 20 72 6f 77  CE(0x10,("IN row
13b90 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d 25   estimate: est=%
13ba0 67 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b  g\n", nRowEst));
13bb0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
13bc0 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
13bd0 69 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b  id==nRecValid );
13be0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13bf0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13c00 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
13c10 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT4 */../*.**
13c20 20 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20   Disable a term 
13c30 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
13c40 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f  use.  Except, do
13c50 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65   not disable the
13c60 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63   term.** if it c
13c70 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f  ontrols a LEFT O
13c80 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74  UTER JOIN and it
13c90 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
13ca0 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20  te in the ON.** 
13cb0 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
13cc0 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a  of that join..**
13cd0 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65  .** Consider the
13ce0 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20   term t2.z='ok' 
13cf0 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
13d00 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20   queries:.**.** 
13d10 20 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20    (1)  SELECT * 
13d20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
13d30 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
13d40 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b  x WHERE t2.z='ok
13d50 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45  '.**   (2)  SELE
13d60 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
13d70 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
13d80 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d  a=t2.x AND t2.z=
13d90 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53  'ok'.**   (3)  S
13da0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
13db0 20 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74   t2 WHERE t1.a=t
13dc0 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b  2.x AND t2.z='ok
13dd0 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a  '.**.** The t2.z
13de0 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65  ='ok' is disable
13df0 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20  d in the in (2) 
13e00 62 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69  because it origi
13e10 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20  nates.** in the 
13e20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  ON clause.  The 
13e30 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64  term is disabled
13e40 20 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20   in (3) because 
13e50 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a  it is not part.*
13e60 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  * of a LEFT OUTE
13e70 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c  R JOIN.  In (1),
13e80 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74   the term is not
13e90 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a   disabled..**.**
13ea0 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72   Disabling a ter
13eb0 6d 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65  m causes that te
13ec0 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73  rm to not be tes
13ed0 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72  ted in the inner
13ee0 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20   loop.** of the 
13ef0 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67  join.  Disabling
13f00 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
13f10 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73  ion.  When terms
13f20 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
13f30 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65  * by indices, we
13f40 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f   disable them to
13f50 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61   prevent redunda
13f60 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68 65 20  nt tests in the 
13f70 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20  inner.** loop.  
13f80 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65  We would get the
13f90 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73   correct results
13fa0 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65   if nothing were
13fb0 20 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a   ever disabled,.
13fc0 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67  ** but joins mig
13fd0 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20  ht run a little 
13fe0 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69  slower.  The tri
13ff0 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65  ck is to disable
14000 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77   as much.** as w
14010 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69  e can without di
14020 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68  sabling too much
14030 2e 20 20 49 66 20 77 65 20 64 69 73 61 62 6c 65  .  If we disable
14040 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67  d in (1), we'd g
14050 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20  et.** the wrong 
14060 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69 63  answer.  See tic
14070 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61  ket #813..*/.sta
14080 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65  tic void disable
14090 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20  Term(WhereLevel 
140a0 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65  *pLevel, WhereTe
140b0 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66  rm *pTerm){.  if
140c0 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26  ( pTerm.      &&
140d0 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
140e0 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d   & TERM_CODED)==
140f0 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76  0.      && (pLev
14100 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30  el->iLeftJoin==0
14110 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
14120 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
14130 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a  , EP_FromJoin)).
14140 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c        && (pLevel
14150 2d 3e 6e 6f 74 52 65 61 64 79 20 26 20 70 54 65  ->notReady & pTe
14160 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 29 3d 3d  rm->prereqAll)==
14170 30 0a 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d  0.  ){.    pTerm
14180 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
14190 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28  M_CODED;.    if(
141a0 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e   pTerm->iParent>
141b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  =0 ){.      Wher
141c0 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20  eTerm *pOther = 
141d0 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70  &pTerm->pWC->a[p
141e0 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a  Term->iParent];.
141f0 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74        if( (--pOt
14200 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20  her->nChild)==0 
14210 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  ){.        disab
14220 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
14230 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Other);.      }.
14240 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
14250 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66  ** Code an OP_Af
14260 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 74 6f  finity opcode to
14270 20 61 70 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d   apply the colum
14280 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  n affinity strin
14290 67 20 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65  g zAff.** to the
142a0 20 6e 20 72 65 67 69 73 74 65 72 73 20 73 74 61   n registers sta
142b0 72 74 69 6e 67 20 61 74 20 62 61 73 65 2e 20 0a  rting at base. .
142c0 2a 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69  **.** As an opti
142d0 6d 69 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45  mization, SQLITE
142e0 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65  _AFF_NONE entrie
142f0 73 20 28 77 68 69 63 68 20 61 72 65 20 6e 6f 2d  s (which are no-
14300 6f 70 73 29 20 61 74 20 74 68 65 0a 2a 2a 20 62  ops) at the.** b
14310 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64  eginning and end
14320 20 6f 66 20 7a 41 66 66 20 61 72 65 20 69 67 6e   of zAff are ign
14330 6f 72 65 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e  ored.  If all en
14340 74 72 69 65 73 20 69 6e 20 7a 41 66 66 20 61 72  tries in zAff ar
14350 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  e.** SQLITE_AFF_
14360 4e 4f 4e 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f  NONE, then no co
14370 64 65 20 67 65 74 73 20 67 65 6e 65 72 61 74 65  de gets generate
14380 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
14390 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 73 20  utine makes its 
143a0 6f 77 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66 66  own copy of zAff
143b0 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 6c   so that the cal
143c0 6c 65 72 20 69 73 20 66 72 65 65 0a 2a 2a 20 74  ler is free.** t
143d0 6f 20 6d 6f 64 69 66 79 20 7a 41 66 66 20 61 66  o modify zAff af
143e0 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
143f0 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61   returns..*/.sta
14400 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41 70 70  tic void codeApp
14410 6c 79 41 66 66 69 6e 69 74 79 28 50 61 72 73 65  lyAffinity(Parse
14420 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 62 61   *pParse, int ba
14430 73 65 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20  se, int n, char 
14440 2a 7a 41 66 66 29 7b 0a 20 20 56 64 62 65 20 2a  *zAff){.  Vdbe *
14450 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
14460 65 3b 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d 30  e;.  if( zAff==0
14470 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
14480 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
14490 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
144a0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
144b0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20  sert( v!=0 );.. 
144c0 20 2f 2a 20 41 64 6a 75 73 74 20 62 61 73 65 20   /* Adjust base 
144d0 61 6e 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76  and n to skip ov
144e0 65 72 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  er SQLITE_AFF_NO
144f0 4e 45 20 65 6e 74 72 69 65 73 20 61 74 20 74 68  NE entries at th
14500 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a  e beginning.  **
14510 20 61 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20   and end of the 
14520 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e  affinity string.
14530 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e  .  */.  while( n
14540 3e 30 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53  >0 && zAff[0]==S
14550 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
14560 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62  {.    n--;.    b
14570 61 73 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b  ase++;.    zAff+
14580 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  +;.  }.  while( 
14590 6e 3e 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d  n>1 && zAff[n-1]
145a0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
145b0 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20  E ){.    n--;.  
145c0 7d 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65  }..  /* Code the
145d0 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63   OP_Affinity opc
145e0 6f 64 65 20 69 66 20 74 68 65 72 65 20 69 73 20  ode if there is 
145f0 61 6e 79 74 68 69 6e 67 20 6c 65 66 74 20 74 6f  anything left to
14600 20 64 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e   do. */.  if( n>
14610 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
14620 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14630 5f 41 66 66 69 6e 69 74 79 2c 20 62 61 73 65 2c  _Affinity, base,
14640 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   n);.    sqlite3
14650 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
14660 2d 31 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20  -1, zAff, n);.  
14670 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
14680 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
14690 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e  (pParse, base, n
146a0 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
146b0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
146c0 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61  or a single equa
146d0 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65  lity term of the
146e0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
146f0 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74  An equality.** t
14700 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65  erm can be eithe
14710 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e  r X=expr or X IN
14720 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20   (...).   pTerm 
14730 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62  is the term to b
14740 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a  e .** coded..**.
14750 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 76  ** The current v
14760 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e  alue for the con
14770 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20  straint is left 
14780 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
14790 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f  ..**.** For a co
147a0 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20  nstraint of the 
147b0 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65  form X=expr, the
147c0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65   expression is e
147d0 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73  valuated and its
147e0 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65  .** result is le
147f0 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ft on the stack.
14800 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74    For constraint
14810 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  s of the form X 
14820 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73  IN (...).** this
14830 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70   routine sets up
14840 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
14850 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  l iterate over a
14860 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a  ll values of X..
14870 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
14880 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a  deEqualityTerm(.
14890 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
148a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
148b0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
148c0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
148d0 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72  rm,   /* The ter
148e0 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
148f0 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65  lause to be code
14900 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  d */.  WhereLeve
14910 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 54 68  l *pLevel, /* Th
14920 65 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46  e level of the F
14930 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72  ROM clause we ar
14940 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
14950 20 20 69 6e 74 20 69 45 71 2c 20 20 20 20 20 20    int iEq,      
14960 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
14970 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 74  f the equality t
14980 65 72 6d 20 77 69 74 68 69 6e 20 74 68 69 73 20  erm within this 
14990 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 62  level */.  int b
149a0 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Rev,           /
149b0 2a 20 54 72 75 65 20 66 6f 72 20 72 65 76 65 72  * True for rever
149c0 73 65 2d 6f 72 64 65 72 20 49 4e 20 6f 70 65 72  se-order IN oper
149d0 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ations */.  int 
149e0 69 54 61 72 67 65 74 20 20 20 20 20 20 20 20 20  iTarget         
149f0 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6c 65  /* Attempt to le
14a00 61 76 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  ave results in t
14a10 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
14a20 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20  ){.  Expr *pX = 
14a30 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
14a40 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
14a50 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
14a60 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
14a70 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
14a80 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  r holding result
14a90 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
14aa0 69 54 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69  iTarget>0 );.  i
14ab0 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  f( pX->op==TK_EQ
14ac0 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 73   ){.    iReg = s
14ad0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
14ae0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 58 2d  rget(pParse, pX-
14af0 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65 74  >pRight, iTarget
14b00 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
14b10 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  X->op==TK_ISNULL
14b20 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 69   ){.    iReg = i
14b30 54 61 72 67 65 74 3b 0a 20 20 20 20 73 71 6c 69  Target;.    sqli
14b40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14b50 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65   OP_Null, 0, iRe
14b60 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
14b70 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
14b80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
14b90 74 20 65 54 79 70 65 3b 0a 20 20 20 20 69 6e 74  t eType;.    int
14ba0 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72 75 63   iTab;.    struc
14bb0 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20  t InLoop *pIn;. 
14bc0 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c     WhereLoop *pL
14bd0 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
14be0 4c 6f 6f 70 3b 0a 0a 20 20 20 20 69 66 28 20 28  Loop;..    if( (
14bf0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
14c00 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
14c10 42 4c 45 29 3d 3d 30 0a 20 20 20 20 20 20 26 26  BLE)==0.      &&
14c20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
14c30 70 49 6e 64 65 78 21 3d 30 0a 20 20 20 20 20 20  pIndex!=0.      
14c40 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  && pLoop->u.btre
14c50 65 2e 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f  e.pIndex->aSortO
14c60 72 64 65 72 5b 69 45 71 5d 0a 20 20 20 20 29 7b  rder[iEq].    ){
14c70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14c80 20 69 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20   iEq==0 );.     
14c90 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76 20   testcase( bRev 
14ca0 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d 20  );.      bRev = 
14cb0 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20  !bRev;.    }.   
14cc0 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
14cd0 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52  =TK_IN );.    iR
14ce0 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20  eg = iTarget;.  
14cf0 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
14d00 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61  3FindInIndex(pPa
14d10 72 73 65 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20  rse, pX, 0);.   
14d20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
14d30 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
14d40 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
14d50 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20  e( bRev );.     
14d60 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a 20   bRev = !bRev;. 
14d70 20 20 20 7d 0a 20 20 20 20 69 54 61 62 20 3d 20     }.    iTab = 
14d80 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pX->iTable;.    
14d90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14da0 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c  2(v, bRev ? OP_L
14db0 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c  ast : OP_Rewind,
14dc0 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 61   iTab, 0);.    a
14dd0 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
14de0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
14df0 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a 20  ULTI_OR)==0 );. 
14e00 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
14e10 73 20 7c 3d 20 57 48 45 52 45 5f 49 4e 5f 41 42  s |= WHERE_IN_AB
14e20 4c 45 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  LE;.    if( pLev
14e30 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20  el->u.in.nIn==0 
14e40 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
14e50 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74  >addrNxt = sqlit
14e60 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
14e70 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  v);.    }.    pL
14e80 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b  evel->u.in.nIn++
14e90 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  ;.    pLevel->u.
14ea0 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20  in.aInLoop =.   
14eb0 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61      sqlite3DbRea
14ec0 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73  llocOrFree(pPars
14ed0 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75  e->db, pLevel->u
14ee0 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20  .in.aInLoop,.   
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f00 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
14f10 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  f(pLevel->u.in.a
14f20 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65  InLoop[0])*pLeve
14f30 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20  l->u.in.nIn);.  
14f40 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e    pIn = pLevel->
14f50 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20  u.in.aInLoop;.  
14f60 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20    if( pIn ){.   
14f70 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c     pIn += pLevel
14f80 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a  ->u.in.nIn - 1;.
14f90 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20        pIn->iCur 
14fa0 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69 66  = iTab;.      if
14fb0 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
14fc0 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  X_ROWID ){.     
14fd0 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f     pIn->addrInTo
14fe0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
14ff0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
15000 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a  d, iTab, iReg);.
15010 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15020 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e       pIn->addrIn
15030 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
15040 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
15050 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69  lumn, iTab, 0, i
15060 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Reg);.      }.  
15070 20 20 20 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f      pIn->eEndLoo
15080 70 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  pOp = bRev ? OP_
15090 50 72 65 76 49 66 4f 70 65 6e 20 3a 20 4f 50 5f  PrevIfOpen : OP_
150a0 4e 65 78 74 49 66 4f 70 65 6e 3b 0a 20 20 20 20  NextIfOpen;.    
150b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
150c0 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op1(v, OP_IsNull
150d0 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c  , iReg);.    }el
150e0 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
150f0 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a  ->u.in.nIn = 0;.
15100 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
15110 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70  .  disableTerm(p
15120 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20  Level, pTerm);. 
15130 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a   return iReg;.}.
15140 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
15150 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
15160 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61  valuate all == a
15170 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  nd IN constraint
15180 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65  s for an.** inde
15190 78 20 73 63 61 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f  x scan..**.** Fo
151a0 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69  r example, consi
151b0 64 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62  der table t1(a,b
151c0 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69  ,c,d,e,f) with i
151d0 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a  ndex i1(a,b,c)..
151e0 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20 57  ** Suppose the W
151f0 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74  HERE clause is t
15200 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62  his:  a==5 AND b
15210 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20   IN (1,2,3) AND 
15220 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20  c>5 AND c<10.** 
15230 54 68 65 20 69 6e 64 65 78 20 68 61 73 20 61 73  The index has as
15240 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20 65   many as three e
15250 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
15260 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73  nts, but in this
15270 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  .** example, the
15280 20 74 68 69 72 64 20 22 63 22 20 76 61 6c 75 65   third "c" value
15290 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   is an inequalit
152a0 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20  y.  So only two 
152b0 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  .** constraints 
152c0 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73  are coded.  This
152d0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65   routine will ge
152e0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
152f0 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20  valuate.** a==5 
15300 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29  and b IN (1,2,3)
15310 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 76  .  The current v
15320 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20  alues for a and 
15330 62 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64  b will be stored
15340 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75 74 69  .** in consecuti
15350 76 65 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ve registers and
15360 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
15370 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
15380 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
15390 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70  .** In the examp
153a0 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e  le above nEq==2.
153b0 20 20 42 75 74 20 74 68 69 73 20 73 75 62 72 6f    But this subro
153c0 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20  utine works for 
153d0 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  any value.** of 
153e0 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e  nEq including 0.
153f0 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69    If nEq==0, thi
15400 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61  s routine is nea
15410 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20  rly a no-op..** 
15420 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69  The only thing i
15430 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61  t does is alloca
15440 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69  te the pLevel->i
15450 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  Mem memory cell 
15460 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65 20 74  and.** compute t
15470 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
15480 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45  ng..**.** The nE
15490 78 74 72 61 52 65 67 20 70 61 72 61 6d 65 74 65  xtraReg paramete
154a0 72 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 74  r is 0 or 1.  It
154b0 20 69 73 20 30 20 69 66 20 61 6c 6c 20 57 48 45   is 0 if all WHE
154c0 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
154d0 61 69 6e 74 73 0a 2a 2a 20 61 72 65 20 3d 3d 20  aints.** are == 
154e0 6f 72 20 49 4e 20 61 6e 64 20 61 72 65 20 63 6f  or IN and are co
154f0 76 65 72 65 64 20 62 79 20 74 68 65 20 6e 45 71  vered by the nEq
15500 2e 20 20 6e 45 78 74 72 61 52 65 67 20 69 73 20  .  nExtraReg is 
15510 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  1 if there is.**
15520 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63   an inequality c
15530 6f 6e 73 74 72 61 69 6e 74 20 28 73 75 63 68 20  onstraint (such 
15540 61 73 20 74 68 65 20 22 63 3e 3d 35 20 41 4e 44  as the "c>=5 AND
15550 20 63 3c 31 30 22 20 69 6e 20 74 68 65 20 65 78   c<10" in the ex
15560 61 6d 70 6c 65 29 20 74 68 61 74 0a 2a 2a 20 6f  ample) that.** o
15570 63 63 75 72 73 20 61 66 74 65 72 20 74 68 65 20  ccurs after the 
15580 6e 45 71 20 71 75 61 6c 69 74 79 20 63 6f 6e 73  nEq quality cons
15590 74 72 61 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54  traints..**.** T
155a0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f  his routine allo
155b0 63 61 74 65 73 20 61 20 72 61 6e 67 65 20 6f 66  cates a range of
155c0 20 6e 45 71 2b 6e 45 78 74 72 61 52 65 67 20 6d   nEq+nExtraReg m
155d0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20  emory cells and 
155e0 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69  returns.** the i
155f0 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73  ndex of the firs
15600 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e  t memory cell in
15610 20 74 68 61 74 20 72 61 6e 67 65 2e 20 54 68 65   that range. The
15620 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61   code that.** ca
15630 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
15640 20 77 69 6c 6c 20 75 73 65 20 74 68 61 74 20 6d   will use that m
15650 65 6d 6f 72 79 20 72 61 6e 67 65 20 74 6f 20 73  emory range to s
15660 74 6f 72 65 20 6b 65 79 73 20 66 6f 72 0a 2a 2a  tore keys for.**
15670 20 73 74 61 72 74 20 61 6e 64 20 74 65 72 6d 69   start and termi
15680 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e  nation condition
15690 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  s of the loop..*
156a0 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74  * key value of t
156b0 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65  he loop.  If one
156c0 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72   or more IN oper
156d0 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68  ators appear, th
156e0 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
156f0 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20  ne allocates an 
15700 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d  additional nEq m
15710 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
15720 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e  internal.** use.
15730 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
15740 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20  turning, *pzAff 
15750 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
15760 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
15770 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79  aining a.** copy
15780 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
15790 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f  ffinity string o
157a0 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f  f the index allo
157b0 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73  cated using.** s
157c0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
157d0 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69 65  . Except, entrie
157e0 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f 66  s in the copy of
157f0 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 73 6f   the string asso
15800 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 65  ciated.** with e
15810 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
15820 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e 4f 4e  nts that use NON
15830 45 20 61 66 66 69 6e 69 74 79 20 61 72 65 20 73  E affinity are s
15840 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f  et to.** SQLITE_
15850 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69  AFF_NONE. This i
15860 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  s to deal with S
15870 51 4c 20 73 75 63 68 20 61 73 20 74 68 65 20 66  QL such as the f
15880 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
15890 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
158a0 31 28 61 20 54 45 58 54 20 50 52 49 4d 41 52 59  1(a TEXT PRIMARY
158b0 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53   KEY, b);.**   S
158c0 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
158d0 31 20 41 53 20 74 32 2c 20 74 31 20 57 48 45 52  1 AS t2, t1 WHER
158e0 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a  E t1.a = t2.b;.*
158f0 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d  *.** In the exam
15900 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 69  ple above, the i
15910 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68 61  ndex on t1(a) ha
15920 73 20 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e  s TEXT affinity.
15930 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68   But since.** th
15940 65 20 72 69 67 68 74 20 68 61 6e 64 20 73 69 64  e right hand sid
15950 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74  e of the equalit
15960 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74 32  y constraint (t2
15970 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61 66 66  .b) has NONE aff
15980 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e  inity,.** no con
15990 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62  version should b
159a0 65 20 61 74 74 65 6d 70 74 65 64 20 62 65 66 6f  e attempted befo
159b0 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62 20  re using a t2.b 
159c0 76 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f 66  value as part of
159d0 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65 61  .** a key to sea
159e0 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20 48  rch the index. H
159f0 65 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 62  ence the first b
15a00 79 74 65 20 69 6e 20 74 68 65 20 72 65 74 75 72  yte in the retur
15a10 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20  ned affinity.** 
15a20 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20 65  string in this e
15a30 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65 20  xample would be 
15a40 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41 46  set to SQLITE_AF
15a50 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69  F_NONE..*/.stati
15a60 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75  c int codeAllEqu
15a70 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61  alityTerms(.  Pa
15a80 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
15a90 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
15aa0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
15ab0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
15ac0 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65    /* Which neste
15ad0 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52  d loop of the FR
15ae0 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67  OM we are coding
15af0 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20   */.  int bRev, 
15b00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
15b10 65 76 65 72 73 65 20 74 68 65 20 6f 72 64 65 72  everse the order
15b20 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 73   of IN operators
15b30 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
15b40 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Reg,        /* N
15b50 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72  umber of extra r
15b60 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f  egisters to allo
15b70 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cate */.  char *
15b80 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20 20 20  *pzAff          
15b90 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 70  /* OUT: Set to p
15ba0 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74 79  oint to affinity
15bb0 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
15bc0 75 31 36 20 6e 45 71 3b 20 20 20 20 20 20 20 20  u16 nEq;        
15bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15be0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d   The number of =
15bf0 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69  = or IN constrai
15c00 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20  nts to code */. 
15c10 20 75 31 36 20 6e 53 6b 69 70 3b 20 20 20 20 20   u16 nSkip;     
15c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15c30 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 66 74  * Number of left
15c40 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f  -most columns to
15c50 20 73 6b 69 70 20 2a 2f 0a 20 20 56 64 62 65 20   skip */.  Vdbe 
15c60 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
15c70 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  be;      /* The 
15c80 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  vm under constru
15c90 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78  ction */.  Index
15ca0 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
15cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15cc0 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65 64  index being used
15cd0 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a   for this loop *
15ce0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
15cf0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
15d00 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f    /* A single co
15d10 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f  nstraint term */
15d20 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
15d30 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
15d40 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f   /* The WhereLoo
15d50 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  p object */.  in
15d60 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
15d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
15d80 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
15d90 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20   int regBase;   
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15db0 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20  * Base register 
15dc0 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20 20  */.  int nReg;  
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15de0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
15df0 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c  registers to all
15e00 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  ocate */.  char 
15e10 2a 7a 41 66 66 3b 20 20 20 20 20 20 20 20 20 20  *zAff;          
15e20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
15e30 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f 20 72  nity string to r
15e40 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54  eturn */..  /* T
15e50 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e  his module is on
15e60 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65  ly called on que
15e70 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20 75 73  ry plans that us
15e80 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20  e an index. */. 
15e90 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
15ea0 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61 73 73 65 72  >pWLoop;.  asser
15eb0 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
15ec0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
15ed0 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20  ALTABLE)==0 );. 
15ee0 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e   nEq = pLoop->u.
15ef0 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 6e 53 6b  btree.nEq;.  nSk
15f00 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ip = pLoop->u.bt
15f10 72 65 65 2e 6e 53 6b 69 70 3b 0a 20 20 70 49 64  ree.nSkip;.  pId
15f20 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
15f30 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 61 73 73  ee.pIndex;.  ass
15f40 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
15f50 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
15f60 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79   how many memory
15f70 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e   cells we will n
15f80 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  eed then allocat
15f90 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72  e them..  */.  r
15fa0 65 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d  egBase = pParse-
15fb0 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65  >nMem + 1;.  nRe
15fc0 67 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  g = pLoop->u.btr
15fd0 65 65 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61 52  ee.nEq + nExtraR
15fe0 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  eg;.  pParse->nM
15ff0 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a  em += nReg;..  z
16000 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Aff = sqlite3DbS
16010 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  trDup(pParse->db
16020 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  , sqlite3IndexAf
16030 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64  finityStr(v, pId
16040 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41 66 66  x));.  if( !zAff
16050 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
16060 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
16070 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 69 66 28   = 1;.  }..  if(
16080 20 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 69 6e   nSkip ){.    in
16090 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76  t iIdxCur = pLev
160a0 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
160b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
160c0 70 31 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f 4c  p1(v, (bRev?OP_L
160d0 61 73 74 3a 4f 50 5f 52 65 77 69 6e 64 29 2c 20  ast:OP_Rewind), 
160e0 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 56 64  iIdxCur);.    Vd
160f0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  beComment((v, "b
16100 65 67 69 6e 20 73 6b 69 70 2d 73 63 61 6e 20 6f  egin skip-scan o
16110 6e 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61  n %s", pIdx->zNa
16120 6d 65 29 29 3b 0a 20 20 20 20 6a 20 3d 20 73 71  me));.    j = sq
16130 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
16140 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20  v, OP_Goto);.   
16150 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69   pLevel->addrSki
16160 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
16170 64 64 4f 70 34 49 6e 74 28 76 2c 20 28 62 52 65  ddOp4Int(v, (bRe
16180 76 3f 4f 50 5f 53 65 65 6b 4c 74 3a 4f 50 5f 53  v?OP_SeekLt:OP_S
16190 65 65 6b 47 74 29 2c 0a 20 20 20 20 20 20 20 20  eekGt),.        
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161b0 20 20 20 20 69 49 64 78 43 75 72 2c 20 30 2c 20      iIdxCur, 0, 
161c0 72 65 67 42 61 73 65 2c 20 6e 53 6b 69 70 29 3b  regBase, nSkip);
161d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
161e0 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 29 3b 0a  JumpHere(v, j);.
161f0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
16200 53 6b 69 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Skip; j++){.    
16210 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16220 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
16230 2c 20 69 49 64 78 43 75 72 2c 20 6a 2c 20 72 65  , iIdxCur, j, re
16240 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20  gBase+j);.      
16250 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69  assert( pIdx->ai
16260 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a  Column[j]>=0 );.
16270 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
16280 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78  t((v, "%s", pIdx
16290 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70  ->pTable->aCol[p
162a0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
162b0 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  ].zName));.    }
162c0 0a 20 20 7d 20 20 20 20 0a 0a 20 20 2f 2a 20 45  .  }    ..  /* E
162d0 76 61 6c 75 61 74 65 20 74 68 65 20 65 71 75 61  valuate the equa
162e0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
162f0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
16300 7a 41 66 66 3d 3d 30 20 7c 7c 20 28 69 6e 74 29  zAff==0 || (int)
16310 73 74 72 6c 65 6e 28 7a 41 66 66 29 3e 3d 6e 45  strlen(zAff)>=nE
16320 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 6e 53 6b  q );.  for(j=nSk
16330 69 70 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b  ip; j<nEq; j++){
16340 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20  .    int r1;.   
16350 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e   pTerm = pLoop->
16360 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61  aLTerm[j];.    a
16370 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
16380 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  );.    /* The fo
16390 6c 6c 6f 77 69 6e 67 20 74 65 73 74 63 61 73 65  llowing testcase
163a0 20 69 73 20 74 72 75 65 20 66 6f 72 20 69 6e 64   is true for ind
163b0 69 63 65 73 20 77 69 74 68 20 72 65 64 75 6e 64  ices with redund
163c0 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20  ant columns. .  
163d0 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54 45 20    ** Ex: CREATE 
163e0 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
163f0 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a 20  ,b,a); SELECT * 
16400 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
16410 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20  0 AND b=0; */.  
16420 20 20 74 65 73 74 63 61 73 65 28 20 28 70 54 65    testcase( (pTe
16430 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
16440 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a  RM_CODED)!=0 );.
16450 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
16460 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
16470 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
16480 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71 75 61     r1 = codeEqua
16490 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c  lityTerm(pParse,
164a0 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20   pTerm, pLevel, 
164b0 6a 2c 20 62 52 65 76 2c 20 72 65 67 42 61 73 65  j, bRev, regBase
164c0 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21  +j);.    if( r1!
164d0 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20  =regBase+j ){.  
164e0 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20      if( nReg==1 
164f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
16500 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
16510 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
16520 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42 61  );.        regBa
16530 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d  se = r1;.      }
16540 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
16550 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16560 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c  v, OP_SCopy, r1,
16570 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20   regBase+j);.   
16580 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74     }.    }.    t
16590 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
165a0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
165b0 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73  SNULL );.    tes
165c0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
165d0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
165e0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
165f0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
16600 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29  WO_ISNULL|WO_IN)
16610 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  )==0 ){.      Ex
16620 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65  pr *pRight = pTe
16630 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
16640 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
16650 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
16660 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65  mp(v, pRight, re
16670 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d  gBase+j, pLevel-
16680 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20  >addrBrk);.     
16690 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20 20   if( zAff ){.   
166a0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
166b0 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
166c0 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29  pRight, zAff[j])
166d0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
166e0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  E ){.          z
166f0 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[j] = SQLITE_
16700 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
16710 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
16720 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
16730 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
16740 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d  (pRight, zAff[j]
16750 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) ){.          z
16760 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[j] = SQLITE_
16770 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
16780 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
16790 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d  }.  }.  *pzAff =
167a0 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e 20   zAff;.  return 
167b0 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e  regBase;.}..#ifn
167c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
167d0 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68  EXPLAIN./*.** Th
167e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
167f0 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70 6c 61  helper for expla
16800 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29 20 62  inIndexRange() b
16810 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20  elow.**.** pStr 
16820 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74 20 6f  holds the text o
16830 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
16840 74 68 61 74 20 77 65 20 61 72 65 20 62 75 69 6c  that we are buil
16850 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65 72 6d  ding up one term
16860 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e 20 20  .** at a time.  
16870 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
16880 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20  s a new term to 
16890 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 65  the end of the e
168a0 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65  xpression..** Te
168b0 72 6d 73 20 61 72 65 20 73 65 70 61 72 61 74 65  rms are separate
168c0 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64 64 20  d by AND so add 
168d0 74 68 65 20 22 41 4e 44 22 20 74 65 78 74 20 66  the "AND" text f
168e0 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75  or second and su
168f0 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d  bsequent.** term
16900 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  s only..*/.stati
16910 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 41 70  c void explainAp
16920 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74 72 41  pendTerm(.  StrA
16930 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20 20 20  ccum *pStr,     
16940 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
16950 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ext expression b
16960 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20  eing built */.  
16970 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20 20 20  int iTerm,      
16980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
16990 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74 65 72  ndex of this ter
169a0 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a 65 72  m.  First is zer
169b0 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  o */.  const cha
169c0 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  r *zColumn,     
169d0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
169e0 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f  e column */.  co
169f0 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 20 20  nst char *zOp   
16a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
16a10 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f  e of the operato
16a20 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 54  r */.){.  if( iT
16a30 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53 74 72  erm ) sqlite3Str
16a40 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
16a50 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20  , " AND ", 5);. 
16a60 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
16a70 41 70 70 65 6e 64 41 6c 6c 28 70 53 74 72 2c 20  AppendAll(pStr, 
16a80 7a 43 6f 6c 75 6d 6e 29 3b 0a 20 20 73 71 6c 69  zColumn);.  sqli
16a90 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
16aa0 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31 29 3b  d(pStr, zOp, 1);
16ab0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
16ac0 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22  umAppend(pStr, "
16ad0 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ?", 1);.}../*.**
16ae0 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76 65 6c   Argument pLevel
16af0 20 64 65 73 63 72 69 62 65 73 20 61 20 73 74 72   describes a str
16b00 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e 6e 69  ategy for scanni
16b10 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e 20 54  ng table pTab. T
16b20 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
16b30 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
16b40 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 62  er to a string b
16b50 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
16b60 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a   a description.*
16b70 2a 20 6f 66 20 74 68 65 20 73 75 62 73 65 74 20  * of the subset 
16b80 6f 66 20 74 61 62 6c 65 20 72 6f 77 73 20 73 63  of table rows sc
16b90 61 6e 6e 65 64 20 62 79 20 74 68 65 20 73 74 72  anned by the str
16ba0 61 74 65 67 79 20 69 6e 20 74 68 65 20 66 6f 72  ategy in the for
16bb0 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c 20 65  m of an.** SQL e
16bc0 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c 20 69  xpression. Or, i
16bd0 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 73  f all rows are s
16be0 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69 73 20  canned, NULL is 
16bf0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
16c00 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
16c10 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  the query:.**.**
16c20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
16c30 20 74 31 20 57 48 45 52 45 20 61 3d 31 20 41 4e   t1 WHERE a=1 AN
16c40 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20  D b>2;.**.** is 
16c50 72 75 6e 20 61 6e 64 20 74 68 65 72 65 20 69 73  run and there is
16c60 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c   an index on (a,
16c70 20 62 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66   b), then this f
16c80 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
16c90 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d 69  a.** string simi
16ca0 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20  lar to:.**.**   
16cb0 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a 2a  "a=? AND b>?".**
16cc0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
16cd0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
16ce0 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
16cf0 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
16d00 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74  bMalloc()..** It
16d10 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
16d20 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
16d30 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68 65  ller to free the
16d40 20 62 75 66 66 65 72 20 77 68 65 6e 20 69 74 20   buffer when it 
16d50 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20  is.** no longer 
16d60 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61  required..*/.sta
16d70 74 69 63 20 63 68 61 72 20 2a 65 78 70 6c 61 69  tic char *explai
16d80 6e 49 6e 64 65 78 52 61 6e 67 65 28 73 71 6c 69  nIndexRange(sqli
16d90 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
16da0 6f 70 20 2a 70 4c 6f 6f 70 2c 20 54 61 62 6c 65  op *pLoop, Table
16db0 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78   *pTab){.  Index
16dc0 20 2a 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70   *pIndex = pLoop
16dd0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
16de0 3b 0a 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c  ;.  u16 nEq = pL
16df0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
16e00 3b 0a 20 20 75 31 36 20 6e 53 6b 69 70 20 3d 20  ;.  u16 nSkip = 
16e10 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
16e20 53 6b 69 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Skip;.  int i, j
16e30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  ;.  Column *aCol
16e40 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20   = pTab->aCol;. 
16e50 20 69 31 36 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d   i16 *aiColumn =
16e60 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
16e70 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 74 78  n;.  StrAccum tx
16e80 74 3b 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30  t;..  if( nEq==0
16e90 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
16ea0 61 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d  ags & (WHERE_BTM
16eb0 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
16ec0 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29 7b 0a 20  _LIMIT))==0 ){. 
16ed0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
16ee0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
16ef0 75 6d 49 6e 69 74 28 26 74 78 74 2c 20 30 2c 20  umInit(&txt, 0, 
16f00 30 2c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  0, SQLITE_MAX_LE
16f10 4e 47 54 48 29 3b 0a 20 20 74 78 74 2e 64 62 20  NGTH);.  txt.db 
16f20 3d 20 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 53  = db;.  sqlite3S
16f30 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74  trAccumAppend(&t
16f40 78 74 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20 20  xt, " (", 2);.  
16f50 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20  for(i=0; i<nEq; 
16f60 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  i++){.    char *
16f70 7a 20 3d 20 28 69 3d 3d 70 49 6e 64 65 78 2d 3e  z = (i==pIndex->
16f80 6e 4b 65 79 43 6f 6c 20 29 20 3f 20 22 72 6f 77  nKeyCol ) ? "row
16f90 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c  id" : aCol[aiCol
16fa0 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20  umn[i]].zName;. 
16fb0 20 20 20 69 66 28 20 69 3e 3d 6e 53 6b 69 70 20     if( i>=nSkip 
16fc0 29 7b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  ){.      explain
16fd0 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c  AppendTerm(&txt,
16fe0 20 69 2c 20 7a 2c 20 22 3d 22 29 3b 0a 20 20 20   i, z, "=");.   
16ff0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
17000 28 20 69 20 29 20 73 71 6c 69 74 65 33 53 74 72  ( i ) sqlite3Str
17010 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74  AccumAppend(&txt
17020 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20  , " AND ", 5);. 
17030 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
17040 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c  ccumAppend(&txt,
17050 20 22 41 4e 59 28 22 2c 20 34 29 3b 0a 20 20 20   "ANY(", 4);.   
17060 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
17070 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 74 78 74  umAppendAll(&txt
17080 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , z);.      sqli
17090 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
170a0 64 28 26 74 78 74 2c 20 22 29 22 2c 20 31 29 3b  d(&txt, ")", 1);
170b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6a 20  .    }.  }..  j 
170c0 3d 20 69 3b 0a 20 20 69 66 28 20 70 4c 6f 6f 70  = i;.  if( pLoop
170d0 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
170e0 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
170f0 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70   char *z = (j==p
17100 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  Index->nKeyCol )
17110 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f   ? "rowid" : aCo
17120 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  l[aiColumn[j]].z
17130 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69  Name;.    explai
17140 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
17150 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a  , i++, z, ">");.
17160 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d    }.  if( pLoop-
17170 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 54  >wsFlags&WHERE_T
17180 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
17190 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49  char *z = (j==pI
171a0 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20  ndex->nKeyCol ) 
171b0 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c  ? "rowid" : aCol
171c0 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  [aiColumn[j]].zN
171d0 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e  ame;.    explain
171e0 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c  AppendTerm(&txt,
171f0 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d   i, z, "<");.  }
17200 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
17210 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22  umAppend(&txt, "
17220 29 22 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e  )", 1);.  return
17230 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
17240 46 69 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d 0a  Finish(&txt);.}.
17250 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
17260 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
17270 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74 6c 79  unless currently
17280 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20 45   processing an E
17290 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
172a0 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49 66  N.** command. If
172b0 20 74 68 65 20 71 75 65 72 79 20 62 65 69 6e 67   the query being
172c0 20 63 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e 20   compiled is an 
172d0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
172e0 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20  AN, a single.** 
172f0 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64 20  record is added 
17300 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74 6f  to the output to
17310 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74 61   describe the ta
17320 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65 67  ble scan strateg
17330 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e  y in .** pLevel.
17340 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17350 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  explainOneScan(.
17360 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
17370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17380 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
17390 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
173a0 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
173b0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
173c0 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20   list this loop 
173d0 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57  refers to */.  W
173e0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
173f0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
17400 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20  * Scan to write 
17410 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64  OP_Explain opcod
17420 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  e for */.  int i
17430 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
17440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
17450 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20  lue for "level" 
17460 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74  column of output
17470 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
17480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17490 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66        /* Value f
174a0 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e  or "from" column
174b0 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20   of output */.  
174c0 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20  u16 wctrlFlags  
174d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174e0 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
174f0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
17500 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 23 69 66  egin() */.){.#if
17510 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  ndef SQLITE_DEBU
17520 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  G.  if( pParse->
17530 65 78 70 6c 61 69 6e 3d 3d 32 20 29 0a 23 65 6e  explain==2 ).#en
17540 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 74 72 75  dif.  {.    stru
17550 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
17560 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
17570 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
17580 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a  rom];.    Vdbe *
17590 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
175a0 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65  e;      /* VM be
175b0 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
175c0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  */.    sqlite3 *
175d0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
175e0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
175f0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 63   handle */.    c
17600 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20 20  har *zMsg;      
17610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17620 54 65 78 74 20 74 6f 20 61 64 64 20 74 6f 20 45  Text to add to E
17630 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20  QP output */.   
17640 20 69 6e 74 20 69 49 64 20 3d 20 70 50 61 72 73   int iId = pPars
17650 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20 20 2f  e->iSelectId;  /
17660 2a 20 53 65 6c 65 63 74 20 69 64 20 28 6c 65 66  * Select id (lef
17670 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20 63 6f  t-most output co
17680 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  lumn) */.    int
17690 20 69 73 53 65 61 72 63 68 3b 20 20 20 20 20 20   isSearch;      
176a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
176b0 75 65 20 66 6f 72 20 61 20 53 45 41 52 43 48 2e  ue for a SEARCH.
176c0 20 46 61 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e   False for SCAN.
176d0 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f   */.    WhereLoo
176e0 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
176f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
17700 74 72 6f 6c 6c 69 6e 67 20 57 68 65 72 65 4c 6f  trolling WhereLo
17710 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  op object */.   
17720 20 75 33 32 20 66 6c 61 67 73 3b 20 20 20 20 20   u32 flags;     
17730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17740 2a 20 46 6c 61 67 73 20 74 68 61 74 20 64 65 73  * Flags that des
17750 63 72 69 62 65 20 74 68 69 73 20 6c 6f 6f 70 20  cribe this loop 
17760 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  */..    pLoop = 
17770 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
17780 20 20 20 20 66 6c 61 67 73 20 3d 20 70 4c 6f 6f      flags = pLoo
17790 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  p->wsFlags;.    
177a0 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45  if( (flags&WHERE
177b0 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77  _MULTI_OR) || (w
177c0 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
177d0 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 29  ONETABLE_ONLY) )
177e0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 73   return;..    is
177f0 53 65 61 72 63 68 20 3d 20 28 66 6c 61 67 73 26  Search = (flags&
17800 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  (WHERE_BTM_LIMIT
17810 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
17820 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ))!=0.          
17830 20 20 7c 7c 20 28 28 66 6c 61 67 73 26 57 48 45    || ((flags&WHE
17840 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
17850 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 75  ==0 && (pLoop->u
17860 2e 62 74 72 65 65 2e 6e 45 71 3e 30 29 29 0a 20  .btree.nEq>0)). 
17870 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 77             || (w
17880 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45  ctrlFlags&(WHERE
17890 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45  _ORDERBY_MIN|WHE
178a0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 29  RE_ORDERBY_MAX))
178b0 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  ;..    zMsg = sq
178c0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
178d0 20 22 25 73 22 2c 20 69 73 53 65 61 72 63 68 3f   "%s", isSearch?
178e0 22 53 45 41 52 43 48 22 3a 22 53 43 41 4e 22 29  "SEARCH":"SCAN")
178f0 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ;.    if( pItem-
17900 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
17910 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
17920 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
17930 67 2c 20 22 25 73 20 53 55 42 51 55 45 52 59 20  g, "%s SUBQUERY 
17940 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74 65 6d 2d  %d", zMsg,pItem-
17950 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  >iSelectId);.   
17960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4d   }else{.      zM
17970 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
17980 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
17990 25 73 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 4d  %s TABLE %s", zM
179a0 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  sg, pItem->zName
179b0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
179c0 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
179d0 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
179e0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
179f0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41 53  db, zMsg, "%s AS
17a00 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65   %s", zMsg, pIte
17a10 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
17a20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  }.    if( (flags
17a30 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48   & (WHERE_IPK|WH
17a40 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
17a50 29 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 41 4c  ))==0.     && AL
17a60 57 41 59 53 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74  WAYS(pLoop->u.bt
17a70 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 29 0a 20  ree.pIndex!=0). 
17a80 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72     ){.      char
17a90 20 2a 7a 57 68 65 72 65 20 3d 20 65 78 70 6c 61   *zWhere = expla
17aa0 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 64 62 2c  inIndexRange(db,
17ab0 20 70 4c 6f 6f 70 2c 20 70 49 74 65 6d 2d 3e 70   pLoop, pItem->p
17ac0 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d 73 67  Tab);.      zMsg
17ad0 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
17ae0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 0a 20 20 20  df(db, zMsg,.   
17af0 20 20 20 20 20 20 20 20 20 20 20 20 28 28 66 6c              ((fl
17b00 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
17b10 5f 49 4e 44 45 58 29 20 3f 20 0a 20 20 20 20 20  _INDEX) ? .     
17b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25                "%
17b30 73 20 55 53 49 4e 47 20 41 55 54 4f 4d 41 54 49  s USING AUTOMATI
17b40 43 20 25 73 49 4e 44 45 58 25 2e 30 73 25 73 22  C %sINDEX%.0s%s"
17b50 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   :.             
17b60 20 20 20 20 20 20 22 25 73 20 55 53 49 4e 47 20        "%s USING 
17b70 25 73 49 4e 44 45 58 20 25 73 25 73 22 29 2c 20  %sINDEX %s%s"), 
17b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17b90 7a 4d 73 67 2c 20 28 28 66 6c 61 67 73 20 26 20  zMsg, ((flags & 
17ba0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20  WHERE_IDX_ONLY) 
17bb0 3f 20 22 43 4f 56 45 52 49 4e 47 20 22 20 3a 20  ? "COVERING " : 
17bc0 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ""),.           
17bd0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
17be0 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ee.pIndex->zName
17bf0 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 20  , zWhere);.     
17c00 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
17c10 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20  b, zWhere);.    
17c20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73  }else if( (flags
17c30 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30   & WHERE_IPK)!=0
17c40 20 26 26 20 28 66 6c 61 67 73 20 26 20 57 48 45   && (flags & WHE
17c50 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d  RE_CONSTRAINT)!=
17c60 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20  0 ){.      zMsg 
17c70 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
17c80 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
17c90 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52  USING INTEGER PR
17ca0 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67  IMARY KEY", zMsg
17cb0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 66 6c  );..      if( fl
17cc0 61 67 73 26 28 57 48 45 52 45 5f 43 4f 4c 55 4d  ags&(WHERE_COLUM
17cd0 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  N_EQ|WHERE_COLUM
17ce0 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20 20 20  N_IN) ){.       
17cf0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
17d00 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
17d10 2c 20 22 25 73 20 28 72 6f 77 69 64 3d 3f 29 22  , "%s (rowid=?)"
17d20 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
17d30 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 26  else if( (flags&
17d40 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54  WHERE_BOTH_LIMIT
17d50 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49  )==WHERE_BOTH_LI
17d60 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  MIT ){.        z
17d70 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
17d80 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
17d90 22 25 73 20 28 72 6f 77 69 64 3e 3f 20 41 4e 44  "%s (rowid>? AND
17da0 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67   rowid<?)", zMsg
17db0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
17dc0 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42  f( flags&WHERE_B
17dd0 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
17de0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
17df0 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
17e00 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e  Msg, "%s (rowid>
17e10 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  ?)", zMsg);.    
17e20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
17e30 59 53 28 66 6c 61 67 73 26 57 48 45 52 45 5f 54  YS(flags&WHERE_T
17e40 4f 50 5f 4c 49 4d 49 54 29 20 29 7b 0a 20 20 20  OP_LIMIT) ){.   
17e50 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
17e60 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
17e70 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64  zMsg, "%s (rowid
17e80 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  <?)", zMsg);.   
17e90 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
17ea0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
17eb0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
17ec0 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20  else if( (flags 
17ed0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
17ee0 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
17ef0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
17f00 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
17f10 67 2c 20 22 25 73 20 56 49 52 54 55 41 4c 20 54  g, "%s VIRTUAL T
17f20 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73  ABLE INDEX %d:%s
17f30 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20  ", zMsg,.       
17f40 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
17f50 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c  ->u.vtab.idxNum,
17f60 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69   pLoop->u.vtab.i
17f70 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65  dxStr);.    }.#e
17f80 6e 64 69 66 0a 20 20 20 20 7a 4d 73 67 20 3d 20  ndif.    zMsg = 
17f90 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
17fa0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 22 2c 20  db, zMsg, "%s", 
17fb0 7a 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  zMsg);.    sqlit
17fc0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
17fd0 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64 2c  OP_Explain, iId,
17fe0 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c 20   iLevel, iFrom, 
17ff0 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
18000 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
18010 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 4f   define explainO
18020 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c 79  neScan(u,v,w,x,y
18030 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ,z).#endif /* SQ
18040 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
18050 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  N */.../*.** Gen
18060 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
18070 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
18080 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69  iLevel-th loop i
18090 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
180a0 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  se.** implementa
180b0 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62  tion described b
180c0 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61  y pWInfo..*/.sta
180d0 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65  tic Bitmask code
180e0 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20  OneLoopStart(.  
180f0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
18100 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65  o,   /* Complete
18110 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
18120 75 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ut the WHERE cla
18130 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  use */.  int iLe
18140 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  vel,          /*
18150 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20   Which level of 
18160 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75  pWInfo->a[] shou
18170 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  ld be coded */. 
18180 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
18190 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74  y     /* Which t
181a0 61 62 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e  ables are curren
181b0 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  tly available */
181c0 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20  .){.  int j, k; 
181d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
181e0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
181f0 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
18200 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
18210 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
18220 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
18230 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20  addrNxt;        
18240 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d   /* Where to jum
18250 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  p to continue wi
18260 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63  th the next IN c
18270 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69  ase */.  int omi
18280 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a  tTable;       /*
18290 20 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20   True if we use 
182a0 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a  the index only *
182b0 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20  /.  int bRev;   
182c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
182d0 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73   if we need to s
182e0 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  can in reverse o
182f0 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c  rder */.  WhereL
18300 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f  evel *pLevel;  /
18310 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65 76 65  * The where leve
18320 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  l to be coded */
18330 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
18340 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 57  oop;    /* The W
18350 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
18360 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
18370 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
18380 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f  C;    /* Decompo
18390 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e  sition of the en
183a0 74 69 72 65 20 57 48 45 52 45 20 63 6c 61 75 73  tire WHERE claus
183b0 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
183c0 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
183d0 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52         /* A WHER
183e0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f  E clause term */
183f0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
18400 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18410 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
18420 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
18430 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
18440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
18450 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
18460 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  n */.  Vdbe *v; 
18470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18480 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
18490 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65  epared stmt unde
184a0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20  r constructions 
184b0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
184c0 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
184d0 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61  em;  /* FROM cla
184e0 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63  use term being c
184f0 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  oded */.  int ad
18500 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20  drBrk;          
18510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
18520 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
18530 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
18540 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
18550 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
18560 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
18570 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  e to continue wi
18580 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f  th next cycle */
18590 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65 67  .  int iRowidReg
185a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
185b0 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64 20  Rowid is stored 
185c0 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
185d0 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f  , if not zero */
185e0 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65 52  .  int iReleaseR
185f0 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  eg = 0;      /* 
18600 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f  Temp register to
18610 20 66 72 65 65 20 62 65 66 6f 72 65 20 72 65 74   free before ret
18620 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61  urning */..  pPa
18630 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
18640 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72  arse;.  v = pPar
18650 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43  se->pVdbe;.  pWC
18660 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b   = &pWInfo->sWC;
18670 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
18680 64 62 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26  db;.  pLevel = &
18690 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c  pWInfo->a[iLevel
186a0 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  ];.  pLoop = pLe
186b0 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70  vel->pWLoop;.  p
186c0 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66  TabItem = &pWInf
186d0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
186e0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
186f0 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
18700 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 4c 65  ->iCursor;.  pLe
18710 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 3d 20  vel->notReady = 
18720 6e 6f 74 52 65 61 64 79 20 26 20 7e 67 65 74 4d  notReady & ~getM
18730 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
18740 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20  skSet, iCur);.  
18750 62 52 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e  bRev = (pWInfo->
18760 72 65 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29  revMask>>iLevel)
18770 26 31 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20  &1;.  omitTable 
18780 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  = (pLoop->wsFlag
18790 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
187a0 4c 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  LY)!=0 .        
187b0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
187c0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
187d0 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d  E_FORCE_TABLE)==
187e0 30 3b 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  0;.  VdbeModuleC
187f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
18800 6e 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20  n WHERE-loop%d: 
18810 25 73 22 2c 69 4c 65 76 65 6c 2c 70 54 61 62 49  %s",iLevel,pTabI
18820 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
18830 29 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  ));..  /* Create
18840 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20   labels for the 
18850 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e  "break" and "con
18860 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69  tinue" instructi
18870 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ons.  ** for the
18880 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20   current loop.  
18890 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20  Jump to addrBrk 
188a0 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
188b0 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d  a loop..  ** Jum
188c0 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20  p to cont to go 
188d0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74  immediately to t
188e0 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
188f0 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f  n of the.  ** lo
18900 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  op..  **.  ** Wh
18910 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 49  en there is an I
18920 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61  N operator, we a
18930 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64 64 72  lso have a "addr
18940 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a  Nxt" label that.
18950 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f    ** means to co
18960 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20  ntinue with the 
18970 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f  next IN value co
18980 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e  mbination.  When
18990 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20  .  ** there are 
189a0 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  no IN operators 
189b0 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  in the constrain
189c0 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74  ts, the "addrNxt
189d0 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20  " label.  ** is 
189e0 74 68 65 20 73 61 6d 65 20 61 73 20 22 61 64 64  the same as "add
189f0 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64  rBrk"..  */.  ad
18a00 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e  drBrk = pLevel->
18a10 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c  addrBrk = pLevel
18a20 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69  ->addrNxt = sqli
18a30 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
18a40 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20  (v);.  addrCont 
18a50 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
18a60 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
18a70 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
18a80 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
18a90 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
18aa0 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
18ab0 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e  OIN, allocate an
18ac0 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  d.  ** initializ
18ad0 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  e a memory cell 
18ae0 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20  that records if 
18af0 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68  this table match
18b00 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20  es any.  ** row 
18b10 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  of the left tabl
18b20 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20  e of the join.. 
18b30 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c   */.  if( pLevel
18b40 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54  ->iFrom>0 && (pT
18b50 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79  abItem[0].jointy
18b60 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
18b70 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   ){.    pLevel->
18b80 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50  iLeftJoin = ++pP
18b90 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
18ba0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18bb0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
18bc0 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   0, pLevel->iLef
18bd0 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65  tJoin);.    Vdbe
18be0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69  Comment((v, "ini
18bf0 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d  t LEFT JOIN no-m
18c00 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20  atch flag"));.  
18c10 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  }..  /* Special 
18c20 63 61 73 65 20 6f 66 20 61 20 46 52 4f 4d 20 63  case of a FROM c
18c30 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 20 69  lause subquery i
18c40 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
18c50 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  co-routine */.  
18c60 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69  if( pTabItem->vi
18c70 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  aCoroutine ){.  
18c80 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d    int regYield =
18c90 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65   pTabItem->regRe
18ca0 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
18cb0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18cc0 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62 49  P_Integer, pTabI
18cd0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
18ce0 2d 31 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20  -1, regYield);. 
18cf0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
18d00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18d10 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
18d20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 56  regYield);.    V
18d30 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
18d40 6e 65 78 74 20 72 6f 77 20 6f 66 20 63 6f 2d 72  next row of co-r
18d50 6f 75 74 69 6e 65 20 25 73 22 2c 20 70 54 61 62  outine %s", pTab
18d60 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
18d70 65 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e));.    sqlite3
18d80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18d90 5f 49 66 2c 20 72 65 67 59 69 65 6c 64 2b 31 2c  _If, regYield+1,
18da0 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 70   addrBrk);.    p
18db0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47  Level->op = OP_G
18dc0 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69  oto;.  }else..#i
18dd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18de0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
18df0 20 69 66 28 20 20 28 70 4c 6f 6f 70 2d 3e 77 73   if(  (pLoop->ws
18e00 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
18e10 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
18e20 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a  {.    /* Case 1:
18e30 20 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 61    The table is a
18e40 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20   virtual-table. 
18e50 20 55 73 65 20 74 68 65 20 56 46 69 6c 74 65 72   Use the VFilter
18e60 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20 20 2a   and VNext.    *
18e70 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 61 63  *          to ac
18e80 63 65 73 73 20 74 68 65 20 64 61 74 61 2e 0a 20  cess the data.. 
18e90 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52     */.    int iR
18ea0 65 67 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c 75  eg;   /* P3 Valu
18eb0 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72  e for OP_VFilter
18ec0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
18ed0 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20 20 20 69 6e  NotFound;.    in
18ee0 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  t nConstraint = 
18ef0 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b 0a 0a  pLoop->nLTerm;..
18f00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
18f10 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
18f20 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c  ;.    iReg = sql
18f30 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
18f40 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72  (pParse, nConstr
18f50 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 61 64 64  aint+2);.    add
18f60 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76  rNotFound = pLev
18f70 65 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a 20 20 20  el->addrBrk;.   
18f80 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e   for(j=0; j<nCon
18f90 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20  straint; j++){. 
18fa0 20 20 20 20 20 69 6e 74 20 69 54 61 72 67 65 74       int iTarget
18fb0 20 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a 20 20 20   = iReg+j+2;.   
18fc0 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70     pTerm = pLoop
18fd0 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  ->aLTerm[j];.   
18fe0 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
18ff0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
19000 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
19010 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
19020 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 45 71  {.        codeEq
19030 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
19040 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
19050 2c 20 6a 2c 20 62 52 65 76 2c 20 69 54 61 72 67  , j, bRev, iTarg
19060 65 74 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  et);.        add
19070 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76  rNotFound = pLev
19080 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20  el->addrNxt;.   
19090 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
190a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
190b0 65 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d  e(pParse, pTerm-
190c0 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
190d0 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20  iTarget);.      
190e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
190f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19100 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 4c 6f   OP_Integer, pLo
19110 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75  op->u.vtab.idxNu
19120 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71  m, iReg);.    sq
19130 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19140 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e  v, OP_Integer, n
19150 43 6f 6e 73 74 72 61 69 6e 74 2c 20 69 52 65 67  Constraint, iReg
19160 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +1);.    sqlite3
19170 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
19180 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c 20  _VFilter, iCur, 
19190 61 64 64 72 4e 6f 74 46 6f 75 6e 64 2c 20 69 52  addrNotFound, iR
191a0 65 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eg,.            
191b0 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d            pLoop-
191c0 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 0a  >u.vtab.idxStr,.
191d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191e0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76        pLoop->u.v
191f0 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3f 20 50  tab.needFree ? P
19200 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f 53  4_MPRINTF : P4_S
19210 54 41 54 49 43 29 3b 0a 20 20 20 20 70 4c 6f 6f  TATIC);.    pLoo
19220 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
19230 65 65 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ee = 0;.    for(
19240 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69  j=0; j<nConstrai
19250 6e 74 20 26 26 20 6a 3c 31 36 3b 20 6a 2b 2b 29  nt && j<16; j++)
19260 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f  {.      if( (pLo
19270 6f 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d  op->u.vtab.omitM
19280 61 73 6b 3e 3e 6a 29 26 31 20 29 7b 0a 20 20 20  ask>>j)&1 ){.   
19290 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
192a0 28 70 4c 65 76 65 6c 2c 20 70 4c 6f 6f 70 2d 3e  (pLevel, pLoop->
192b0 61 4c 54 65 72 6d 5b 6a 5d 29 3b 0a 20 20 20 20  aLTerm[j]);.    
192c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c    }.    }.    pL
192d0 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e  evel->op = OP_VN
192e0 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ext;.    pLevel-
192f0 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
19300 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c  pLevel->p2 = sql
19310 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
19320 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
19330 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
19340 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52 65 67  nge(pParse, iReg
19350 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29  , nConstraint+2)
19360 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
19370 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
19380 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  , 1);.  }else.#e
19390 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
193a0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
193b0 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 4c 6f 6f   */..  if( (pLoo
193c0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
193d0 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 26 26  RE_IPK)!=0.   &&
193e0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
193f0 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   & (WHERE_COLUMN
19400 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  _IN|WHERE_COLUMN
19410 5f 45 51 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20  _EQ))!=0.  ){.  
19420 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65    /* Case 2:  We
19430 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72 65   can directly re
19440 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65  ference a single
19450 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20 20   row using an.  
19460 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71    **          eq
19470 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
19480 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
19490 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20  WID field.  Or. 
194a0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77     **          w
194b0 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74  e reference mult
194c0 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20  iple rows using 
194d0 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e  a "rowid IN (...
194e0 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  )".    **       
194f0 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20     construct..  
19500 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
19510 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
19520 6e 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20 69 52  nEq==1 );.    iR
19530 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69  eleaseReg = sqli
19540 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
19550 61 72 73 65 29 3b 0a 20 20 20 20 70 54 65 72 6d  arse);.    pTerm
19560 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
19570 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [0];.    assert(
19580 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
19590 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
195a0 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
195b0 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c  assert( omitTabl
195c0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  e==0 );.    test
195d0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
195e0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
195f0 55 41 4c 20 29 3b 0a 20 20 20 20 69 52 6f 77 69  UAL );.    iRowi
19600 64 52 65 67 20 3d 20 63 6f 64 65 45 71 75 61 6c  dReg = codeEqual
19610 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ityTerm(pParse, 
19620 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30  pTerm, pLevel, 0
19630 2c 20 62 52 65 76 2c 20 69 52 65 6c 65 61 73 65  , bRev, iRelease
19640 52 65 67 29 3b 0a 20 20 20 20 61 64 64 72 4e 78  Reg);.    addrNx
19650 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  t = pLevel->addr
19660 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Nxt;.    sqlite3
19670 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19680 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 52 6f 77  _MustBeInt, iRow
19690 69 64 52 65 67 2c 20 61 64 64 72 4e 78 74 29 3b  idReg, addrNxt);
196a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
196b0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp3(v, OP_Not
196c0 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20 61 64  Exists, iCur, ad
196d0 64 72 4e 78 74 2c 20 69 52 6f 77 69 64 52 65 67  drNxt, iRowidReg
196e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
196f0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
19700 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52  hange(pParse, iR
19710 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a 20 20 20  owidReg, 1);.   
19720 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
19730 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
19740 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
19750 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  eg);.    VdbeCom
19760 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
19770 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
19780 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c  = OP_Noop;.  }el
19790 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77  se if( (pLoop->w
197a0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
197b0 50 4b 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  PK)!=0.         
197c0 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
197d0 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
197e0 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20 29 7b  N_RANGE)!=0.  ){
197f0 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20  .    /* Case 3: 
19800 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71   We have an ineq
19810 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
19820 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
19830 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a  WID field..    *
19840 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70  /.    int testOp
19850 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
19860 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 69  int start;.    i
19870 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d  nt memEndValue =
19880 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72   0;.    WhereTer
19890 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64  m *pStart, *pEnd
198a0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  ;..    assert( o
198b0 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
198c0 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 70 53     j = 0;.    pS
198d0 74 61 72 74 20 3d 20 70 45 6e 64 20 3d 20 30 3b  tart = pEnd = 0;
198e0 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
198f0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
19900 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53 74 61  BTM_LIMIT ) pSta
19910 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rt = pLoop->aLTe
19920 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66 28  rm[j++];.    if(
19930 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
19940 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
19950 54 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f 6f 70  T ) pEnd = pLoop
19960 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20  ->aLTerm[j++];. 
19970 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72     assert( pStar
19980 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20  t!=0 || pEnd!=0 
19990 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 20  );.    if( bRev 
199a0 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  ){.      pTerm =
199b0 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70   pStart;.      p
199c0 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20  Start = pEnd;.  
199d0 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d      pEnd = pTerm
199e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
199f0 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  pStart ){.      
19a00 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20  Expr *pX;       
19a10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
19a20 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66  ression that def
19a30 69 6e 65 73 20 74 68 65 20 73 74 61 72 74 20 62  ines the start b
19a40 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ound */.      in
19a50 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20  t r1, rTemp;    
19a60 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
19a70 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65   for holding the
19a80 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20   start boundary 
19a90 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  */..      /* The
19aa0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74   following const
19ab0 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63  ant maps TK_xx c
19ac0 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73  odes into corres
19ad0 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a  ponding .      *
19ae0 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20  * seek opcodes. 
19af0 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61   It depends on a
19b00 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65   particular orde
19b10 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20  ring of TK_xx.  
19b20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e      */.      con
19b30 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20  st u8 aMoveOp[] 
19b40 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f  = {.           /
19b50 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53  * TK_GT */  OP_S
19b60 65 65 6b 47 74 2c 0a 20 20 20 20 20 20 20 20 20  eekGt,.         
19b70 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f    /* TK_LE */  O
19b80 50 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20 20 20  P_SeekLe,.      
19b90 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f       /* TK_LT */
19ba0 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20 20 20    OP_SeekLt,.   
19bb0 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45          /* TK_GE
19bc0 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65 0a 20   */  OP_SeekGe. 
19bd0 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73       };.      as
19be0 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f  sert( TK_LE==TK_
19bf0 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+1 );      /* 
19c00 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72  Make sure the or
19c10 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20  dering.. */.    
19c20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
19c30 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20  =TK_GT+2 );     
19c40 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20   /*  ... of the 
19c50 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20  TK_xx values... 
19c60 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
19c70 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20   TK_GE==TK_GT+3 
19c80 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20  );      /*  ... 
19c90 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a  is correcct. */.
19ca0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
19cb0 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  pStart->wtFlags 
19cc0 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
19cd0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
19ce0 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74 46 6c  se( pStart->wtFl
19cf0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
19d00 41 4c 20 29 3b 0a 20 20 20 20 20 20 70 58 20 3d  AL );.      pX =
19d10 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a   pStart->pExpr;.
19d20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
19d30 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  !=0 );.      tes
19d40 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 6c  tcase( pStart->l
19d50 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20  eftCursor!=iCur 
19d60 29 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69 76 65  ); /* transitive
19d70 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
19d80 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
19d90 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
19da0 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
19db0 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20  t, &rTemp);.    
19dc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19dd0 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70  Op3(v, aMoveOp[p
19de0 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43  X->op-TK_GT], iC
19df0 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29  ur, addrBrk, r1)
19e00 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
19e10 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
19e20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19e30 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
19e40 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
19e50 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
19e60 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
19e70 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b  (pParse, rTemp);
19e80 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
19e90 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72  rm(pLevel, pStar
19ea0 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
19eb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19ec0 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f  AddOp2(v, bRev ?
19ed0 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65   OP_Last : OP_Re
19ee0 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72  wind, iCur, addr
19ef0 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Brk);.    }.    
19f00 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20  if( pEnd ){.    
19f10 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20    Expr *pX;.    
19f20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78    pX = pEnd->pEx
19f30 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
19f40 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
19f50 20 61 73 73 65 72 74 28 20 28 70 45 6e 64 2d 3e   assert( (pEnd->
19f60 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
19f70 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  NULL)==0 );.    
19f80 20 20 74 65 73 74 63 61 73 65 28 20 70 45 6e 64    testcase( pEnd
19f90 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43  ->leftCursor!=iC
19fa0 75 72 20 29 3b 20 2f 2a 20 54 72 61 6e 73 69 74  ur ); /* Transit
19fb0 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ive constraints 
19fc0 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
19fd0 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73  e( pEnd->wtFlags
19fe0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
19ff0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64 56  );.      memEndV
1a000 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d  alue = ++pParse-
1a010 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
1a020 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1a030 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
1a040 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20   memEndValue);. 
1a050 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d       if( pX->op=
1a060 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70  =TK_LT || pX->op
1a070 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20  ==TK_GT ){.     
1a080 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76     testOp = bRev
1a090 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65   ? OP_Le : OP_Ge
1a0a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1a0b0 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
1a0c0 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f  bRev ? OP_Lt : O
1a0d0 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  P_Gt;.      }.  
1a0e0 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
1a0f0 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20  pLevel, pEnd);. 
1a100 20 20 20 7d 0a 20 20 20 20 73 74 61 72 74 20 3d     }.    start =
1a110 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1a120 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
1a130 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65  pLevel->op = bRe
1a140 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50  v ? OP_Prev : OP
1a150 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65  _Next;.    pLeve
1a160 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
1a170 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
1a180 74 61 72 74 3b 0a 20 20 20 20 61 73 73 65 72 74  tart;.    assert
1a190 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20  ( pLevel->p5==0 
1a1a0 29 3b 0a 20 20 20 20 69 66 28 20 74 65 73 74 4f  );.    if( testO
1a1b0 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
1a1c0 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
1a1d0 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71  iReleaseReg = sq
1a1e0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1a1f0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
1a200 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a210 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43  (v, OP_Rowid, iC
1a220 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  ur, iRowidReg);.
1a230 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a240 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
1a250 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
1a260 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1a270 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a280 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d  3(v, testOp, mem
1a290 45 6e 64 56 61 6c 75 65 2c 20 61 64 64 72 42 72  EndValue, addrBr
1a2a0 6b 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  k, iRowidReg);. 
1a2b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a2c0 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
1a2d0 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c  TE_AFF_NUMERIC |
1a2e0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
1a2f0 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  LL);.    }.  }el
1a300 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  se if( pLoop->ws
1a310 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
1a320 44 45 58 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20  DEXED ){.    /* 
1a330 43 61 73 65 20 34 3a 20 41 20 73 63 61 6e 20 75  Case 4: A scan u
1a340 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20  sing an index.. 
1a350 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1a360 20 20 20 20 20 54 68 65 20 57 48 45 52 45 20 63       The WHERE c
1a370 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61 69  lause may contai
1a380 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65  n zero or more e
1a390 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20  quality .    ** 
1a3a0 20 20 20 20 20 20 20 20 74 65 72 6d 73 20 28 22          terms ("
1a3b0 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72  ==" or "IN" oper
1a3c0 61 74 6f 72 73 29 20 74 68 61 74 20 72 65 66 65  ators) that refe
1a3d0 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a  r to the N.    *
1a3e0 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74 2d 6d  *         left-m
1a3f0 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ost columns of t
1a400 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d 61 79  he index. It may
1a410 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20   also contain.  
1a420 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 65    **         ine
1a430 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1a440 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72  nts (>, <, >= or
1a450 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64 65   <=) on the inde
1a460 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  xed.    **      
1a470 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69     column that i
1a480 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
1a490 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69 74  ws the N equalit
1a4a0 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a  ies. Only .    *
1a4b0 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69  *         the ri
1a4c0 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  ght-most column 
1a4d0 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61  can be an inequa
1a4e0 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73 74 20  lity - the rest 
1a4f0 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  must.    **     
1a500 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22      use the "=="
1a510 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74   and "IN" operat
1a520 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ors. For example
1a530 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a  , if the .    **
1a540 20 20 20 20 20 20 20 20 20 69 6e 64 65 78 20 69           index i
1a550 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68  s on (x,y,z), th
1a560 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  en the following
1a570 20 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c 6c   clauses are all
1a580 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
1a590 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20   optimized:.    
1a5a0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1a5b0 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20       x=5.    ** 
1a5c0 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1a5d0 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20  ND y=10.    **  
1a5e0 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
1a5f0 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20  D y<10.    **   
1a600 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
1a610 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20 20   y>5 AND y<10.  
1a620 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1a630 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44 20  x=5 AND y=5 AND 
1a640 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20  z<=10.    **.   
1a650 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20   **         The 
1a660 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68 65  z<10 term of the
1a670 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f   following canno
1a680 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a  t be used, only.
1a690 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
1a6a0 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20  he x=5 term:.   
1a6b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1a6c0 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c        x=5 AND z<
1a6d0 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  10.    **.    **
1a6e0 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79 20 62           N may b
1a6f0 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20  e zero if there 
1a700 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  are inequality c
1a710 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20  onstraints..    
1a720 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 74 68  **         If th
1a730 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71 75  ere are no inequ
1a740 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1a750 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74 0a  s, then N is at.
1a760 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c      **         l
1a770 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a  east one..    **
1a780 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1a790 54 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73  This case is als
1a7a0 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 72  o used when ther
1a7b0 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63  e are no WHERE c
1a7c0 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20 20 20  lause.    **    
1a7d0 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73       constraints
1a7e0 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73   but an index is
1a7f0 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79   selected anyway
1a800 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a  , in order.    *
1a810 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72  *         to for
1a820 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72  ce the output or
1a830 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74  der to conform t
1a840 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20  o an ORDER BY.. 
1a850 20 20 20 2a 2f 20 20 0a 20 20 20 20 73 74 61 74     */  .    stat
1a860 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61  ic const u8 aSta
1a870 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  rtOp[] = {.     
1a880 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20 20   0,.      0,.   
1a890 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20     OP_Rewind,   
1a8a0 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 21          /* 2: (!
1a8b0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1a8c0 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20  s && startEq && 
1a8d0 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
1a8e0 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20 20   OP_Last,       
1a8f0 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73 74        /* 3: (!st
1a900 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1a910 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20 20  && startEq &&   
1a920 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
1a930 50 5f 53 65 65 6b 47 74 2c 20 20 20 20 20 20 20  P_SeekGt,       
1a940 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72 74      /* 4: (start
1a950 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
1a960 20 21 73 74 61 72 74 45 71 20 26 26 20 21 62 52   !startEq && !bR
1a970 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1a980 53 65 65 6b 4c 74 2c 20 20 20 20 20 20 20 20 20  SeekLt,         
1a990 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f 63    /* 5: (start_c
1a9a0 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21  onstraints  && !
1a9b0 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76  startEq &&  bRev
1a9c0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
1a9d0 65 6b 47 65 2c 20 20 20 20 20 20 20 20 20 20 20  ekGe,           
1a9e0 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 6: (start_con
1a9f0 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74  straints  &&  st
1aa00 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20  artEq && !bRev) 
1aa10 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
1aa20 4c 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Le            /*
1aa30 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   7: (start_const
1aa40 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72  raints  &&  star
1aa50 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f  tEq &&  bRev) */
1aa60 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74 61 74  .    };.    stat
1aa70 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e 64  ic const u8 aEnd
1aa80 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f  Op[] = {.      O
1aa90 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20 20  P_Noop,         
1aaa0 20 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e 64 5f      /* 0: (!end_
1aab0 63 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a 2f 0a  constraints) */.
1aac0 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45 2c 20        OP_IdxGE, 
1aad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a             /* 1:
1aae0 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74   (end_constraint
1aaf0 73 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  s && !bRev) */. 
1ab00 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 20 20 20       OP_IdxLT   
1ab10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20            /* 2: 
1ab20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  (end_constraints
1ab30 20 26 26 20 62 52 65 76 29 20 2a 2f 0a 20 20 20   && bRev) */.   
1ab40 20 7d 3b 0a 20 20 20 20 75 31 36 20 6e 45 71 20   };.    u16 nEq 
1ab50 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
1ab60 2e 6e 45 71 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  .nEq;     /* Num
1ab70 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20  ber of == or IN 
1ab80 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74  terms */.    int
1ab90 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b   isMinQuery = 0;
1aba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1abb0 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  this is an optim
1abc0 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69 6e 28  ized SELECT min(
1abd0 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  x).. */.    int 
1abe0 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20  regBase;        
1abf0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65           /* Base
1ac00 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   register holdin
1ac10 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c  g constraint val
1ac20 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ues */.    int r
1ac30 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1ac40 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
1ac50 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20  register */.    
1ac60 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67  WhereTerm *pRang
1ac70 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20  eStart = 0;  /* 
1ac80 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  Inequality const
1ac90 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 73  raint at range s
1aca0 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68 65 72  tart */.    Wher
1acb0 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64  eTerm *pRangeEnd
1acc0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71   = 0;    /* Ineq
1acd0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1ace0 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64 20 2a  t at range end *
1acf0 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 45  /.    int startE
1ad00 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
1ad10 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61     /* True if ra
1ad20 6e 67 65 20 73 74 61 72 74 20 75 73 65 73 20 3d  nge start uses =
1ad30 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20  =, >= or <= */. 
1ad40 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20 20 20     int endEq;   
1ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad60 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65  /* True if range
1ad70 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d   end uses ==, >=
1ad80 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e   or <= */.    in
1ad90 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  t start_constrai
1ada0 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74  nts;       /* St
1adb0 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20  art of range is 
1adc0 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20  constrained */. 
1add0 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69     int nConstrai
1ade0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
1adf0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e  /* Number of con
1ae00 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f  straint terms */
1ae10 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
1ae20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ae30 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77    /* The index w
1ae40 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
1ae50 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43  */.    int iIdxC
1ae60 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ur;             
1ae70 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
1ae80 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69  cursor for the i
1ae90 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ndex */.    int 
1aea0 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b 20 20  nExtraReg = 0;  
1aeb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1aec0 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69  er of extra regi
1aed0 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a 2f 0a  sters needed */.
1aee0 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
1aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af00 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20   /* Instruction 
1af10 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68  opcode */.    ch
1af20 61 72 20 2a 7a 53 74 61 72 74 41 66 66 3b 20 20  ar *zStartAff;  
1af30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
1af40 66 69 6e 69 74 79 20 66 6f 72 20 73 74 61 72 74  finity for start
1af50 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72   of range constr
1af60 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72  aint */.    char
1af70 20 63 45 6e 64 41 66 66 20 3d 20 30 3b 20 20 20   cEndAff = 0;   
1af80 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
1af90 6e 69 74 79 20 66 6f 72 20 65 6e 64 20 6f 66 20  nity for end of 
1afa0 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
1afb0 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d 20   */..    pIdx = 
1afc0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
1afd0 49 6e 64 65 78 3b 0a 20 20 20 20 69 49 64 78 43  Index;.    iIdxC
1afe0 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
1aff0 78 43 75 72 3b 0a 20 20 20 20 61 73 73 65 72 74  xCur;.    assert
1b000 28 20 6e 45 71 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e  ( nEq>=pLoop->u.
1b010 62 74 72 65 65 2e 6e 53 6b 69 70 20 29 3b 0a 0a  btree.nSkip );..
1b020 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c      /* If this l
1b030 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61 20  oop satisfies a 
1b040 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64  sort order (pOrd
1b050 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74 68  erBy) request th
1b060 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20 70  at .    ** was p
1b070 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
1b080 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d  nction to implem
1b090 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69  ent a "SELECT mi
1b0a0 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a  n(x) ..." .    *
1b0b0 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74 68  * query, then th
1b0c0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e  e caller will on
1b0d0 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f  ly allow the loo
1b0e0 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20  p to run for.   
1b0f0 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74 65   ** a single ite
1b100 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  ration. This mea
1b110 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ns that the firs
1b120 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 20  t row returned. 
1b130 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74     ** should not
1b140 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c   have a NULL val
1b150 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78 27  ue stored in 'x'
1b160 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20  . If column 'x' 
1b170 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  is.    ** the fi
1b180 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74 68  rst one after th
1b190 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20 63  e nEq equality c
1b1a0 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68  onstraints in th
1b1b0 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20  e index,.    ** 
1b1c0 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73 6f  this requires so
1b1d0 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  me special handl
1b1e0 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
1b1f0 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
1b200 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
1b210 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20  DERBY_MIN)!=0.  
1b220 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 62     && (pWInfo->b
1b230 4f 42 53 61 74 21 3d 30 29 0a 20 20 20 20 20 26  OBSat!=0).     &
1b240 26 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  & (pIdx->nKeyCol
1b250 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  >nEq).    ){.   
1b260 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
1b270 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3d  ->u.btree.nSkip=
1b280 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73 4d 69  =0 );.      isMi
1b290 6e 51 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20  nQuery = 1;.    
1b2a0 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b    nExtraReg = 1;
1b2b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
1b2c0 69 6e 64 20 61 6e 79 20 69 6e 65 71 75 61 6c 69  ind any inequali
1b2d0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ty constraint te
1b2e0 72 6d 73 20 66 6f 72 20 74 68 65 20 73 74 61 72  rms for the star
1b2f0 74 20 61 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a  t and end .    *
1b300 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  * of the range. 
1b310 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6a 20 3d 20  .    */.    j = 
1b320 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  nEq;.    if( pLo
1b330 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1b340 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
1b350 0a 20 20 20 20 20 20 70 52 61 6e 67 65 53 74 61  .      pRangeSta
1b360 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rt = pLoop->aLTe
1b370 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e  rm[j++];.      n
1b380 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
1b390 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
1b3a0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1b3b0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
1b3c0 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64 20        pRangeEnd 
1b3d0 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
1b3e0 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74  j++];.      nExt
1b3f0 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d  raReg = 1;.    }
1b400 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
1b410 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
1b420 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  te all constrain
1b430 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d  t terms using ==
1b440 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e   or IN.    ** an
1b450 64 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  d store the valu
1b460 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d  es of those term
1b470 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  s in an array of
1b480 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a   registers.    *
1b490 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 72 65  * starting at re
1b4a0 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  gBase..    */.  
1b4b0 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65    regBase = code
1b4c0 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
1b4d0 28 70 50 61 72 73 65 2c 70 4c 65 76 65 6c 2c 62  (pParse,pLevel,b
1b4e0 52 65 76 2c 6e 45 78 74 72 61 52 65 67 2c 26 7a  Rev,nExtraReg,&z
1b4f0 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 61  StartAff);.    a
1b500 73 73 65 72 74 28 20 7a 53 74 61 72 74 41 66 66  ssert( zStartAff
1b510 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
1b520 72 6c 65 6e 33 30 28 7a 53 74 61 72 74 41 66 66  rlen30(zStartAff
1b530 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 20 20 69 66  )>=nEq );.    if
1b540 28 20 7a 53 74 61 72 74 41 66 66 20 29 20 63 45  ( zStartAff ) cE
1b550 6e 64 41 66 66 20 3d 20 7a 53 74 61 72 74 41 66  ndAff = zStartAf
1b560 66 5b 6e 45 71 5d 3b 0a 20 20 20 20 61 64 64 72  f[nEq];.    addr
1b570 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Nxt = pLevel->ad
1b580 64 72 4e 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 49  drNxt;..    /* I
1b590 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
1b5a0 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 73   reverse order s
1b5b0 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64  can on an ascend
1b5c0 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20  ing index, or.  
1b5d0 20 20 2a 2a 20 61 20 66 6f 72 77 61 72 64 20 6f    ** a forward o
1b5e0 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 20 64  rder scan on a d
1b5f0 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c  escending index,
1b600 20 69 6e 74 65 72 63 68 61 6e 67 65 20 74 68 65   interchange the
1b610 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 61   .    ** start a
1b620 6e 64 20 65 6e 64 20 74 65 72 6d 73 20 28 70 52  nd end terms (pR
1b630 61 6e 67 65 53 74 61 72 74 20 61 6e 64 20 70 52  angeStart and pR
1b640 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f  angeEnd)..    */
1b650 0a 20 20 20 20 69 66 28 20 28 6e 45 71 3c 70 49  .    if( (nEq<pI
1b660 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 26 26 20 62  dx->nKeyCol && b
1b670 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72  Rev==(pIdx->aSor
1b680 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c  tOrder[nEq]==SQL
1b690 49 54 45 5f 53 4f 5f 41 53 43 29 29 0a 20 20 20  ITE_SO_ASC)).   
1b6a0 20 20 7c 7c 20 28 62 52 65 76 20 26 26 20 70 49    || (bRev && pI
1b6b0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 45 71  dx->nKeyCol==nEq
1b6c0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 53  ).    ){.      S
1b6d0 57 41 50 28 57 68 65 72 65 54 65 72 6d 20 2a 2c  WAP(WhereTerm *,
1b6e0 20 70 52 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e   pRangeEnd, pRan
1b6f0 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 0a  geStart);.    }.
1b700 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1b710 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 28 70  RangeStart && (p
1b720 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
1b730 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d  rator & WO_LE)!=
1b740 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
1b750 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26  e( pRangeStart &
1b760 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  & (pRangeStart->
1b770 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
1b780 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  E)!=0 );.    tes
1b790 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
1b7a0 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e   && (pRangeEnd->
1b7b0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
1b7c0 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  E)!=0 );.    tes
1b7d0 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
1b7e0 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e   && (pRangeEnd->
1b7f0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
1b800 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 73 74 61  E)!=0 );.    sta
1b810 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74  rtEq = !pRangeSt
1b820 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61  art || pRangeSta
1b830 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
1b840 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20  (WO_LE|WO_GE);. 
1b850 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52     endEq =   !pR
1b860 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67  angeEnd || pRang
1b870 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
1b880 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
1b890 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74  .    start_const
1b8a0 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53  raints = pRangeS
1b8b0 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a  tart || nEq>0;..
1b8c0 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20      /* Seek the 
1b8d0 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20  index cursor to 
1b8e0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1b8f0 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e   range. */.    n
1b900 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71  Constraint = nEq
1b910 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65  ;.    if( pRange
1b920 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45  Start ){.      E
1b930 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52  xpr *pRight = pR
1b940 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72  angeStart->pExpr
1b950 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
1b960 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1b970 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
1b980 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
1b990 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 53      if( (pRangeS
1b9a0 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
1b9b0 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
1b9c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1b9d0 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a  3ExprCodeIsNullJ
1b9e0 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72  ump(v, pRight, r
1b9f0 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72  egBase+nEq, addr
1ba00 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Nxt);.      }.  
1ba10 20 20 20 20 69 66 28 20 7a 53 74 61 72 74 41 66      if( zStartAf
1ba20 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  f ){.        if(
1ba30 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
1ba40 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20  ffinity(pRight, 
1ba50 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 3d  zStartAff[nEq])=
1ba60 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
1ba70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1ba80 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72  Since the compar
1ba90 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65  ison is to be pe
1baa0 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20  rformed with no 
1bab0 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20  conversions.    
1bac0 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64        ** applied
1bad0 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73   to the operands
1bae0 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e 69  , set the affini
1baf0 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  ty to apply to p
1bb00 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20  Right to .      
1bb10 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46      ** SQLITE_AF
1bb20 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20  F_NONE.  */.    
1bb30 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b        zStartAff[
1bb40 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
1bb50 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
1bb60 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  }.        if( sq
1bb70 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
1bb80 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
1bb90 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66  Right, zStartAff
1bba0 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20  [nEq]) ){.      
1bbb0 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45      zStartAff[nE
1bbc0 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  q] = SQLITE_AFF_
1bbd0 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
1bbe0 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20        }  .      
1bbf0 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20  nConstraint++;. 
1bc00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1bc10 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c  RangeStart->wtFl
1bc20 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1bc30 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  AL );.    }else 
1bc40 69 66 28 20 69 73 4d 69 6e 51 75 65 72 79 20 29  if( isMinQuery )
1bc50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1bc60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1bc70 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65  Null, 0, regBase
1bc80 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f  +nEq);.      nCo
1bc90 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20  nstraint++;.    
1bca0 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b 0a 20    startEq = 0;. 
1bcb0 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74       start_const
1bcc0 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20  raints = 1;.    
1bcd0 7d 0a 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41  }.    codeApplyA
1bce0 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
1bcf0 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72  regBase, nConstr
1bd00 61 69 6e 74 2c 20 7a 53 74 61 72 74 41 66 66 29  aint, zStartAff)
1bd10 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53 74 61 72  ;.    op = aStar
1bd20 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74  tOp[(start_const
1bd30 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74  raints<<2) + (st
1bd40 61 72 74 45 71 3c 3c 31 29 20 2b 20 62 52 65 76  artEq<<1) + bRev
1bd50 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  ];.    assert( o
1bd60 70 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  p!=0 );.    test
1bd70 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77  case( op==OP_Rew
1bd80 69 6e 64 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ind );.    testc
1bd90 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74  ase( op==OP_Last
1bda0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1bdb0 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 74 20  ( op==OP_SeekGt 
1bdc0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1bdd0 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29   op==OP_SeekGe )
1bde0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1bdf0 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b  op==OP_SeekLe );
1be00 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
1be10 70 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 29 3b 0a  p==OP_SeekLt );.
1be20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1be30 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20  ddOp4Int(v, op, 
1be40 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74  iIdxCur, addrNxt
1be50 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73  , regBase, nCons
1be60 74 72 61 69 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a  traint);..    /*
1be70 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65 20   Load the value 
1be80 66 6f 72 20 74 68 65 20 69 6e 65 71 75 61 6c 69  for the inequali
1be90 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74  ty constraint at
1bea0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
1beb0 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 28 69 66      ** range (if
1bec0 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20   any)..    */.  
1bed0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
1bee0 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61  nEq;.    if( pRa
1bef0 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ngeEnd ){.      
1bf00 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
1bf10 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d  RangeEnd->pExpr-
1bf20 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73  >pRight;.      s
1bf30 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
1bf40 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  emove(pParse, re
1bf50 67 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20  gBase+nEq, 1);. 
1bf60 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1bf70 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
1bf80 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
1bf90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52  );.      if( (pR
1bfa0 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73  angeEnd->wtFlags
1bfb0 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
1bfc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
1bfd0 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75  ite3ExprCodeIsNu
1bfe0 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74  llJump(v, pRight
1bff0 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61  , regBase+nEq, a
1c000 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d  ddrNxt);.      }
1c010 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1c020 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
1c030 79 28 70 52 69 67 68 74 2c 20 63 45 6e 64 41 66  y(pRight, cEndAf
1c040 66 29 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f)!=SQLITE_AFF_N
1c050 4f 4e 45 0a 20 20 20 20 20 20 20 26 26 20 21 73  ONE.       && !s
1c060 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
1c070 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
1c080 70 52 69 67 68 74 2c 20 63 45 6e 64 41 66 66 29  pRight, cEndAff)
1c090 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
1c0a0 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
1c0b0 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
1c0c0 61 73 65 2b 6e 45 71 2c 20 31 2c 20 26 63 45 6e  ase+nEq, 1, &cEn
1c0d0 64 41 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20  dAff);.      }. 
1c0e0 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
1c0f0 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ++;.      testca
1c100 73 65 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77  se( pRangeEnd->w
1c110 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
1c120 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d 0a 20  RTUAL );.    }. 
1c130 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1c140 28 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b  (db, zStartAff);
1c150 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20  ..    /* Top of 
1c160 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f  the loop body */
1c170 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1c180 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1c190 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20  rentAddr(v);..  
1c1a0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
1c1b0 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69  e index cursor i
1c1c0 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  s past the end o
1c1d0 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
1c1e0 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b      op = aEndOp[
1c1f0 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 6e 45  (pRangeEnd || nE
1c200 71 29 20 2a 20 28 31 20 2b 20 62 52 65 76 29 5d  q) * (1 + bRev)]
1c210 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1c220 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20  op==OP_Noop );. 
1c230 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1c240 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20  =OP_IdxGE );.   
1c250 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1c260 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 69  P_IdxLT );.    i
1c270 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  f( op!=OP_Noop )
1c280 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1c290 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
1c2a0 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64  op, iIdxCur, add
1c2b0 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e  rNxt, regBase, n
1c2c0 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20  Constraint);.   
1c2d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1c2e0 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45 71 21  angeP5(v, endEq!
1c2f0 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20 20 20  =bRev ?1:0);.   
1c300 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1c310 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69  ere are inequali
1c320 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
1c330 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  check that the v
1c340 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  alue.    ** of t
1c350 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
1c360 74 68 61 74 20 74 68 65 20 69 6e 65 71 75 61 6c  that the inequal
1c370 69 74 79 20 63 6f 6e 74 72 61 69 6e 73 20 69 73  ity contrains is
1c380 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a   not NULL..    *
1c390 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75 6d 70  * If it is, jump
1c3a0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65   to the next ite
1c3b0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f  ration of the lo
1c3c0 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
1c3d0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
1c3e0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
1c3f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 6f     testcase( pLo
1c400 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1c410 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b  ERE_BTM_LIMIT );
1c420 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1c430 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1c440 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
1c450 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  );.    if( (pLoo
1c460 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
1c470 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48  ERE_BTM_LIMIT|WH
1c480 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21  ERE_TOP_LIMIT))!
1c490 3d 30 20 0a 20 20 20 20 20 26 26 20 28 6a 20 3d  =0 .     && (j =
1c4a0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
1c4b0 6e 45 71 5d 29 3e 3d 30 20 0a 20 20 20 20 20 26  nEq])>=0 .     &
1c4c0 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  & pIdx->pTable->
1c4d0 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d  aCol[j].notNull=
1c4e0 3d 30 20 0a 20 20 20 20 20 26 26 20 28 6e 45 71  =0 .     && (nEq
1c4f0 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   || (pLoop->wsFl
1c500 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
1c510 4c 49 4d 49 54 29 3d 3d 30 29 0a 20 20 20 20 29  LIMIT)==0).    )
1c520 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1c530 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1c540 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c  Column, iIdxCur,
1c550 20 6e 45 71 2c 20 72 31 29 3b 0a 20 20 20 20 20   nEq, r1);.     
1c560 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1c570 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 70 54 61   "%s", pIdx->pTa
1c580 62 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  ble->aCol[j].zNa
1c590 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  me));.      sqli
1c5a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c5b0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20   OP_IsNull, r1, 
1c5c0 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d  addrCont);.    }
1c5d0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
1c5e0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1c5f0 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  e, r1);..    /* 
1c600 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63  Seek the table c
1c610 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72  ursor, if requir
1c620 65 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c  ed */.    disabl
1c630 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52  eTerm(pLevel, pR
1c640 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20  angeStart);.    
1c650 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1c660 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a  el, pRangeEnd);.
1c670 20 20 20 20 69 66 28 20 6f 6d 69 74 54 61 62 6c      if( omitTabl
1c680 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 49  e ){.      /* pI
1c690 64 78 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67  dx is a covering
1c6a0 20 69 6e 64 65 78 2e 20 20 4e 6f 20 6e 65 65 64   index.  No need
1c6b0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 6d   to access the m
1c6c0 61 69 6e 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  ain table. */.  
1c6d0 20 20 7d 65 6c 73 65 20 69 66 28 20 48 61 73 52    }else if( HasR
1c6e0 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c  owid(pIdx->pTabl
1c6f0 65 29 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77  e) ){.      iRow
1c700 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65  idReg = iRelease
1c710 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
1c720 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1c730 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1c740 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1c750 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72  dxRowid, iIdxCur
1c760 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1c770 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1c780 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
1c790 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77  , iCur, -1, iRow
1c7a0 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  idReg);.      sq
1c7b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1c7c0 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72  v, OP_Seek, iCur
1c7d0 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 20 20 2f  , iRowidReg);  /
1c7e0 2a 20 44 65 66 65 72 72 65 64 20 73 65 65 6b 20  * Deferred seek 
1c7f0 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
1c800 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d      Index *pPk =
1c810 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
1c820 65 79 49 6e 64 65 78 28 70 49 64 78 2d 3e 70 54  eyIndex(pIdx->pT
1c830 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 52 6f  able);.      iRo
1c840 77 69 64 52 65 67 20 3d 20 73 71 6c 69 74 65 33  widReg = sqlite3
1c850 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
1c860 72 73 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  rse, pPk->nKeyCo
1c870 6c 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  l);.      for(j=
1c880 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f  0; j<pPk->nKeyCo
1c890 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
1c8a0 20 6b 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75   k = sqlite3Colu
1c8b0 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20  mnOfIndex(pIdx, 
1c8c0 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  pPk->aiColumn[j]
1c8d0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1c8e0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1c8f0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43  OP_Column, iIdxC
1c900 75 72 2c 20 6b 2c 20 69 52 6f 77 69 64 52 65 67  ur, k, iRowidReg
1c910 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +j);.      }.   
1c920 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c930 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f  dOp4Int(v, OP_No
1c940 74 46 6f 75 6e 64 2c 20 69 43 75 72 2c 20 61 64  tFound, iCur, ad
1c950 64 72 43 6f 6e 74 2c 0a 20 20 20 20 20 20 20 20  drCont,.        
1c960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c970 20 20 20 69 52 6f 77 69 64 52 65 67 2c 20 70 50     iRowidReg, pP
1c980 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20  k->nKeyCol);.   
1c990 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72   }..    /* Recor
1c9a0 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  d the instructio
1c9b0 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e  n used to termin
1c9c0 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69  ate the loop. Di
1c9d0 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48  sable .    ** WH
1c9e0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
1c9f0 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20   made redundant 
1ca00 62 79 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e  by the index ran
1ca10 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a  ge scan..    */.
1ca20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1ca30 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
1ca40 4e 45 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 70  NEROW ){.      p
1ca50 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
1ca60 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  oop;.    }else i
1ca70 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
1ca80 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1ca90 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65  _Prev;.    }else
1caa0 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
1cab0 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  op = OP_Next;.  
1cac0 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
1cad0 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  p1 = iIdxCur;.  
1cae0 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
1caf0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
1cb00 4e 53 54 52 41 49 4e 54 29 3d 3d 30 20 29 7b 0a  NSTRAINT)==0 ){.
1cb10 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35        pLevel->p5
1cb20 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54   = SQLITE_STMTST
1cb30 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
1cb40 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EP;.    }else{. 
1cb50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
1cb60 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20  vel->p5==0 );.  
1cb70 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66    }.  }else..#if
1cb80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1cb90 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
1cba0 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  .  if( pLoop->ws
1cbb0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
1cbc0 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a  LTI_OR ){.    /*
1cbd0 20 43 61 73 65 20 35 3a 20 20 54 77 6f 20 6f 72   Case 5:  Two or
1cbe0 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79   more separately
1cbf0 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
1cc00 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20  onnected by OR. 
1cc10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61     **.    ** Exa
1cc20 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
1cc30 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
1cc40 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a  LE t1(a,b,c,d);.
1cc50 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
1cc60 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
1cc70 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
1cc80 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74  TE INDEX i2 ON t
1cc90 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43  1(b);.    **   C
1cca0 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f  REATE INDEX i3 O
1ccb0 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a  N t1(c);.    **.
1ccc0 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
1ccd0 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
1cce0 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63  a=5 OR b=7 OR (c
1ccf0 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20  =11 AND d=13).  
1cd00 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74    **.    ** In t
1cd10 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72  he example, ther
1cd20 65 20 61 72 65 20 74 68 72 65 65 20 69 6e 64 65  e are three inde
1cd30 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63  xed terms connec
1cd40 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a  ted by OR..    *
1cd50 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65  * The top of the
1cd60 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65   loop looks like
1cd70 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
1cd80 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75    **          Nu
1cd90 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20  ll       1      
1cda0 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f            # Zero
1cdb0 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72   the rowset in r
1cdc0 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20  eg 1.    **.    
1cdd0 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63  ** Then, for eac
1cde0 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20  h indexed term, 
1cdf0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54  the following. T
1ce00 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a  he arguments to.
1ce10 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73      ** RowSetTes
1ce20 74 20 61 72 65 20 73 75 63 68 20 74 68 61 74 20  t are such that 
1ce30 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65  the rowid of the
1ce40 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20   current row is 
1ce50 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20  inserted.    ** 
1ce60 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e  into the RowSet.
1ce70 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   If it is alread
1ce80 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72  y present, contr
1ce90 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20  ol skips the.   
1cea0 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65   ** Gosub opcode
1ceb0 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69   and jumps strai
1cec0 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20  ght to the code 
1ced0 67 65 6e 65 72 61 74 65 64 20 62 79 20 57 68 65  generated by Whe
1cee0 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a  reEnd()..    **.
1cef0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71      **        sq
1cf00 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1cf10 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20  <term>).    **  
1cf20 20 20 20 20 20 20 20 20 52 6f 77 53 65 74 54 65          RowSetTe
1cf30 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
1cf40 20 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77      # Insert row
1cf50 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20  id into rowset. 
1cf60 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47     **          G
1cf70 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a 20 20  osub      2 A.  
1cf80 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69    **        sqli
1cf90 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20  te3WhereEnd().  
1cfa0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c    **.    ** Foll
1cfb0 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c  owing the above,
1cfc0 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61   code to termina
1cfd0 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62  te the loop. Lab
1cfe0 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65 74  el A, the target
1cff0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47  .    ** of the G
1d000 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70  osub above, jump
1d010 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63  s to the instruc
1d020 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72  tion right after
1d030 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a   the Goto..    *
1d040 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1d050 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20    Null       1  
1d060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1d070 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20  Zero the rowset 
1d080 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20  in reg 1.    ** 
1d090 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20           Goto   
1d0a0 20 20 20 20 42 20 20 20 20 20 20 20 20 20 20 20      B           
1d0b0 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20       # The loop 
1d0c0 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20  is finished..   
1d0d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1d0e0 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20   A: <loop body> 
1d0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d100 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77  # Return data, w
1d110 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a  hatever..    **.
1d120 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1d130 52 65 74 75 72 6e 20 20 20 20 20 32 20 20 20 20  Return     2    
1d140 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4a 75              # Ju
1d150 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47  mp back to the G
1d160 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20  osub.    **.    
1d170 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74  **       B: <aft
1d180 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20  er the loop>.   
1d190 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57   **.    */.    W
1d1a0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57  hereClause *pOrW
1d1b0 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d  c;    /* The OR-
1d1c0 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75  clause broken ou
1d1d0 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20  t into subterms 
1d1e0 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  */.    SrcList *
1d1f0 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a  pOrTab;       /*
1d200 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65   Shortened table
1d210 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75   list or OR-clau
1d220 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  se generation */
1d230 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76  .    Index *pCov
1d240 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1d250 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63    /* Potential c
1d260 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f  overing index (o
1d270 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69  r NULL) */.    i
1d280 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61  nt iCovCur = pPa
1d290 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a  rse->nTab++;  /*
1d2a0 20 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   Cursor used for
1d2b0 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66   index scans (if
1d2c0 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e   any) */..    in
1d2d0 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  t regReturn = ++
1d2e0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20  pParse->nMem;   
1d2f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
1d300 74 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50  ter used with OP
1d310 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e  _Gosub */.    in
1d320 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b  t regRowset = 0;
1d330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d340 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
1d350 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f  ter for RowSet o
1d360 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74  bject */.    int
1d370 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20   regRowid = 0;  
1d380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d390 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
1d3a0 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64  er holding rowid
1d3b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f   */.    int iLoo
1d3c0 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56  pBody = sqlite3V
1d3d0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1d3e0 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f    /* Start of lo
1d3f0 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69  op body */.    i
1d400 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20  nt iRetInit;    
1d410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d420 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1d430 65 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e  ess of regReturn
1d440 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74   init */.    int
1d450 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d   untestedTerms =
1d460 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1d470 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f  /* Some terms no
1d480 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73  t completely tes
1d490 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ted */.    int i
1d4a0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1d4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d4c0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1d4d0 0a 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64 45  .    Expr *pAndE
1d4e0 78 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xpr = 0;        
1d4f0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e          /* An ".
1d500 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70  . AND (...)" exp
1d510 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a 20  ression */.   . 
1d520 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70     pTerm = pLoop
1d530 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20  ->aLTerm[0];.   
1d540 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
1d550 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1d560 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
1d570 72 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20 20 20  r & WO_OR );.   
1d580 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
1d590 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1d5a0 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20  ORINFO)!=0 );.  
1d5b0 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65 72 6d    pOrWc = &pTerm
1d5c0 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b  ->u.pOrInfo->wc;
1d5d0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1d5e0 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20  = OP_Return;.   
1d5f0 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65   pLevel->p1 = re
1d600 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a  gReturn;..    /*
1d610 20 53 65 74 20 75 70 20 61 20 6e 65 77 20 53 72   Set up a new Sr
1d620 63 4c 69 73 74 20 69 6e 20 70 4f 72 54 61 62 20  cList in pOrTab 
1d630 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
1d640 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e  able being scann
1d650 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69  ed.    ** by thi
1d660 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b  s loop in the a[
1d670 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20  0] slot and all 
1d680 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73 20  notReady tables 
1d690 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e  in a[1..] slots.
1d6a0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 65 63  .    ** This bec
1d6b0 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69 73 74  omes the SrcList
1d6c0 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69 76   in the recursiv
1d6d0 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
1d6e0 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20  3WhereBegin().. 
1d6f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57     */.    if( pW
1d700 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29  Info->nLevel>1 )
1d710 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74  {.      int nNot
1d720 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
1d730 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
1d740 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61 64 79  mber of notReady
1d750 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20   tables */.     
1d760 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1d770 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20  item *origSrc;  
1d780 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c     /* Original l
1d790 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
1d7a0 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61 64 79  .      nNotReady
1d7b0 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   = pWInfo->nLeve
1d7c0 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a  l - iLevel - 1;.
1d7d0 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 73        pOrTab = s
1d7e0 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63  qlite3StackAlloc
1d7f0 52 61 77 28 64 62 2c 0a 20 20 20 20 20 20 20 20  Raw(db,.        
1d800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d810 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f 72 54      sizeof(*pOrT
1d820 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79 2a 73  ab)+ nNotReady*s
1d830 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b  izeof(pOrTab->a[
1d840 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  0]));.      if( 
1d850 70 4f 72 54 61 62 3d 3d 30 20 29 20 72 65 74 75  pOrTab==0 ) retu
1d860 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20 20 20  rn notReady;.   
1d870 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f     pOrTab->nAllo
1d880 63 20 3d 20 28 75 38 29 28 6e 4e 6f 74 52 65 61  c = (u8)(nNotRea
1d890 64 79 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 70  dy + 1);.      p
1d8a0 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70 4f  OrTab->nSrc = pO
1d8b0 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20  rTab->nAlloc;.  
1d8c0 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 72 54 61      memcpy(pOrTa
1d8d0 62 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c 20  b->a, pTabItem, 
1d8e0 73 69 7a 65 6f 66 28 2a 70 54 61 62 49 74 65 6d  sizeof(*pTabItem
1d8f0 29 29 3b 0a 20 20 20 20 20 20 6f 72 69 67 53 72  ));.      origSr
1d900 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  c = pWInfo->pTab
1d910 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 66  List->a;.      f
1d920 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52  or(k=1; k<=nNotR
1d930 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  eady; k++){.    
1d940 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4f 72 54      memcpy(&pOrT
1d950 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67 53  ab->a[k], &origS
1d960 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72  rc[pLevel[k].iFr
1d970 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72 54  om], sizeof(pOrT
1d980 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20 20  ab->a[k]));.    
1d990 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1d9a0 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 70 57       pOrTab = pW
1d9b0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
1d9c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e      }..    /* In
1d9d0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72 6f 77  itialize the row
1d9e0 73 65 74 20 72 65 67 69 73 74 65 72 20 74 6f 20  set register to 
1d9f0 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e  contain NULL. An
1da00 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20 20   SQL NULL is .  
1da10 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20    ** equivalent 
1da20 74 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f 77 73  to an empty rows
1da30 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  et..    **.    *
1da40 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a  * Also initializ
1da50 65 20 72 65 67 52 65 74 75 72 6e 20 74 6f 20 63  e regReturn to c
1da60 6f 6e 74 61 69 6e 20 74 68 65 20 61 64 64 72 65  ontain the addre
1da70 73 73 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75  ss of the instru
1da80 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d  ction .    ** im
1da90 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
1daa0 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 74 75 72  ing the OP_Retur
1dab0 6e 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  n at the bottom 
1dac0 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69  of the loop. Thi
1dad0 73 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75  s.    ** is requ
1dae0 69 72 65 64 20 69 6e 20 61 20 66 65 77 20 6f 62  ired in a few ob
1daf0 73 63 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20  scure LEFT JOIN 
1db00 63 61 73 65 73 20 77 68 65 72 65 20 63 6f 6e 74  cases where cont
1db10 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a  rol jumps.    **
1db20 20 6f 76 65 72 20 74 68 65 20 74 6f 70 20 6f 66   over the top of
1db30 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74   the loop into t
1db40 68 65 20 62 6f 64 79 20 6f 66 20 69 74 2e 20 49  he body of it. I
1db50 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
1db60 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 20  .    ** correct 
1db70 72 65 73 70 6f 6e 73 65 20 66 6f 72 20 74 68 65  response for the
1db80 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64   end-of-loop cod
1db90 65 20 28 74 68 65 20 4f 50 5f 52 65 74 75 72 6e  e (the OP_Return
1dba0 29 20 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  ) is to .    ** 
1dbb0 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
1dbc0 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
1dbd0 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e  tion, just as an
1dbe0 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20 69 66   OP_Next does if
1dbf0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f  .    ** called o
1dc00 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a  n an uninitializ
1dc10 65 64 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a  ed cursor..    *
1dc20 2f 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66  /.    if( (pWInf
1dc30 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
1dc40 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53  WHERE_DUPLICATES
1dc50 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _OK)==0 ){.     
1dc60 20 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70   regRowset = ++p
1dc70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1dc80 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b     regRowid = ++
1dc90 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1dca0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1dcb0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1dcc0 2c 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b  , 0, regRowset);
1dcd0 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49  .    }.    iRetI
1dce0 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nit = sqlite3Vdb
1dcf0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1dd00 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74  teger, 0, regRet
1dd10 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  urn);..    /* If
1dd20 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48   the original WH
1dd30 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 7a 20  ERE clause is z 
1dd40 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 28 78  of the form:  (x
1dd50 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20  1 OR x2 OR ...) 
1dd60 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54 68 65  AND y.    ** The
1dd70 6e 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d  n for every term
1dd80 20 78 4e 2c 20 65 76 61 6c 75 61 74 65 20 61 73   xN, evaluate as
1dd90 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
1dda0 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20 20  on: xN AND z.   
1ddb0 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 74 65   ** That way, te
1ddc0 72 6d 73 20 69 6e 20 79 20 74 68 61 74 20 61 72  rms in y that ar
1ddd0 65 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f 20  e factored into 
1dde0 74 68 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20  the disjunction 
1ddf0 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70  will.    ** be p
1de00 69 63 6b 65 64 20 75 70 20 62 79 20 74 68 65 20  icked up by the 
1de10 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20  recursive calls 
1de20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
1de30 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20 20  egin() below..  
1de40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74 75    **.    ** Actu
1de50 61 6c 6c 79 2c 20 65 61 63 68 20 73 75 62 65 78  ally, each subex
1de60 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 76  pression is conv
1de70 65 72 74 65 64 20 74 6f 20 22 78 4e 20 41 4e 44  erted to "xN AND
1de80 20 77 22 20 77 68 65 72 65 20 77 20 69 73 0a 20   w" where w is. 
1de90 20 20 20 2a 2a 20 74 68 65 20 22 69 6e 74 65 72     ** the "inter
1dea0 65 73 74 69 6e 67 22 20 74 65 72 6d 73 20 6f 66  esting" terms of
1deb0 20 7a 20 2d 20 74 65 72 6d 73 20 74 68 61 74 20   z - terms that 
1dec0 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74  did not originat
1ded0 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  e in the.    ** 
1dee0 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
1def0 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  se of a LEFT JOI
1df00 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20 74 68 61  N, and terms tha
1df10 74 20 61 72 65 20 75 73 61 62 6c 65 20 61 73 20  t are usable as 
1df20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  .    ** indices.
1df30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1df40 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
1df50 20 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70 6c 69   also only appli
1df60 65 73 20 69 66 20 74 68 65 20 28 78 31 20 4f 52  es if the (x1 OR
1df70 20 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65 72 6d   x2 OR ...) term
1df80 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63  .    ** is not c
1df90 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
1dfa0 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c  ON clause of a L
1dfb0 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a  EFT JOIN..    **
1dfc0 20 53 65 65 20 74 69 63 6b 65 74 20 68 74 74 70   See ticket http
1dfd0 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72  ://www.sqlite.or
1dfe0 67 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33 36 39  g/src/info/f2369
1dff0 33 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20 20 20  304e4.    */.   
1e000 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e   if( pWC->nTerm>
1e010 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  1 ){.      int i
1e020 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  Term;.      for(
1e030 69 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70  iTerm=0; iTerm<p
1e040 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d  WC->nTerm; iTerm
1e050 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  ++){.        Exp
1e060 72 20 2a 70 45 78 70 72 20 3d 20 70 57 43 2d 3e  r *pExpr = pWC->
1e070 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a  a[iTerm].pExpr;.
1e080 20 20 20 20 20 20 20 20 69 66 28 20 26 70 57 43          if( &pWC
1e090 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d 3d 20 70 54  ->a[iTerm] == pT
1e0a0 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  erm ) continue;.
1e0b0 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72          if( Expr
1e0c0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1e0d0 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
1e0e0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1e0f0 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61 5b 69      if( pWC->a[i
1e100 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20  Term].wtFlags & 
1e110 28 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 20 29 20  (TERM_ORINFO) ) 
1e120 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1e130 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b 69 54    if( (pWC->a[iT
1e140 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20 26  erm].eOperator &
1e150 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63 6f   WO_ALL)==0 ) co
1e160 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1e170 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
1e180 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
1e190 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 41  , 0);.        pA
1e1a0 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ndExpr = sqlite3
1e1b0 45 78 70 72 41 6e 64 28 64 62 2c 20 70 41 6e 64  ExprAnd(db, pAnd
1e1c0 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20  Expr, pExpr);.  
1e1d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1e1e0 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20  pAndExpr ){.    
1e1f0 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73      pAndExpr = s
1e200 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
1e210 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 70  se, TK_AND, 0, p
1e220 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  AndExpr, 0);.   
1e230 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1e240 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72  for(ii=0; ii<pOr
1e250 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29  Wc->nTerm; ii++)
1e260 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
1e270 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f  m *pOrTerm = &pO
1e280 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20  rWc->a[ii];.    
1e290 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c    if( pOrTerm->l
1e2a0 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
1e2b0 7c 7c 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  || (pOrTerm->eOp
1e2c0 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29  erator & WO_AND)
1e2d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57  !=0 ){.        W
1e2e0 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57 49  hereInfo *pSubWI
1e2f0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nfo;          /*
1e300 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65   Info for single
1e310 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f   OR-term scan */
1e320 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
1e330 4f 72 45 78 70 72 20 3d 20 70 4f 72 54 65 72 6d  OrExpr = pOrTerm
1e340 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
1e350 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 26 26   if( pAndExpr &&
1e360 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1e370 79 28 70 4f 72 45 78 70 72 2c 20 45 50 5f 46 72  y(pOrExpr, EP_Fr
1e380 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
1e390 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70       pAndExpr->p
1e3a0 4c 65 66 74 20 3d 20 70 4f 72 45 78 70 72 3b 0a  Left = pOrExpr;.
1e3b0 20 20 20 20 20 20 20 20 20 20 70 4f 72 45 78 70            pOrExp
1e3c0 72 20 3d 20 70 41 6e 64 45 78 70 72 3b 0a 20 20  r = pAndExpr;.  
1e3d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e3e0 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
1e3f0 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68  table entries th
1e400 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f  at match term pO
1e410 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20  rTerm. */.      
1e420 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73 71    pSubWInfo = sq
1e430 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1e440 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20  pParse, pOrTab, 
1e450 70 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20  pOrExpr, 0, 0,. 
1e460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e470 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f 4d 49         WHERE_OMI
1e480 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 20 7c 20 57  T_OPEN_CLOSE | W
1e490 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 7c 0a  HERE_AND_ONLY |.
1e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4b0 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 46 4f          WHERE_FO
1e4c0 52 43 45 5f 54 41 42 4c 45 20 7c 20 57 48 45 52  RCE_TABLE | WHER
1e4d0 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 2c  E_ONETABLE_ONLY,
1e4e0 20 69 43 6f 76 43 75 72 29 3b 0a 20 20 20 20 20   iCovCur);.     
1e4f0 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 57     assert( pSubW
1e500 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Info || pParse->
1e510 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
1e520 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1e530 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66      if( pSubWInf
1e540 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57  o ){.          W
1e550 68 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f  hereLoop *pSubLo
1e560 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78  op;.          ex
1e570 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20  plainOneScan(.  
1e580 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
1e590 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75  se, pOrTab, &pSu
1e5a0 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c  bWInfo->a[0], iL
1e5b0 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46  evel, pLevel->iF
1e5c0 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20  rom, 0.         
1e5d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
1e5e0 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
1e5f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55  Flags & WHERE_DU
1e600 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20  PLICATES_OK)==0 
1e610 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
1e620 6e 74 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d  nt iSet = ((ii==
1e630 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f  pOrWc->nTerm-1)?
1e640 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20  -1:ii);.        
1e650 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20      int r;.     
1e660 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74         r = sqlit
1e670 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1e680 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  umn(pParse, pTab
1e690 49 74 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20  Item->pTab, -1, 
1e6a0 69 43 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20  iCur, .         
1e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6d0 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20  regRowid, 0);.  
1e6e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e6f0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
1e700 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c  , OP_RowSetTest,
1e710 20 72 65 67 52 6f 77 73 65 74 2c 0a 20 20 20 20   regRowset,.    
1e720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e730 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1e740 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1e750 64 64 72 28 76 29 2b 32 2c 20 72 2c 20 69 53 65  ddr(v)+2, r, iSe
1e760 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
1e770 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e780 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e790 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75  P_Gosub, regRetu
1e7a0 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a  rn, iLoopBody);.
1e7b0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
1e7c0 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74  e pSubWInfo->unt
1e7d0 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20  estedTerms flag 
1e7e0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
1e7f0 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20  OR term.        
1e800 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f    ** contained o
1e810 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74  ne or more AND t
1e820 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65  erm from a notRe
1e830 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a  ady table.  The.
1e840 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72            ** ter
1e850 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52  ms from the notR
1e860 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64  eady table could
1e870 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 61   not be tested a
1e880 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20  nd will.        
1e890 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20    ** need to be 
1e8a0 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20  tested later..  
1e8b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1e8c0 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e       if( pSubWIn
1e8d0 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
1e8e0 73 20 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d  s ) untestedTerm
1e8f0 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  s = 1;..        
1e900 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    /* If all of t
1e910 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  he OR-connected 
1e920 74 65 72 6d 73 20 61 72 65 20 6f 70 74 69 6d 69  terms are optimi
1e930 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61  zed using the sa
1e940 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  me.          ** 
1e950 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 65 20 69  index, and the i
1e960 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 20 75  ndex is opened u
1e970 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 75  sing the same cu
1e980 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20  rsor number.    
1e990 20 20 20 20 20 20 2a 2a 20 62 79 20 65 61 63 68        ** by each
1e9a0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1e9b0 57 68 65 72 65 42 65 67 69 6e 28 29 20 6d 61 64  WhereBegin() mad
1e9c0 65 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20  e by this loop, 
1e9d0 69 74 20 6d 61 79 0a 20 20 20 20 20 20 20 20 20  it may.         
1e9e0 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20   ** be possible 
1e9f0 74 6f 20 75 73 65 20 74 68 61 74 20 69 6e 64 65  to use that inde
1ea00 78 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20  x as a covering 
1ea10 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20  index..         
1ea20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   **.          **
1ea30 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   If the call to 
1ea40 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1ea50 6e 28 29 20 61 62 6f 76 65 20 72 65 73 75 6c 74  n() above result
1ea60 65 64 20 69 6e 20 61 20 73 63 61 6e 20 74 68 61  ed in a scan tha
1ea70 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1ea80 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e  ses an index, an
1ea90 64 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72  d this is either
1eaa0 20 74 68 65 20 66 69 72 73 74 20 4f 52 2d 63 6f   the first OR-co
1eab0 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a 20 20 20  nnected term.   
1eac0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
1ead0 73 65 64 20 6f 72 20 74 68 65 20 69 6e 64 65 78  sed or the index
1eae0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
1eaf0 74 68 61 74 20 75 73 65 64 20 62 79 20 61 6c 6c  that used by all
1eb00 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
1eb10 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65      ** terms, se
1eb20 74 20 70 43 6f 76 20 74 6f 20 74 68 65 20 63 61  t pCov to the ca
1eb30 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67  ndidate covering
1eb40 20 69 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73   index. Otherwis
1eb50 65 2c 20 73 65 74 20 0a 20 20 20 20 20 20 20 20  e, set .        
1eb60 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c    ** pCov to NUL
1eb70 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  L to indicate th
1eb80 61 74 20 6e 6f 20 63 61 6e 64 69 64 61 74 65 20  at no candidate 
1eb90 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 77  covering index w
1eba0 69 6c 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ill .          *
1ebb0 2a 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a  * be available..
1ebc0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1ebd0 20 20 20 20 20 20 20 70 53 75 62 4c 6f 6f 70 20         pSubLoop 
1ebe0 3d 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30  = pSubWInfo->a[0
1ebf0 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  ].pWLoop;.      
1ec00 20 20 20 20 61 73 73 65 72 74 28 20 28 70 53 75      assert( (pSu
1ec10 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  bLoop->wsFlags &
1ec20 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
1ec30 58 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  X)==0 );.       
1ec40 20 20 20 69 66 28 20 28 70 53 75 62 4c 6f 6f 70     if( (pSubLoop
1ec50 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1ec60 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20  E_INDEXED)!=0.  
1ec70 20 20 20 20 20 20 20 20 20 26 26 20 28 69 69 3d           && (ii=
1ec80 3d 30 20 7c 7c 20 70 53 75 62 4c 6f 6f 70 2d 3e  =0 || pSubLoop->
1ec90 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3d 3d  u.btree.pIndex==
1eca0 70 43 6f 76 29 0a 20 20 20 20 20 20 20 20 20 20  pCov).          
1ecb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
1ecc0 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f  ssert( pSubWInfo
1ecd0 2d 3e 61 5b 30 5d 2e 69 49 64 78 43 75 72 3d 3d  ->a[0].iIdxCur==
1ece0 69 43 6f 76 43 75 72 20 29 3b 0a 20 20 20 20 20  iCovCur );.     
1ecf0 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 70 53         pCov = pS
1ed00 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  ubLoop->u.btree.
1ed10 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20  pIndex;.        
1ed20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ed30 20 20 20 20 20 70 43 6f 76 20 3d 20 30 3b 0a 20       pCov = 0;. 
1ed40 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
1ed50 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 20        /* Finish 
1ed60 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68  the loop through
1ed70 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74   table entries t
1ed80 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70  hat match term p
1ed90 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  OrTerm. */.     
1eda0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
1edb0 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f 29 3b  eEnd(pSubWInfo);
1edc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1edd0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65   }.    }.    pLe
1ede0 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 20 3d  vel->u.pCovidx =
1edf0 20 70 43 6f 76 3b 0a 20 20 20 20 69 66 28 20 70   pCov;.    if( p
1ee00 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d 3e 69 49  Cov ) pLevel->iI
1ee10 64 78 43 75 72 20 3d 20 69 43 6f 76 43 75 72 3b  dxCur = iCovCur;
1ee20 0a 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70  .    if( pAndExp
1ee30 72 20 29 7b 0a 20 20 20 20 20 20 70 41 6e 64 45  r ){.      pAndE
1ee40 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  xpr->pLeft = 0;.
1ee50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ee60 72 44 65 6c 65 74 65 28 64 62 2c 20 70 41 6e 64  rDelete(db, pAnd
1ee70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Expr);.    }.   
1ee80 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1ee90 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69 74  geP1(v, iRetInit
1eea0 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
1eeb0 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20  rentAddr(v));.  
1eec0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1eed0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1eee0 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  0, pLevel->addrB
1eef0 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rk);.    sqlite3
1ef00 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1ef10 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a  (v, iLoopBody);.
1ef20 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
1ef30 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69  >nLevel>1 ) sqli
1ef40 74 65 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c  te3StackFree(db,
1ef50 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20 69 66   pOrTab);.    if
1ef60 28 20 21 75 6e 74 65 73 74 65 64 54 65 72 6d 73  ( !untestedTerms
1ef70 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70   ) disableTerm(p
1ef80 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20  Level, pTerm);. 
1ef90 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
1efa0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
1efb0 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
1efc0 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  .  {.    /* Case
1efd0 20 36 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f   6:  There is no
1efe0 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20   usable index.  
1eff0 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d  We must do a com
1f000 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  plete.    **    
1f010 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68        scan of th
1f020 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a  e entire table..
1f030 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69      */.    stati
1f040 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 65 70  c const u8 aStep
1f050 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c 20  [] = { OP_Next, 
1f060 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20 73  OP_Prev };.    s
1f070 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
1f080 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52  Start[] = { OP_R
1f090 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20 7d  ewind, OP_Last }
1f0a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 52  ;.    assert( bR
1f0b0 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d 31  ev==0 || bRev==1
1f0c0 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   );.    pLevel->
1f0d0 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d  op = aStep[bRev]
1f0e0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
1f0f0 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65   = iCur;.    pLe
1f100 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71  vel->p2 = 1 + sq
1f110 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1f120 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76 5d 2c  v, aStart[bRev],
1f130 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b   iCur, addrBrk);
1f140 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20  .    pLevel->p5 
1f150 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  = SQLITE_STMTSTA
1f160 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
1f170 50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73  P;.  }..  /* Ins
1f180 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74  ert code to test
1f190 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73   every subexpres
1f1a0 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65  sion that can be
1f1b0 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a   completely.  **
1f1c0 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20   computed using 
1f1d0 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20  the current set 
1f1e0 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  of tables..  */.
1f1f0 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
1f200 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d  >a, j=pWC->nTerm
1f210 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72  ; j>0; j--, pTer
1f220 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
1f230 70 45 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  pE;.    testcase
1f240 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
1f250 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1f260 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1f270 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
1f280 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a  & TERM_CODED );.
1f290 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
1f2a0 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
1f2b0 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
1f2c0 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
1f2d0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
1f2e0 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65  rereqAll & pLeve
1f2f0 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20  l->notReady)!=0 
1f300 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
1f310 65 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  e( pWInfo->untes
1f320 74 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20  tedTerms==0.    
1f330 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
1f340 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
1f350 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  s & WHERE_ONETAB
1f360 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20  LE_ONLY)!=0 );. 
1f370 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74       pWInfo->unt
1f380 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a  estedTerms = 1;.
1f390 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1f3a0 20 20 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70      }.    pE = p
1f3b0 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
1f3c0 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29   assert( pE!=0 )
1f3d0 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
1f3e0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21  ->iLeftJoin && !
1f3f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1f400 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pE, EP_FromJoin)
1f410 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   ){.      contin
1f420 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ue;.    }.    sq
1f430 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1f440 28 70 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64  (pParse, pE, add
1f450 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55  rCont, SQLITE_JU
1f460 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70  MPIFNULL);.    p
1f470 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
1f480 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d   TERM_CODED;.  }
1f490 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f  ..  /* Insert co
1f4a0 64 65 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69  de to test for i
1f4b0 6d 70 6c 69 65 64 20 63 6f 6e 73 74 72 61 69 6e  mplied constrain
1f4c0 74 73 20 62 61 73 65 64 20 6f 6e 20 74 72 61 6e  ts based on tran
1f4d0 73 69 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66  sitivity.  ** of
1f4e0 20 74 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74   the "==" operat
1f4f0 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  or..  **.  ** Ex
1f500 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 57 48  ample: If the WH
1f510 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
1f520 69 6e 73 20 22 74 31 2e 61 3d 74 32 2e 62 22 20  ins "t1.a=t2.b" 
1f530 61 6e 64 20 22 74 32 2e 62 3d 31 32 33 22 0a 20  and "t2.b=123". 
1f540 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 63   ** and we are c
1f550 6f 64 69 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f  oding the t1 loo
1f560 70 20 61 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f  p and the t2 loo
1f570 70 20 68 61 73 20 6e 6f 74 20 79 65 74 20 63 6f  p has not yet co
1f580 64 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77  ded,.  ** then w
1f590 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65  e cannot use the
1f5a0 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e   "t1.a=t2.b" con
1f5b0 73 74 72 61 69 6e 74 2c 20 62 75 74 20 77 65 20  straint, but we 
1f5c0 63 61 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68  can code.  ** th
1f5d0 65 20 69 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d  e implied "t1.a=
1f5e0 31 32 33 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e  123" constraint.
1f5f0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72  .  */.  for(pTer
1f600 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d  m=pWC->a, j=pWC-
1f610 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d  >nTerm; j>0; j--
1f620 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
1f630 45 78 70 72 20 2a 70 45 2c 20 2a 70 45 41 6c 74  Expr *pE, *pEAlt
1f640 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
1f650 2a 70 41 6c 74 3b 0a 20 20 20 20 69 66 28 20 70  *pAlt;.    if( p
1f660 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1f670 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
1f680 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
1f690 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
1f6a0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d  erm->eOperator!=
1f6b0 28 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 45 51 29  (WO_EQUIV|WO_EQ)
1f6c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1f6d0 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
1f6e0 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29 20 63  Cursor!=iCur ) c
1f6f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
1f700 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
1f710 69 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  in ) continue;. 
1f720 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70     pE = pTerm->p
1f730 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
1f740 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1f750 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f  ty(pE, EP_FromJo
1f760 69 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  in) );.    asser
1f770 74 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  t( (pTerm->prere
1f780 71 52 69 67 68 74 20 26 20 70 4c 65 76 65 6c 2d  qRight & pLevel-
1f790 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 3b  >notReady)!=0 );
1f7a0 0a 20 20 20 20 70 41 6c 74 20 3d 20 66 69 6e 64  .    pAlt = find
1f7b0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
1f7c0 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
1f7d0 75 6d 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57  umn, notReady, W
1f7e0 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a  O_EQ|WO_IN, 0);.
1f7f0 20 20 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20      if( pAlt==0 
1f800 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1f810 69 66 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67  if( pAlt->wtFlag
1f820 73 20 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29  s & (TERM_CODED)
1f830 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1f840 20 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d   testcase( pAlt-
1f850 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1f860 45 51 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  EQ );.    testca
1f870 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61  se( pAlt->eOpera
1f880 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
1f890 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d     VdbeModuleCom
1f8a0 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20  ment((v, "begin 
1f8b0 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74  transitive const
1f8c0 72 61 69 6e 74 22 29 29 3b 0a 20 20 20 20 70 45  raint"));.    pE
1f8d0 41 6c 74 20 3d 20 73 71 6c 69 74 65 33 53 74 61  Alt = sqlite3Sta
1f8e0 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  ckAllocRaw(db, s
1f8f0 69 7a 65 6f 66 28 2a 70 45 41 6c 74 29 29 3b 0a  izeof(*pEAlt));.
1f900 20 20 20 20 69 66 28 20 70 45 41 6c 74 20 29 7b      if( pEAlt ){
1f910 0a 20 20 20 20 20 20 2a 70 45 41 6c 74 20 3d 20  .      *pEAlt = 
1f920 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20  *pAlt->pExpr;.  
1f930 20 20 20 20 70 45 41 6c 74 2d 3e 70 4c 65 66 74      pEAlt->pLeft
1f940 20 3d 20 70 45 2d 3e 70 4c 65 66 74 3b 0a 20 20   = pE->pLeft;.  
1f950 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1f960 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1f970 45 41 6c 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20  EAlt, addrCont, 
1f980 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1f990 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
1f9a0 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70  3StackFree(db, p
1f9b0 45 41 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  EAlt);.    }.  }
1f9c0 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46  ..  /* For a LEF
1f9d0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65  T OUTER JOIN, ge
1f9e0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1f9f0 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65   will record the
1fa00 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20   fact that.  ** 
1fa10 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77  at least one row
1fa20 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
1fa30 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20  ble has matched 
1fa40 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20  the left table. 
1fa50 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65   .  */.  if( pLe
1fa60 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
1fa70 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  {.    pLevel->ad
1fa80 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
1fa90 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1faa0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1fab0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1fac0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65  _Integer, 1, pLe
1fad0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
1fae0 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
1faf0 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46  ((v, "record LEF
1fb00 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20  T JOIN hit"));. 
1fb10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1fb20 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
1fb30 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
1fb40 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70  pWC->a, j=0; j<p
1fb50 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20  WC->nTerm; j++, 
1fb60 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
1fb70 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
1fb80 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1fb90 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
1fba0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
1fbb0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1fbc0 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20  _CODED );.      
1fbd0 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
1fbe0 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
1fbf0 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  AL|TERM_CODED) )
1fc00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1fc10 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
1fc20 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d  reqAll & pLevel-
1fc30 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b  >notReady)!=0 ){
1fc40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1fc50 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
1fc60 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20  dTerms );.      
1fc70 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1fc80 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
1fc90 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29  ( pTerm->pExpr )
1fca0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1fcb0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1fcc0 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  e, pTerm->pExpr,
1fcd0 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
1fce0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1fcf0 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
1fd00 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
1fd10 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  D;.    }.  }.  s
1fd20 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1fd30 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65  pReg(pParse, iRe
1fd40 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20 20 72 65  leaseReg);..  re
1fd50 74 75 72 6e 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  turn pLevel->not
1fd60 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 20 64 65  Ready;.}..#if de
1fd70 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
1fd80 5f 45 4e 41 42 4c 45 44 29 20 26 26 20 64 65 66  _ENABLED) && def
1fd90 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1fda0 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29  LE_TREE_EXPLAIN)
1fdb0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1fdc0 22 45 78 70 6c 61 6e 61 74 69 6f 6e 22 20 74 65  "Explanation" te
1fdd0 78 74 20 66 6f 72 20 61 20 57 68 65 72 65 54 65  xt for a WhereTe
1fde0 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rm..*/.static vo
1fdf0 69 64 20 77 68 65 72 65 45 78 70 6c 61 69 6e 54  id whereExplainT
1fe00 65 72 6d 28 56 64 62 65 20 2a 76 2c 20 57 68 65  erm(Vdbe *v, Whe
1fe10 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a  reTerm *pTerm){.
1fe20 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b    char zType[4];
1fe30 0a 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c  .  memcpy(zType,
1fe40 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 69 66   "...", 4);.  if
1fe50 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
1fe60 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1fe70 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27 56 27  ) zType[0] = 'V'
1fe80 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65  ;.  if( pTerm->e
1fe90 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
1fea0 55 49 56 20 20 29 20 7a 54 79 70 65 5b 31 5d 20  UIV  ) zType[1] 
1feb0 3d 20 27 45 27 3b 0a 20 20 69 66 28 20 45 78 70  = 'E';.  if( Exp
1fec0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
1fed0 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
1fee0 6f 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b  omJoin) ) zType[
1fef0 32 5d 20 3d 20 27 4c 27 3b 0a 20 20 73 71 6c 69  2] = 'L';.  sqli
1ff00 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1ff10 28 76 2c 20 22 25 73 20 22 2c 20 7a 54 79 70 65  (v, "%s ", zType
1ff20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  );.  sqlite3Expl
1ff30 61 69 6e 45 78 70 72 28 76 2c 20 70 54 65 72 6d  ainExpr(v, pTerm
1ff40 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 23 65 6e 64  ->pExpr);.}.#end
1ff50 69 66 20 2f 2a 20 57 48 45 52 45 54 52 41 43 45  if /* WHERETRACE
1ff60 5f 45 4e 41 42 4c 45 44 20 26 26 20 53 51 4c 49  _ENABLED && SQLI
1ff70 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
1ff80 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 23 69 66 64  XPLAIN */...#ifd
1ff90 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
1ffa0 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ABLED./*.** Prin
1ffb0 74 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  t a WhereLoop ob
1ffc0 6a 65 63 74 20 66 6f 72 20 64 65 62 75 67 67 69  ject for debuggi
1ffd0 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73  ng purposes.*/.s
1ffe0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
1fff0 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c  LoopPrint(WhereL
20000 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61  oop *p, WhereCla
20010 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65  use *pWC){.  Whe
20020 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
20030 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20   pWC->pWInfo;.  
20040 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e  int nb = 1+(pWIn
20050 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
20060 72 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63  rc+7)/8;.  struc
20070 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
20080 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
20090 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d  pTabList->a + p-
200a0 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a  >iTab;.  Table *
200b0 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
200c0 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  ab;.  sqlite3Deb
200d0 75 67 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e  ugPrintf("%c%2d.
200e0 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20  %0*llx.%0*llx", 
200f0 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20  p->cId,.        
20100 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
20110 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73  iTab, nb, p->mas
20120 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72  kSelf, nb, p->pr
20130 65 72 65 71 29 3b 0a 20 20 73 71 6c 69 74 65 33  ereq);.  sqlite3
20140 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 31  DebugPrintf(" %1
20150 32 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2s",.           
20160 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
20170 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d  >zAlias ? pItem-
20180 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e  >zAlias : pTab->
20190 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70  zName);.  if( (p
201a0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
201b0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
201c0 3d 30 20 29 7b 0a 20 20 20 20 20 63 6f 6e 73 74  =0 ){.     const
201d0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
201e0 20 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65     if( p->u.btre
201f0 65 2e 70 49 6e 64 65 78 20 26 26 20 28 7a 4e 61  e.pIndex && (zNa
20200 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e  me = p->u.btree.
20210 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d  pIndex->zName)!=
20220 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  0 ){.      if( s
20230 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  trncmp(zName, "s
20240 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
20250 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 17)==0 ){.   
20260 20 20 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c       int i = sql
20270 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
20280 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  me) - 1;.       
20290 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d   while( zName[i]
202a0 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20  !='_' ) i--;.   
202b0 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b       zName += i;
202c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
202d0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
202e0 66 28 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20  f(".%-16s %2d", 
202f0 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65  zName, p->u.btre
20300 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73  e.nEq);.    }els
20310 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
20320 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 32 30  DebugPrintf("%20
20330 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20  s","");.    }.  
20340 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
20350 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75  *z;.    if( p->u
20360 2e 76 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a  .vtab.idxStr ){.
20370 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
20380 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c  3_mprintf("(%d,\
20390 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20  "%s\",%x)",.    
203a0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75              p->u
203b0 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d  .vtab.idxNum, p-
203c0 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20  >u.vtab.idxStr, 
203d0 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
203e0 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  sk);.    }else{.
203f0 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
20400 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25  3_mprintf("(%d,%
20410 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69  x)", p->u.vtab.i
20420 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62  dxNum, p->u.vtab
20430 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20  .omitMask);.    
20440 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
20450 75 67 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73  ugPrintf(" %-19s
20460 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", z);.    sqlit
20470 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a  e3_free(z);.  }.
20480 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
20490 69 6e 74 66 28 22 20 66 20 25 30 34 78 20 4e 20  intf(" f %04x N 
204a0 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c  %d", p->wsFlags,
204b0 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 73   p->nLTerm);.  s
204c0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
204d0 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c 25  f(" cost %d,%d,%
204e0 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c  d\n", p->rSetup,
204f0 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75   p->rRun, p->nOu
20500 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t);.#ifdef SQLIT
20510 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
20520 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68  PLAIN.  /* If th
20530 65 20 30 78 31 30 30 20 62 69 74 20 6f 66 20 77  e 0x100 bit of w
20540 68 65 72 65 74 72 61 63 69 6e 67 20 69 73 20 73  heretracing is s
20550 65 74 2c 20 74 68 65 6e 20 73 68 6f 77 20 61 6c  et, then show al
20560 6c 20 6f 66 20 74 68 65 20 63 6f 6e 73 74 72 61  l of the constra
20570 69 6e 74 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  int.  ** express
20580 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 68 65 72  ions in the Wher
20590 65 4c 6f 6f 70 2e 61 4c 54 65 72 6d 5b 5d 20 61  eLoop.aLTerm[] a
205a0 72 72 61 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rray..  */.  if(
205b0 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 28 73   p->nLTerm && (s
205c0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
205d0 20 26 20 30 78 31 30 30 29 21 3d 30 20 29 7b 20   & 0x100)!=0 ){ 
205e0 20 2f 2a 20 57 48 45 52 45 54 52 41 43 45 20 30   /* WHERETRACE 0
205f0 78 31 30 30 20 2a 2f 0a 20 20 20 20 69 6e 74 20  x100 */.    int 
20600 69 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  i;.    Vdbe *v =
20610 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
20620 3e 70 56 64 62 65 3b 0a 20 20 20 20 73 71 6c 69  >pVdbe;.    sqli
20630 74 65 33 45 78 70 6c 61 69 6e 42 65 67 69 6e 28  te3ExplainBegin(
20640 76 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  v);.    for(i=0;
20650 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b   i<p->nLTerm; i+
20660 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54  +){.      WhereT
20670 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 70 2d 3e  erm *pTerm = p->
20680 61 4c 54 65 72 6d 5b 69 5d 3b 0a 20 20 20 20 20  aLTerm[i];.     
20690 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
206a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
206b0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
206c0 69 6e 74 66 28 76 2c 20 22 20 20 28 25 64 29 20  intf(v, "  (%d) 
206d0 23 25 2d 32 64 20 22 2c 20 69 2b 31 2c 20 28 69  #%-2d ", i+1, (i
206e0 6e 74 29 28 70 54 65 72 6d 2d 70 57 43 2d 3e 61  nt)(pTerm-pWC->a
206f0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
20700 33 45 78 70 6c 61 69 6e 50 75 73 68 28 76 29 3b  3ExplainPush(v);
20710 0a 20 20 20 20 20 20 77 68 65 72 65 45 78 70 6c  .      whereExpl
20720 61 69 6e 54 65 72 6d 28 76 2c 20 70 54 65 72 6d  ainTerm(v, pTerm
20730 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20740 45 78 70 6c 61 69 6e 50 6f 70 28 76 29 3b 0a 20  ExplainPop(v);. 
20750 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
20760 61 69 6e 4e 4c 28 76 29 3b 0a 20 20 20 20 7d 0a  ainNL(v);.    }.
20770 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
20780 69 6e 46 69 6e 69 73 68 28 76 29 3b 0a 20 20 20  inFinish(v);.   
20790 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
207a0 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
207b0 33 56 64 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e  3VdbeExplanation
207c0 28 76 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (v));.  }.#endif
207d0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
207e0 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65   Convert bulk me
207f0 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69  mory into a vali
20800 64 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  d WhereLoop that
20810 20 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a   can be passed.*
20820 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c  * to whereLoopCl
20830 65 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a  ear harmlessly..
20840 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
20850 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65  hereLoopInit(Whe
20860 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d  reLoop *p){.  p-
20870 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54  >aLTerm = p->aLT
20880 65 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e  ermSpace;.  p->n
20890 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e  LTerm = 0;.  p->
208a0 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69  nLSlot = ArraySi
208b0 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  ze(p->aLTermSpac
208c0 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73  e);.  p->wsFlags
208d0 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
208e0 6c 65 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f  lear the WhereLo
208f0 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61  op.u union.  Lea
20900 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54  ve WhereLoop.pLT
20910 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73  erm intact..*/.s
20920 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
20930 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73  LoopClearUnion(s
20940 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
20950 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28  eLoop *p){.  if(
20960 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57   p->wsFlags & (W
20970 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
20980 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  E|WHERE_AUTO_IND
20990 45 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  EX) ){.    if( (
209a0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
209b0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
209c0 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62  !=0 && p->u.vtab
209d0 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
209e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
209f0 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
20a00 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74  );.      p->u.vt
20a10 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
20a20 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62  .      p->u.vtab
20a30 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  .idxStr = 0;.   
20a40 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77   }else if( (p->w
20a50 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
20a60 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26  UTO_INDEX)!=0 &&
20a70 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
20a80 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ex!=0 ){.      s
20a90 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
20aa0 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
20ab0 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  ex->zColAff);.  
20ac0 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
20ad0 66 6f 55 6e 72 65 66 28 70 2d 3e 75 2e 62 74 72  foUnref(p->u.btr
20ae0 65 65 2e 70 49 6e 64 65 78 2d 3e 70 4b 65 79 49  ee.pIndex->pKeyI
20af0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
20b00 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
20b10 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
20b20 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  ;.      p->u.btr
20b30 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
20b40 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
20b50 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74  * Deallocate int
20b60 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65  ernal memory use
20b70 64 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70  d by a WhereLoop
20b80 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
20b90 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
20ba0 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64  Clear(sqlite3 *d
20bb0 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
20bc0 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  {.  if( p->aLTer
20bd0 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
20be0 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
20bf0 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  e(db, p->aLTerm)
20c00 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  ;.  whereLoopCle
20c10 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a  arUnion(db, p);.
20c20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
20c30 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  p);.}../*.** Inc
20c40 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79  rease the memory
20c50 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20   allocation for 
20c60 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20  pLoop->aLTerm[] 
20c70 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e  to be at least n
20c80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20c90 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
20ca0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
20cb0 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e  reLoop *p, int n
20cc0 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
20cd0 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d  *paNew;.  if( p-
20ce0 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74  >nLSlot>=n ) ret
20cf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
20d00 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20   n = (n+7)&~7;. 
20d10 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   paNew = sqlite3
20d20 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
20d30 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d  sizeof(p->aLTerm
20d40 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70  [0])*n);.  if( p
20d50 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  aNew==0 ) return
20d60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
20d70 20 6d 65 6d 63 70 79 28 70 61 4e 65 77 2c 20 70   memcpy(paNew, p
20d80 2d 3e 61 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66  ->aLTerm, sizeof
20d90 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70  (p->aLTerm[0])*p
20da0 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28  ->nLSlot);.  if(
20db0 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61   p->aLTerm!=p->a
20dc0 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c  LTermSpace ) sql
20dd0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
20de0 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e  ->aLTerm);.  p->
20df0 61 4c 54 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a  aLTerm = paNew;.
20e00 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b    p->nLSlot = n;
20e10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20e20 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  _OK;.}../*.** Tr
20e30 61 6e 73 66 65 72 20 63 6f 6e 74 65 6e 74 20 66  ansfer content f
20e40 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 70  rom the second p
20e50 4c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 66 69  Loop into the fi
20e60 72 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rst..*/.static i
20e70 6e 74 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72  nt whereLoopXfer
20e80 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
20e90 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68  ereLoop *pTo, Wh
20ea0 65 72 65 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b  ereLoop *pFrom){
20eb0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
20ec0 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b  rUnion(db, pTo);
20ed0 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  .  if( whereLoop
20ee0 52 65 73 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20  Resize(db, pTo, 
20ef0 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29  pFrom->nLTerm) )
20f00 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 54  {.    memset(&pT
20f10 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28  o->u, 0, sizeof(
20f20 70 54 6f 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65  pTo->u));.    re
20f30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
20f40 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28  M;.  }.  memcpy(
20f50 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52  pTo, pFrom, WHER
20f60 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b  E_LOOP_XFER_SZ);
20f70 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61  .  memcpy(pTo->a
20f80 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c  LTerm, pFrom->aL
20f90 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72  Term, pTo->nLTer
20fa0 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c  m*sizeof(pTo->aL
20fb0 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28  Term[0]));.  if(
20fc0 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20   pFrom->wsFlags 
20fd0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
20fe0 41 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72 6f  ABLE ){.    pFro
20ff0 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  m->u.vtab.needFr
21000 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  ee = 0;.  }else 
21010 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c  if( (pFrom->wsFl
21020 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
21030 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20  _INDEX)!=0 ){.  
21040 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65    pFrom->u.btree
21050 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d  .pIndex = 0;.  }
21060 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
21070 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
21080 6c 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70  lete a WhereLoop
21090 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
210a0 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
210b0 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
210c0 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
210d0 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c  ){.  whereLoopCl
210e0 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71  ear(db, p);.  sq
210f0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
21100 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  p);.}../*.** Fre
21110 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74  e a WhereInfo st
21120 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69  ructure.*/.stati
21130 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f  c void whereInfo
21140 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62  Free(sqlite3 *db
21150 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  , WhereInfo *pWI
21160 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  nfo){.  if( ALWA
21170 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20  YS(pWInfo) ){.  
21180 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
21190 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  ar(&pWInfo->sWC)
211a0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57 49  ;.    while( pWI
211b0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20  nfo->pLoops ){. 
211c0 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a       WhereLoop *
211d0 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  p = pWInfo->pLoo
211e0 70 73 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ps;.      pWInfo
211f0 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e  ->pLoops = p->pN
21200 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77  extLoop;.      w
21210 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64  hereLoopDelete(d
21220 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  b, p);.    }.   
21230 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
21240 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
21250 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
21260 6f 72 20 72 65 70 6c 61 63 65 20 61 20 57 68 65  or replace a Whe
21270 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 75 73 69  reLoop entry usi
21280 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20  ng the template 
21290 73 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  supplied..**.** 
212a0 41 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  An existing Wher
212b0 65 4c 6f 6f 70 20 65 6e 74 72 79 20 6d 69 67 68  eLoop entry migh
212c0 74 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  t be overwritten
212d0 20 69 66 20 74 68 65 20 6e 65 77 20 74 65 6d 70   if the new temp
212e0 6c 61 74 65 0a 2a 2a 20 69 73 20 62 65 74 74 65  late.** is bette
212f0 72 20 61 6e 64 20 68 61 73 20 66 65 77 65 72 20  r and has fewer 
21300 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f  dependencies.  O
21310 72 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 77  r the template w
21320 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a  ill be ignored.*
21330 2a 20 61 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20  * and no insert 
21340 77 69 6c 6c 20 6f 63 63 75 72 20 69 66 20 61 6e  will occur if an
21350 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
21360 6f 6f 70 20 69 73 20 66 61 73 74 65 72 20 61 6e  oop is faster an
21370 64 20 68 61 73 0a 2a 2a 20 66 65 77 65 72 20 64  d has.** fewer d
21380 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e  ependencies than
21390 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 20 20   the template.  
213a0 4f 74 68 65 72 77 69 73 65 20 61 20 6e 65 77 20  Otherwise a new 
213b0 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20  WhereLoop is.** 
213c0 61 64 64 65 64 20 62 61 73 65 64 20 6f 6e 20 74  added based on t
213d0 68 65 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a  he template..**.
213e0 2a 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e  ** If pBuilder->
213f0 70 4f 72 53 65 74 20 69 73 20 6e 6f 74 20 4e 55  pOrSet is not NU
21400 4c 4c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20  LL then we only 
21410 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79 20  care about only 
21420 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75 69 73  the.** prerequis
21430 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20 61 6e  ites and rRun an
21440 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66 20  d nOut costs of 
21450 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70 73  the N best loops
21460 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f 72  .  That.** infor
21470 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68 65 72  mation is gather
21480 65 64 20 69 6e 20 74 68 65 20 70 42 75 69 6c 64  ed in the pBuild
21490 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65 63  er->pOrSet objec
214a0 74 2e 20 20 54 68 69 73 20 73 70 65 63 69 61 6c  t.  This special
214b0 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 6d  .** processing m
214c0 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ode is used only
214d0 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70   for OR clause p
214e0 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
214f0 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74 69   When accumulati
21500 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70  ng multiple loop
21510 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65 72  s (when pBuilder
21520 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55 4c 4c  ->pOrSet is NULL
21530 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69  ) we.** still mi
21540 67 68 74 20 6f 76 65 72 77 72 69 74 65 20 73 69  ght overwrite si
21550 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74 68  milar loops with
21560 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74   the new templat
21570 65 20 69 66 20 74 68 65 0a 2a 2a 20 74 65 6d 70  e if the.** temp
21580 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 2e 20  late is better. 
21590 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20 6f 76   Loops may be ov
215a0 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
215b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63   following .** c
215c0 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20 6d 65  onditions are me
215d0 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  t:.**.**    (1) 
215e0 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73   They have the s
215f0 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20  ame iTab..**    
21600 28 32 29 20 20 54 68 65 79 20 68 61 76 65 20 74  (2)  They have t
21610 68 65 20 73 61 6d 65 20 69 53 6f 72 74 49 64 78  he same iSortIdx
21620 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20 54 68 65  ..**    (3)  The
21630 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 73 61   template has sa
21640 6d 65 20 6f 72 20 66 65 77 65 72 20 64 65 70 65  me or fewer depe
21650 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68  ndencies than th
21660 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a  e current loop.*
21670 2a 20 20 20 20 28 34 29 20 20 54 68 65 20 74 65  *    (4)  The te
21680 6d 70 6c 61 74 65 20 68 61 73 20 74 68 65 20 73  mplate has the s
21690 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ame or lower cos
216a0 74 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  t than the curre
216b0 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 35  nt loop.**    (5
216c0 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
216d0 75 73 65 73 20 6d 6f 72 65 20 74 65 72 6d 73 20  uses more terms 
216e0 6f 66 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65  of the same inde
216f0 78 20 62 75 74 20 68 61 73 20 6e 6f 20 61 64 64  x but has no add
21700 69 74 69 6f 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  itional.**      
21710 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20     dependencies 
21720 20 20 20 20 20 20 20 20 20 0a 2a 2f 0a 73 74 61           .*/.sta
21730 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
21740 70 49 6e 73 65 72 74 28 57 68 65 72 65 4c 6f 6f  pInsert(WhereLoo
21750 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
21760 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  er, WhereLoop *p
21770 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68 65  Template){.  Whe
21780 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c  reLoop **ppPrev,
21790 20 2a 70 2c 20 2a 70 4e 65 78 74 20 3d 20 30 3b   *p, *pNext = 0;
217a0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
217b0 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
217c0 3e 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74  >pWInfo;.  sqlit
217d0 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
217e0 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20  >pParse->db;..  
217f0 2f 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e  /* If pBuilder->
21800 70 4f 72 53 65 74 20 69 73 20 64 65 66 69 6e 65  pOrSet is define
21810 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b 65 65  d, then only kee
21820 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 63  p track of the c
21830 6f 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 70 72  osts.  ** and pr
21840 65 72 65 71 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  ereqs..  */.  if
21850 28 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  ( pBuilder->pOrS
21860 65 74 21 3d 30 20 29 7b 0a 23 69 66 20 57 48 45  et!=0 ){.#if WHE
21870 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
21880 20 20 20 20 75 31 36 20 6e 20 3d 20 70 42 75 69      u16 n = pBui
21890 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b  lder->pOrSet->n;
218a0 0a 20 20 20 20 69 6e 74 20 78 20 3d 0a 23 65 6e  .    int x =.#en
218b0 64 69 66 0a 20 20 20 20 77 68 65 72 65 4f 72 49  dif.    whereOrI
218c0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2d 3e  nsert(pBuilder->
218d0 70 4f 72 53 65 74 2c 20 70 54 65 6d 70 6c 61 74  pOrSet, pTemplat
218e0 65 2d 3e 70 72 65 72 65 71 2c 20 70 54 65 6d 70  e->prereq, pTemp
218f0 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20  late->rRun,.    
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21920 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29  pTemplate->nOut)
21930 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  ;.#if WHERETRACE
21940 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20  _ENABLED /* 0x8 
21950 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
21960 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
21970 78 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  x8 ){.      sqli
21980 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 78  te3DebugPrintf(x
21990 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22  ?"   or-%d:  ":"
219a0 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b     or-X:  ", n);
219b0 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
219c0 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c  Print(pTemplate,
219d0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b   pBuilder->pWC);
219e0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
219f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21a00 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  OK;.  }..  /* Se
21a10 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
21a20 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 74  ting WhereLoop t
21a30 6f 20 6f 76 65 72 77 72 69 74 65 2c 20 6f 72 20  o overwrite, or 
21a40 77 68 69 63 68 20 74 61 6b 65 73 0a 20 20 2a 2a  which takes.  **
21a50 20 70 72 69 6f 72 69 74 79 20 6f 76 65 72 20 70   priority over p
21a60 54 65 6d 70 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20  Template..  */. 
21a70 20 66 6f 72 28 70 70 50 72 65 76 3d 26 70 57 49   for(ppPrev=&pWI
21a80 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 3d 2a  nfo->pLoops, p=*
21a90 70 70 50 72 65 76 3b 20 70 3b 20 70 70 50 72 65  ppPrev; p; ppPre
21aa0 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c  v=&p->pNextLoop,
21ab0 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20   p=*ppPrev){.   
21ac0 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54   if( p->iTab!=pT
21ad0 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c  emplate->iTab ||
21ae0 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54   p->iSortIdx!=pT
21af0 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64  emplate->iSortId
21b00 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  x ){.      /* If
21b10 20 65 69 74 68 65 72 20 74 68 65 20 69 54 61 62   either the iTab
21b20 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61 6c   or iSortIdx val
21b30 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65 72  ues for two Wher
21b40 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65 72  eLoop are differ
21b50 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ent.      ** the
21b60 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f  n those WhereLoo
21b70 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f  ps need to be co
21b80 6e 73 69 64 65 72 65 64 20 73 65 70 61 72 61 74  nsidered separat
21b90 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69 73  ely.  Neither is
21ba0 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e 64  .      ** a cand
21bb0 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63 65  idate to replace
21bc0 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20   the other. */. 
21bd0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
21be0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74     }.    /* In t
21bf0 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
21c00 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 72  mentation, the r
21c10 53 65 74 75 70 20 76 61 6c 75 65 20 69 73 20 65  Setup value is e
21c20 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a  ither zero.    *
21c30 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66  * or the cost of
21c40 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74   building an aut
21c50 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e 6c  omatic index (Nl
21c60 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f  ogN) and the Nlo
21c70 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  gN.    ** is the
21c80 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74   same for compat
21c90 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e  ible WhereLoops.
21ca0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
21cb0 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20  p->rSetup==0 || 
21cc0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
21cd0 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  p==0 .          
21ce0 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65         || p->rSe
21cf0 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup==pTemplate->
21d00 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f  rSetup );..    /
21d10 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  * whereLoopAddBt
21d20 72 65 65 28 29 20 61 6c 77 61 79 73 20 67 65 6e  ree() always gen
21d30 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65 72  erates and inser
21d40 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ts the automatic
21d50 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61   index.    ** ca
21d60 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63 65  se first.  Hence
21d70 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e 64   compatible cand
21d80 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 73  idate WhereLoops
21d90 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c 61   never have a la
21da0 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65 74  rger.    ** rSet
21db0 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53 45  up. Call this SE
21dc0 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f  TUP-INVARIANT */
21dd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
21de0 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74  rSetup>=pTemplat
21df0 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20  e->rSetup );..  
21e00 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
21e10 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
21e20 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71  ereq)==p->prereq
21e30 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74  .     && p->rSet
21e40 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up<=pTemplate->r
21e50 53 65 74 75 70 0a 20 20 20 20 20 26 26 20 70 2d  Setup.     && p-
21e60 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65  >rRun<=pTemplate
21e70 2d 3e 72 52 75 6e 0a 20 20 20 20 20 26 26 20 70  ->rRun.     && p
21e80 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c 61 74  ->nOut<=pTemplat
21e90 65 2d 3e 6e 4f 75 74 0a 20 20 20 20 29 7b 0a 20  e->nOut.    ){. 
21ea0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
21eb0 6e 63 68 20 74 61 6b 65 6e 20 77 68 65 6e 20 70  nch taken when p
21ec0 20 69 73 20 65 71 75 61 6c 20 6f 72 20 62 65 74   is equal or bet
21ed0 74 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61  ter than pTempla
21ee0 74 65 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20  te in .      ** 
21ef0 61 6c 6c 20 6f 66 20 28 31 29 20 64 65 70 65 6e  all of (1) depen
21f00 64 65 6e 63 69 65 73 20 28 32 29 20 73 65 74 75  dencies (2) setu
21f10 70 2d 63 6f 73 74 2c 20 28 33 29 20 72 75 6e 2d  p-cost, (3) run-
21f20 63 6f 73 74 2c 20 61 6e 64 0a 20 20 20 20 20 20  cost, and.      
21f30 2a 2a 20 28 34 29 20 6e 75 6d 62 65 72 20 6f 66  ** (4) number of
21f40 20 6f 75 74 70 75 74 20 72 6f 77 73 2e 20 2a 2f   output rows. */
21f50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21f60 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c  ->rSetup==pTempl
21f70 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 20  ate->rSetup );. 
21f80 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65 72       if( p->prer
21f90 65 71 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70  eq==pTemplate->p
21fa0 72 65 72 65 71 0a 20 20 20 20 20 20 20 26 26 20  rereq.       && 
21fb0 70 2d 3e 6e 4c 54 65 72 6d 3c 70 54 65 6d 70 6c  p->nLTerm<pTempl
21fc0 61 74 65 2d 3e 6e 4c 54 65 72 6d 0a 20 20 20 20  ate->nLTerm.    
21fd0 20 20 20 26 26 20 28 70 2d 3e 77 73 46 6c 61 67     && (p->wsFlag
21fe0 73 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 77  s & pTemplate->w
21ff0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
22000 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20  NDEXED)!=0.     
22010 20 20 26 26 20 28 70 2d 3e 75 2e 62 74 72 65 65    && (p->u.btree
22020 2e 70 49 6e 64 65 78 3d 3d 70 54 65 6d 70 6c 61  .pIndex==pTempla
22030 74 65 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  te->u.btree.pInd
22040 65 78 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  ex.          || 
22050 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2b  pTemplate->rRun+
22060 70 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 2d 3e 72 52  p->nLTerm<=p->rR
22070 75 6e 2b 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c  un+pTemplate->nL
22080 54 65 72 6d 29 0a 20 20 20 20 20 20 29 7b 0a 20  Term).      ){. 
22090 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 77 72         /* Overwr
220a0 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ite an existing 
220b0 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61  WhereLoop with a
220c0 6e 20 73 69 6d 69 6c 61 72 20 6f 6e 65 20 74 68  n similar one th
220d0 61 74 20 75 73 65 73 0a 20 20 20 20 20 20 20 20  at uses.        
220e0 2a 2a 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66  ** more terms of
220f0 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
22100 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d        pNext = p-
22110 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20  >pNextLoop;.    
22120 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
22130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22140 2f 2a 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20  /* pTemplate is 
22150 6e 6f 74 20 68 65 6c 70 66 75 6c 2e 0a 20 20 20  not helpful..   
22160 20 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 77       ** Return w
22170 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
22180 6f 72 20 61 64 64 69 6e 67 20 61 6e 79 74 68 69  or adding anythi
22190 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f  ng */.        go
221a0 74 6f 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65  to whereLoopInse
221b0 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d  rt_noop;.      }
221c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
221d0 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
221e0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
221f0 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
22200 71 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  q.     && p->rRu
22210 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n>=pTemplate->rR
22220 75 6e 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f  un.     && p->nO
22230 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  ut>=pTemplate->n
22240 4f 75 74 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Out.    ){.     
22250 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 61 6e   /* Overwrite an
22260 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
22270 6f 6f 70 20 77 69 74 68 20 61 20 62 65 74 74 65  oop with a bette
22280 72 20 6f 6e 65 3a 20 6f 6e 65 20 74 68 61 74 20  r one: one that 
22290 69 73 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74  is.      ** bett
222a0 65 72 20 61 74 20 6f 6e 65 20 6f 66 20 28 31 29  er at one of (1)
222b0 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 28   dependencies, (
222c0 32 29 20 73 65 74 75 70 2d 63 6f 73 74 2c 20 28  2) setup-cost, (
222d0 33 29 20 72 75 6e 2d 63 6f 73 74 0a 20 20 20 20  3) run-cost.    
222e0 20 20 2a 2a 20 6f 72 20 28 34 29 20 6e 75 6d 62    ** or (4) numb
222f0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
22300 73 2c 20 61 6e 64 20 69 73 20 6e 6f 20 77 6f 72  s, and is no wor
22310 73 65 20 69 6e 20 61 6e 79 20 6f 66 20 74 68 6f  se in any of tho
22320 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 74 65  se.      ** cate
22330 67 6f 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20  gories. */.     
22340 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74   assert( p->rSet
22350 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up>=pTemplate->r
22360 53 65 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55  Setup ); /* SETU
22370 50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76  P-INVARIANT abov
22380 65 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 78 74  e */.      pNext
22390 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b   = p->pNextLoop;
223a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
223b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
223c0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
223d0 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68  oint it means th
223e0 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68  at either p[] sh
223f0 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74  ould be overwrit
22400 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54  ten.  ** with pT
22410 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d  emplate[] if p[]
22420 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70   exists, or if p
22430 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f  ==NULL then allo
22440 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20  cate a new.  ** 
22450 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e  WhereLoop and in
22460 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  sert it..  */.#i
22470 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
22480 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
22490 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
224a0 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
224b0 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a      if( p!=0 ){.
224c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
224d0 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 64 65  ugPrintf("ins-de
224e0 6c 3a 20 20 22 29 3b 0a 20 20 20 20 20 20 77 68  l:  ");.      wh
224f0 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20  ereLoopPrint(p, 
22500 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
22510 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
22520 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e  3DebugPrintf("in
22530 73 2d 6e 65 77 3a 20 20 22 29 3b 0a 20 20 20 20  s-new:  ");.    
22540 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
22550 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64  Template, pBuild
22560 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65  er->pWC);.  }.#e
22570 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20  ndif.  if( p==0 
22580 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  ){.    p = sqlit
22590 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
225a0 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
225b0 6f 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  op));.    if( p=
225c0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
225d0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68  TE_NOMEM;.    wh
225e0 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a  ereLoopInit(p);.
225f0 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 58    }.  whereLoopX
22600 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d 70  fer(db, p, pTemp
22610 6c 61 74 65 29 3b 0a 20 20 70 2d 3e 70 4e 65 78  late);.  p->pNex
22620 74 4c 6f 6f 70 20 3d 20 70 4e 65 78 74 3b 0a 20  tLoop = pNext;. 
22630 20 2a 70 70 50 72 65 76 20 3d 20 70 3b 0a 20 20   *ppPrev = p;.  
22640 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
22650 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
22660 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
22670 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
22680 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
22690 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  x;.    if( pInde
226a0 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75  x && pIndex->tnu
226b0 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  m==0 ){.      p-
226c0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
226d0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
226e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
226f0 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
22700 72 65 20 69 66 20 74 68 65 20 69 6e 73 65 72 74  re if the insert
22710 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 77   is a no-op */.w
22720 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e  hereLoopInsert_n
22730 6f 6f 70 3a 0a 23 69 66 20 57 48 45 52 45 54 52  oop:.#if WHERETR
22740 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
22750 78 38 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  x8 */.  if( sqli
22760 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
22770 30 78 38 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  0x8 ){.    sqlit
22780 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69  e3DebugPrintf("i
22790 6e 73 2d 6e 6f 6f 70 3a 20 22 29 3b 0a 20 20 20  ns-noop: ");.   
227a0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
227b0 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c  pTemplate, pBuil
227c0 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23  der->pWC);.  }.#
227d0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
227e0 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f  QLITE_OK;  .}../
227f0 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
22800 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76  WhereLoop.nOut v
22810 61 6c 75 65 20 64 6f 77 6e 77 61 72 64 20 74 6f  alue downward to
22820 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 65 72   account for ter
22830 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45  ms of the.** WHE
22840 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 72  RE clause that r
22850 65 66 65 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f  eference the loo
22860 70 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20  p but which are 
22870 6e 6f 74 20 75 73 65 64 20 62 79 20 61 6e 0a 2a  not used by an.*
22880 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49  * index..**.** I
22890 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
228a0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68  plementation, th
228b0 65 20 66 69 72 73 74 20 65 78 74 72 61 20 57 48  e first extra WH
228c0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
228d0 72 65 64 75 63 65 73 0a 2a 2a 20 74 68 65 20 6e  reduces.** the n
228e0 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
228f0 72 6f 77 73 20 62 79 20 61 20 66 61 63 74 6f 72  rows by a factor
22900 20 6f 66 20 31 30 20 61 6e 64 20 65 61 63 68 20   of 10 and each 
22910 61 64 64 69 74 69 6f 6e 61 6c 20 74 65 72 6d 0a  additional term.
22920 2a 2a 20 72 65 64 75 63 65 73 20 74 68 65 20 6e  ** reduces the n
22930 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
22940 72 6f 77 73 20 62 79 20 73 71 72 74 28 32 29 2e  rows by sqrt(2).
22950 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22960 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
22970 64 6a 75 73 74 28 57 68 65 72 65 43 6c 61 75 73  djust(WhereClaus
22980 65 20 2a 70 57 43 2c 20 57 68 65 72 65 4c 6f 6f  e *pWC, WhereLoo
22990 70 20 2a 70 4c 6f 6f 70 29 7b 0a 20 20 57 68 65  p *pLoop){.  Whe
229a0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a  reTerm *pTerm, *
229b0 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f  pX;.  Bitmask no
229c0 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f  tAllowed = ~(pLo
229d0 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70  op->prereq|pLoop
229e0 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69  ->maskSelf);.  i
229f0 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 69 66 28 20  nt i, j;..  if( 
22a00 21 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61  !OptimizationEna
22a10 62 6c 65 64 28 70 57 43 2d 3e 70 57 49 6e 66 6f  bled(pWC->pWInfo
22a20 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  ->pParse->db, SQ
22a30 4c 49 54 45 5f 41 64 6a 75 73 74 4f 75 74 45 73  LITE_AdjustOutEs
22a40 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
22a50 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 57  ;.  }.  for(i=pW
22a60 43 2d 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d  C->nTerm, pTerm=
22a70 70 57 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  pWC->a; i>0; i--
22a80 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
22a90 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  if( (pTerm->wtFl
22aa0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
22ab0 41 4c 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a  AL)!=0 ) break;.
22ac0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
22ad0 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f  prereqAll & pLoo
22ae0 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20  p->maskSelf)==0 
22af0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22b00 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
22b10 65 71 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77  eqAll & notAllow
22b20 65 64 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ed)!=0 ) continu
22b30 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f  e;.    for(j=pLo
22b40 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e  op->nLTerm-1; j>
22b50 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; j--){.      
22b60 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  pX = pLoop->aLTe
22b70 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  rm[j];.      if(
22b80 20 70 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75   pX==0 ) continu
22b90 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  e;.      if( pX=
22ba0 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a  =pTerm ) break;.
22bb0 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 69 50        if( pX->iP
22bc0 61 72 65 6e 74 3e 3d 30 20 26 26 20 28 26 70 57  arent>=0 && (&pW
22bd0 43 2d 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74  C->a[pX->iParent
22be0 5d 29 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61  ])==pTerm ) brea
22bf0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
22c00 20 6a 3c 30 20 29 20 70 4c 6f 6f 70 2d 3e 6e 4f   j<0 ) pLoop->nO
22c10 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  ut += pTerm->tru
22c20 74 68 50 72 6f 62 3b 0a 20 20 7d 0a 7d 0a 0a 2f  thProb;.  }.}../
22c30 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20  *.** We have so 
22c40 66 61 72 20 6d 61 74 63 68 65 64 20 70 42 75 69  far matched pBui
22c50 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
22c60 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66  ree.nEq terms of
22c70 20 74 68 65 20 69 6e 64 65 78 20 70 49 6e 64 65   the index pInde
22c80 78 2e 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 61 74  x..** Try to mat
22c90 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a  ch one more..**.
22ca0 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74 6e  ** If pProbe->tn
22cb0 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e  um==0, that mean
22cc0 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66 61  s pIndex is a fa
22cd0 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66 6f  ke index used fo
22ce0 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52  r the.** INTEGER
22cf0 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f   PRIMARY KEY..*/
22d00 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
22d10 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
22d20 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  ex(.  WhereLoopB
22d30 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
22d40 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  ,     /* The Whe
22d50 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20 2a  reLoop factory *
22d60 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
22d70 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
22d80 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
22d90 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e  se term being an
22da0 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65  alyzed */.  Inde
22db0 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20 20  x *pProbe,      
22dc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
22dd0 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63 20  n index on pSrc 
22de0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e 4d  */.  LogEst nInM
22df0 75 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ul              
22e00 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62       /* log(Numb
22e10 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73  er of iterations
22e20 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a 29   due to IN) */.)
22e30 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
22e40 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
22e50 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57 48  ->pWInfo;  /* WH
22e60 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e 74  ERE analyse cont
22e70 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
22e80 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
22e90 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  >pParse;        
22ea0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
22eb0 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
22ec0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
22ed0 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
22ee0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  ase connection m
22ef0 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a 2f  alloc context */
22f00 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
22f10 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
22f20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57     /* Template W
22f30 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20 63  hereLoop under c
22f40 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
22f50 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
22f60 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
22f70 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20   /* A WhereTerm 
22f80 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61 74  under considerat
22f90 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d  ion */.  int opM
22fa0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
22fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69           /* Vali
22fc0 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20  d operators for 
22fd0 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
22fe0 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b   WhereScan scan;
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23000 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72   /* Iterator for
23010 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f 0a   WHERE terms */.
23020 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64 5f    Bitmask saved_
23030 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 20 20  prereq;         
23040 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
23050 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72 65  lue of pNew->pre
23060 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76  req */.  u16 sav
23070 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20  ed_nLTerm;      
23080 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
23090 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
230a0 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20  ew->nLTerm */.  
230b0 75 31 36 20 73 61 76 65 64 5f 6e 45 71 3b 20 20  u16 saved_nEq;  
230c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230d0 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
230e0 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72  e of pNew->u.btr
230f0 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 31 36 20  ee.nEq */.  u16 
23100 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20 20 20 20  saved_nSkip;    
23110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
23120 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
23130 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
23140 53 6b 69 70 20 2a 2f 0a 20 20 75 33 32 20 73 61  Skip */.  u32 sa
23150 76 65 64 5f 77 73 46 6c 61 67 73 3b 20 20 20 20  ved_wsFlags;    
23160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
23170 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
23180 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a  New->wsFlags */.
23190 20 20 4c 6f 67 45 73 74 20 73 61 76 65 64 5f 6e    LogEst saved_n
231a0 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
231b0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
231c0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75  lue of pNew->nOu
231d0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  t */.  int iCol;
231e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231f0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
23200 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  of the column in
23210 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
23220 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
23230 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
23240 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
23250 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45  /.  LogEst nRowE
23260 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
23270 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64      /* Estimated
23280 20 69 6e 64 65 78 20 73 65 6c 65 63 74 69 76 69   index selectivi
23290 74 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  ty */.  LogEst r
232a0 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20  LogSize;        
232b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72          /* Logar
232c0 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20 73 69  ithm of table si
232d0 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ze */.  WhereTer
232e0 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42  m *pTop = 0, *pB
232f0 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61  tm = 0; /* Top a
23300 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20  nd bottom range 
23310 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a  constraints */..
23320 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
23330 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20 64  r->pNew;.  if( d
23340 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
23350 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
23360 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74  NOMEM;..  assert
23370 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
23380 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
23390 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61  TABLE)==0 );.  a
233a0 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73  ssert( (pNew->ws
233b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
233c0 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20  P_LIMIT)==0 );. 
233d0 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61   if( pNew->wsFla
233e0 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
233f0 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61  IMIT ){.    opMa
23400 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  sk = WO_LT|WO_LE
23410 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
23420 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c 7c  robe->tnum<=0 ||
23430 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65   (pSrc->jointype
23440 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29   & JT_LEFT)!=0 )
23450 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57  {.    opMask = W
23460 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54  O_EQ|WO_IN|WO_GT
23470 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f  |WO_GE|WO_LT|WO_
23480 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LE;.  }else{.   
23490 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c   opMask = WO_EQ|
234a0 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 7c  WO_IN|WO_ISNULL|
234b0 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c  WO_GT|WO_GE|WO_L
234c0 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 0a 20 20 69  T|WO_LE;.  }.  i
234d0 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72  f( pProbe->bUnor
234e0 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b 20 26  dered ) opMask &
234f0 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  = ~(WO_GT|WO_GE|
23500 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20  WO_LT|WO_LE);.. 
23510 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75   assert( pNew->u
23520 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f  .btree.nEq<=pPro
23530 62 65 2d 3e 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20  be->nKeyCol );. 
23540 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72   if( pNew->u.btr
23550 65 65 2e 6e 45 71 20 3c 20 70 50 72 6f 62 65 2d  ee.nEq < pProbe-
23560 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20  >nKeyCol ){.    
23570 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61  iCol = pProbe->a
23580 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77 2d 3e 75 2e  iColumn[pNew->u.
23590 62 74 72 65 65 2e 6e 45 71 5d 3b 0a 20 20 20 20  btree.nEq];.    
235a0 6e 52 6f 77 45 73 74 20 3d 20 73 71 6c 69 74 65  nRowEst = sqlite
235b0 33 4c 6f 67 45 73 74 28 70 50 72 6f 62 65 2d 3e  3LogEst(pProbe->
235c0 61 69 52 6f 77 45 73 74 5b 70 4e 65 77 2d 3e 75  aiRowEst[pNew->u
235d0 2e 62 74 72 65 65 2e 6e 45 71 2b 31 5d 29 3b 0a  .btree.nEq+1]);.
235e0 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74 3d      if( nRowEst=
235f0 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e  =0 && pProbe->on
23600 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29  Error==OE_None )
23610 20 6e 52 6f 77 45 73 74 20 3d 20 31 3b 0a 20 20   nRowEst = 1;.  
23620 7d 65 6c 73 65 7b 0a 20 20 20 20 69 43 6f 6c 20  }else{.    iCol 
23630 3d 20 2d 31 3b 0a 20 20 20 20 6e 52 6f 77 45 73  = -1;.    nRowEs
23640 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 54 65  t = 0;.  }.  pTe
23650 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e  rm = whereScanIn
23660 69 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64  it(&scan, pBuild
23670 65 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69  er->pWC, pSrc->i
23680 43 75 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20  Cursor, iCol,.  
23690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236a0 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50        opMask, pP
236b0 72 6f 62 65 29 3b 0a 20 20 73 61 76 65 64 5f 6e  robe);.  saved_n
236c0 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72  Eq = pNew->u.btr
236d0 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f  ee.nEq;.  saved_
236e0 6e 53 6b 69 70 20 3d 20 70 4e 65 77 2d 3e 75 2e  nSkip = pNew->u.
236f0 62 74 72 65 65 2e 6e 53 6b 69 70 3b 0a 20 20 73  btree.nSkip;.  s
23700 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e  aved_nLTerm = pN
23710 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61  ew->nLTerm;.  sa
23720 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e  ved_wsFlags = pN
23730 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73  ew->wsFlags;.  s
23740 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e  aved_prereq = pN
23750 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61  ew->prereq;.  sa
23760 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d  ved_nOut = pNew-
23770 3e 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72  >nOut;.  pNew->r
23780 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 4c 6f  Setup = 0;.  rLo
23790 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 73  gSize = estLog(s
237a0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 50 72  qlite3LogEst(pPr
237b0 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  obe->aiRowEst[0]
237c0 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64  ));..  /* Consid
237d0 65 72 20 75 73 69 6e 67 20 61 20 73 6b 69 70 2d  er using a skip-
237e0 73 63 61 6e 20 69 66 20 74 68 65 72 65 20 61 72  scan if there ar
237f0 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
23800 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  e constraints.  
23810 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ** available for
23820 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74   the left-most t
23830 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65  erms of the inde
23840 78 2c 20 61 6e 64 20 69 66 20 74 68 65 20 61 76  x, and if the av
23850 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  erage.  ** numbe
23860 72 20 6f 66 20 72 65 70 65 61 74 73 20 69 6e 20  r of repeats in 
23870 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  the left-most te
23880 72 6d 73 20 69 73 20 61 74 20 6c 65 61 73 74 20  rms is at least 
23890 31 38 2e 20 20 54 68 65 20 6d 61 67 69 63 0a 20  18.  The magic. 
238a0 20 2a 2a 20 6e 75 6d 62 65 72 20 31 38 20 77 61   ** number 18 wa
238b0 73 20 66 6f 75 6e 64 20 62 79 20 65 78 70 65 72  s found by exper
238c0 69 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20 62 65  imentation to be
238d0 20 74 68 65 20 70 61 79 6f 66 66 20 70 6f 69 6e   the payoff poin
238e0 74 20 77 68 65 72 65 0a 20 20 2a 2a 20 73 6b 69  t where.  ** ski
238f0 70 2d 73 63 61 6e 20 62 65 63 6f 6d 65 20 66 61  p-scan become fa
23900 73 74 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c  ster than a full
23910 2d 73 63 61 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  -scan..  */.  if
23920 28 20 70 54 65 72 6d 3d 3d 30 0a 20 20 20 26 26  ( pTerm==0.   &&
23930 20 73 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65   saved_nEq==save
23940 64 5f 6e 53 6b 69 70 0a 20 20 20 26 26 20 73 61  d_nSkip.   && sa
23950 76 65 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65  ved_nEq+1<pProbe
23960 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20  ->nKeyCol.   && 
23970 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74  pProbe->aiRowEst
23980 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 31  [saved_nEq+1]>=1
23990 38 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69  8  /* TUNING: Mi
239a0 6e 69 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73  nimum for skip-s
239b0 63 61 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72 63  can */.   && (rc
239c0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69   = whereLoopResi
239d0 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  ze(db, pNew, pNe
239e0 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53  w->nLTerm+1))==S
239f0 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20  QLITE_OK.  ){.  
23a00 20 20 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a    LogEst nIter;.
23a10 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
23a20 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65  e.nEq++;.    pNe
23a30 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70  w->u.btree.nSkip
23a40 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c  ++;.    pNew->aL
23a50 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
23a60 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e  m++] = 0;.    pN
23a70 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
23a80 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20  HERE_SKIPSCAN;. 
23a90 20 20 20 6e 49 74 65 72 20 3d 20 73 71 6c 69 74     nIter = sqlit
23aa0 65 33 4c 6f 67 45 73 74 28 70 50 72 6f 62 65 2d  e3LogEst(pProbe-
23ab0 3e 61 69 52 6f 77 45 73 74 5b 30 5d 2f 70 50 72  >aiRowEst[0]/pPr
23ac0 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 73 61  obe->aiRowEst[sa
23ad0 76 65 64 5f 6e 45 71 2b 31 5d 29 3b 0a 20 20 20  ved_nEq+1]);.   
23ae0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
23af0 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72  eeIndex(pBuilder
23b00 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20  , pSrc, pProbe, 
23b10 6e 49 74 65 72 29 3b 0a 20 20 7d 0a 20 20 66 6f  nIter);.  }.  fo
23b20 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
23b30 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70  K && pTerm!=0; p
23b40 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e  Term = whereScan
23b50 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20  Next(&scan)){.  
23b60 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23    int nIn = 0;.#
23b70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
23b80 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
23b90 54 34 0a 20 20 20 20 69 6e 74 20 6e 52 65 63 56  T4.    int nRecV
23ba0 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d  alid = pBuilder-
23bb0 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64  >nRecValid;.#end
23bc0 69 66 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  if.    if( (pTer
23bd0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
23be0 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72  _ISNULL || (pTer
23bf0 6d 2d 3e 77 74 46 6c 61 67 73 26 54 45 52 4d 5f  m->wtFlags&TERM_
23c00 56 4e 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20  VNULL)!=0).     
23c10 26 26 20 28 69 43 6f 6c 3c 30 20 7c 7c 20 70 53  && (iCol<0 || pS
23c20 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  rc->pTab->aCol[i
23c30 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 29 0a 20 20  Col].notNull).  
23c40 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69    ){.      conti
23c50 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49  nue; /* ignore I
23c60 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e  S [NOT] NULL con
23c70 73 74 72 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20  straints on NOT 
23c80 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  NULL columns */.
23c90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
23ca0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
23cb0 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c   & pNew->maskSel
23cc0 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  f ) continue;.. 
23cd0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
23ce0 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75  >nOut==saved_nOu
23cf0 74 20 29 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e  t );..    pNew->
23d00 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
23d10 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65  wsFlags;.    pNe
23d20 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
23d30 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20   saved_nEq;.    
23d40 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73  pNew->nLTerm = s
23d50 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20  aved_nLTerm;.   
23d60 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
23d70 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70  size(db, pNew, p
23d80 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29  New->nLTerm+1) )
23d90 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a   break; /* OOM *
23da0 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65  /.    pNew->aLTe
23db0 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  rm[pNew->nLTerm+
23dc0 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  +] = pTerm;.    
23dd0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 28  pNew->prereq = (
23de0 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20 70  saved_prereq | p
23df0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
23e00 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b  t) & ~pNew->mask
23e10 53 65 6c 66 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Self;.    pNew->
23e20 72 52 75 6e 20 3d 20 72 4c 6f 67 53 69 7a 65 3b  rRun = rLogSize;
23e30 20 2f 2a 20 42 61 73 65 6c 69 6e 65 20 63 6f 73   /* Baseline cos
23e40 74 20 69 73 20 6c 6f 67 32 28 4e 29 2e 20 20 41  t is log2(N).  A
23e50 64 6a 75 73 74 6d 65 6e 74 73 20 62 65 6c 6f 77  djustments below
23e60 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72   */.    if( pTer
23e70 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
23e80 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  O_IN ){.      Ex
23e90 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
23ea0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
23eb0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
23ec0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
23ed0 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
23ee0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
23ef0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
23f00 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22   ){.        /* "
23f10 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
23f20 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68 65  )":  TUNING: the
23f30 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20   SELECT returns 
23f40 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  25 rows */.     
23f50 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73     nIn = 46;  as
23f60 73 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65  sert( 46==sqlite
23f70 33 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 20  3LogEst(25) );. 
23f80 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
23f90 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
23fa0 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78  List && pExpr->x
23fb0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  .pList->nExpr) )
23fc0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20  {.        /* "x 
23fd0 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65  IN (value, value
23fe0 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20  , ...)" */.     
23ff0 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33     nIn = sqlite3
24000 4c 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78 2e  LogEst(pExpr->x.
24010 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  pList->nExpr);. 
24020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
24030 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 3b 0a  w->rRun += nIn;.
24040 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
24050 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20  ree.nEq++;.     
24060 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52   pNew->nOut = nR
24070 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b  owEst + nInMul +
24080 20 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20   nIn;.    }else 
24090 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
240a0 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 29 20 29  ator & (WO_EQ) )
240b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 0a  {.      assert(.
240c0 20 20 20 20 20 20 20 20 28 70 4e 65 77 2d 3e 77          (pNew->w
240d0 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
240e0 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52  COLUMN_NULL|WHER
240f0 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52  E_COLUMN_IN|WHER
24100 45 5f 53 4b 49 50 53 43 41 4e 29 29 21 3d 30 0a  E_SKIPSCAN))!=0.
24110 20 20 20 20 20 20 20 20 7c 7c 20 6e 49 6e 4d 75          || nInMu
24120 6c 3d 3d 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  l==0.      );.  
24130 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
24140 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
24150 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20  N_EQ;.      if( 
24160 69 43 6f 6c 3c 30 20 20 0a 20 20 20 20 20 20 20  iCol<0  .       
24170 7c 7c 20 28 70 50 72 6f 62 65 2d 3e 6f 6e 45 72  || (pProbe->onEr
24180 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20  ror!=OE_None && 
24190 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20  nInMul==0.      
241a0 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e       && pNew->u.
241b0 62 74 72 65 65 2e 6e 45 71 3d 3d 70 50 72 6f 62  btree.nEq==pProb
241c0 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 0a 20 20  e->nKeyCol-1).  
241d0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 61      ){.        a
241e0 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73  ssert( (pNew->ws
241f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
24200 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20 7c 7c 20 69  LUMN_IN)==0 || i
24210 43 6f 6c 3c 30 20 29 3b 0a 20 20 20 20 20 20 20  Col<0 );.       
24220 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
24230 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a  = WHERE_ONEROW;.
24240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e        }.      pN
24250 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b  ew->u.btree.nEq+
24260 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  +;.      pNew->n
24270 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20  Out = nRowEst + 
24280 6e 49 6e 4d 75 6c 3b 0a 20 20 20 20 7d 65 6c 73  nInMul;.    }els
24290 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70  e if( pTerm->eOp
242a0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e  erator & (WO_ISN
242b0 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 70 4e  ULL) ){.      pN
242c0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
242d0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
242e0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
242f0 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20  btree.nEq++;.   
24300 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 53     /* TUNING: IS
24310 20 4e 55 4c 4c 20 73 65 6c 65 63 74 73 20 32 20   NULL selects 2 
24320 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 6e 49  rows */.      nI
24330 6e 20 3d 20 31 30 3b 20 20 61 73 73 65 72 74 28  n = 10;  assert(
24340 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   10==sqlite3LogE
24350 73 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20 70  st(2) );.      p
24360 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77  New->nOut = nRow
24370 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e  Est + nInMul + n
24380 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  In;.    }else if
24390 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
243a0 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47  or & (WO_GT|WO_G
243b0 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  E) ){.      test
243c0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
243d0 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 54 20 29  erator & WO_GT )
243e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
243f0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
24400 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20  or & WO_GE );.  
24410 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
24420 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
24430 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54  N_RANGE|WHERE_BT
24440 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70  M_LIMIT;.      p
24450 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  Btm = pTerm;.   
24460 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20     pTop = 0;.   
24470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
24480 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
24490 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c  erator & (WO_LT|
244a0 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20  WO_LE) );.      
244b0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
244c0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
244d0 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LT );.      test
244e0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
244f0 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29  erator & WO_LE )
24500 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
24510 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
24520 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
24530 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_TOP_LIMIT;.   
24540 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b     pTop = pTerm;
24550 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70  .      pBtm = (p
24560 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
24570 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21  HERE_BTM_LIMIT)!
24580 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  =0 ?.           
24590 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
245a0 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
245b0 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20  erm-2] : 0;.    
245c0 7d 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e  }.    if( pNew->
245d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
245e0 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a  COLUMN_RANGE ){.
245f0 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20        /* Adjust 
24600 6e 4f 75 74 20 61 6e 64 20 72 52 75 6e 20 66 6f  nOut and rRun fo
24610 72 20 53 54 41 54 33 20 72 61 6e 67 65 20 76 61  r STAT3 range va
24620 6c 75 65 73 20 2a 2f 0a 20 20 20 20 20 20 61 73  lues */.      as
24630 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74  sert( pNew->nOut
24640 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a  ==saved_nOut );.
24650 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65        whereRange
24660 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
24670 70 42 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20  pBuilder, pBtm, 
24680 70 54 6f 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20  pTop, pNew);.   
24690 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
246a0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
246b0 5f 53 54 41 54 34 0a 20 20 20 20 69 66 28 20 6e  _STAT4.    if( n
246c0 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20 20 20 26  InMul==0 .     &
246d0 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c  & pProbe->nSampl
246e0 65 20 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d  e .     && pNew-
246f0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50  >u.btree.nEq<=pP
24700 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  robe->nSampleCol
24710 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  .     && Optimiz
24720 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
24730 20 53 51 4c 49 54 45 5f 53 74 61 74 33 29 20 0a   SQLITE_Stat3) .
24740 20 20 20 20 29 7b 0a 20 20 20 20 20 20 45 78 70      ){.      Exp
24750 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
24760 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 74  ->pExpr;.      t
24770 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b  Rowcnt nOut = 0;
24780 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72  .      if( (pTer
24790 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
247a0 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29  WO_EQ|WO_ISNULL)
247b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
247c0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
247d0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
247e0 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  EQ );.        te
247f0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
24800 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
24810 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  NULL );.        
24820 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53  rc = whereEqualS
24830 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
24840 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e  Builder, pExpr->
24850 70 52 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a  pRight, &nOut);.
24860 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
24870 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
24880 72 20 26 20 57 4f 5f 49 4e 29 0a 20 20 20 20 20  r & WO_IN).     
24890 20 20 20 20 20 20 20 20 26 26 20 20 21 45 78 70          &&  !Exp
248a0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
248b0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
248c0 29 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  )  ){.        rc
248d0 20 3d 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73   = whereInScanEs
248e0 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
248f0 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  er, pExpr->x.pLi
24900 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20  st, &nOut);.    
24910 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
24920 28 20 6e 4f 75 74 3d 3d 30 20 7c 7c 20 72 63 3d  ( nOut==0 || rc=
24930 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
24940 20 20 20 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a      if( nOut ){.
24950 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
24960 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ut = sqlite3LogE
24970 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  st(nOut);.      
24980 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74    if( pNew->nOut
24990 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e  >saved_nOut ) pN
249a0 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
249b0 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _nOut;.      }. 
249c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
249d0 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  if( (pNew->wsFla
249e0 67 73 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f  gs & (WHERE_IDX_
249f0 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29  ONLY|WHERE_IPK))
24a00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
24a10 45 61 63 68 20 72 6f 77 20 69 6e 76 6f 6c 76 65  Each row involve
24a20 73 20 61 20 73 74 65 70 20 6f 66 20 74 68 65 20  s a step of the 
24a30 69 6e 64 65 78 2c 20 74 68 65 6e 20 61 20 62 69  index, then a bi
24a40 6e 61 72 79 20 73 65 61 72 63 68 20 6f 66 0a 20  nary search of. 
24a50 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e       ** the main
24a60 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
24a70 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 20 73 71  pNew->rRun =  sq
24a80 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
24a90 4e 65 77 2d 3e 72 52 75 6e 2c 72 4c 6f 67 53 69  New->rRun,rLogSi
24aa0 7a 65 3e 32 37 20 3f 20 72 4c 6f 67 53 69 7a 65  ze>27 ? rLogSize
24ab0 2d 31 37 20 3a 20 31 30 29 3b 0a 20 20 20 20 7d  -17 : 10);.    }
24ac0 0a 20 20 20 20 2f 2a 20 53 74 65 70 20 63 6f 73  .    /* Step cos
24ad0 74 20 66 6f 72 20 65 61 63 68 20 6f 75 74 70 75  t for each outpu
24ae0 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 70 4e 65  t row */.    pNe
24af0 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
24b00 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d  3LogEstAdd(pNew-
24b10 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75  >rRun, pNew->nOu
24b20 74 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f  t);.    whereLoo
24b30 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 42  pOutputAdjust(pB
24b40 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65  uilder->pWC, pNe
24b50 77 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65  w);.    rc = whe
24b60 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
24b70 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
24b80 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46    if( (pNew->wsF
24b90 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
24ba0 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20  _LIMIT)==0.     
24bb0 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  && pNew->u.btree
24bc0 2e 6e 45 71 3c 28 70 50 72 6f 62 65 2d 3e 6e 4b  .nEq<(pProbe->nK
24bd0 65 79 43 6f 6c 20 2b 20 28 70 50 72 6f 62 65 2d  eyCol + (pProbe-
24be0 3e 7a 4e 61 6d 65 21 3d 30 29 29 0a 20 20 20 20  >zName!=0)).    
24bf0 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  ){.      whereLo
24c00 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
24c10 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
24c20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e  pProbe, nInMul+n
24c30 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  In);.    }.    p
24c40 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
24c50 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20 53  d_nOut;.#ifdef S
24c60 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
24c70 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
24c80 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
24c90 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
24ca0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e  .#endif.  }.  pN
24cb0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76  ew->prereq = sav
24cc0 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65  ed_prereq;.  pNe
24cd0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
24ce0 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e   saved_nEq;.  pN
24cf0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  ew->u.btree.nSki
24d00 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b  p = saved_nSkip;
24d10 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  .  pNew->wsFlags
24d20 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73   = saved_wsFlags
24d30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d  ;.  pNew->nOut =
24d40 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70   saved_nOut;.  p
24d50 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61  New->nLTerm = sa
24d60 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 72 65  ved_nLTerm;.  re
24d70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
24d80 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 69 66  * Return True if
24d90 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
24da0 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68  that pIndex migh
24db0 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a  t be useful in.*
24dc0 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  * implementing t
24dd0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
24de0 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a  se in pBuilder..
24df0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c  **.** Return Fal
24e00 73 65 20 69 66 20 70 42 75 69 6c 64 65 72 20 64  se if pBuilder d
24e10 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
24e20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
24e30 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72  se or.** if ther
24e40 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20  e is no way for 
24e50 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65  pIndex to be use
24e60 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74  ful in implement
24e70 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45  ing that.** ORDE
24e80 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  R BY clause..*/.
24e90 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78  static int index
24ea0 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64  MightHelpWithOrd
24eb0 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f  erBy(.  WhereLoo
24ec0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
24ed0 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  er,.  Index *pIn
24ee0 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73  dex,.  int iCurs
24ef0 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  or.){.  ExprList
24f00 20 2a 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c   *pOB;.  int ii,
24f10 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64   jj;..  if( pInd
24f20 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
24f30 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
24f40 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72   (pOB = pBuilder
24f50 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ->pWInfo->pOrder
24f60 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  By)==0 ) return 
24f70 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  0;.  for(ii=0; i
24f80 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69  i<pOB->nExpr; ii
24f90 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
24fa0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
24fb0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
24fc0 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b  B->a[ii].pExpr);
24fd0 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
24fe0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
24ff0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
25000 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
25010 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
25020 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70    for(jj=0; jj<p
25030 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  Index->nKeyCol; 
25040 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  jj++){.        i
25050 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
25060 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  n==pIndex->aiCol
25070 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e  umn[jj] ) return
25080 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
25090 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
250a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
250b0 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72  n a bitmask wher
250c0 65 20 31 73 20 69 6e 64 69 63 61 74 65 20 74 68  e 1s indicate th
250d0 61 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  at the correspon
250e0 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  ding column of.*
250f0 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 75  * the table is u
25100 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e  sed by an index.
25110 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74    Only the first
25120 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20   63 columns are 
25130 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73  considered..*/.s
25140 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f  tatic Bitmask co
25150 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64  lumnsInIndex(Ind
25160 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74  ex *pIdx){.  Bit
25170 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e  mask m = 0;.  in
25180 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64  t j;.  for(j=pId
25190 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e  x->nColumn-1; j>
251a0 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e  =0; j--){.    in
251b0 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t x = pIdx->aiCo
251c0 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  lumn[j];.    if(
251d0 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74   x>=0 ){.      t
251e0 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d  estcase( x==BMS-
251f0 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
25200 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b  ase( x==BMS-2 );
25210 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53  .      if( x<BMS
25220 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49  -1 ) m |= MASKBI
25230 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T(x);.    }.  }.
25240 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f    return m;.}../
25250 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
25260 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65  f a partial inde
25270 78 20 77 69 74 68 20 70 50 61 72 74 49 6e 64 65  x with pPartInde
25280 78 57 68 65 72 65 20 63 61 6e 20 62 65 20 75 73  xWhere can be us
25290 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ed.** in the cur
252a0 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65 74  rent query.  Ret
252b0 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63  urn true if it c
252c0 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65 20  an be and false 
252d0 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  if not..*/.stati
252e0 63 20 69 6e 74 20 77 68 65 72 65 55 73 61 62 6c  c int whereUsabl
252f0 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69 6e  ePartialIndex(in
25300 74 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c 61  t iTab, WhereCla
25310 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
25320 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 69  pWhere){.  int i
25330 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
25340 54 65 72 6d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  Term;.  for(i=0,
25350 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
25360 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
25370 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
25380 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
25390 6d 70 6c 69 65 73 45 78 70 72 28 70 54 65 72 6d  mpliesExpr(pTerm
253a0 2d 3e 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c  ->pExpr, pWhere,
253b0 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
253c0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
253d0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
253e0 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
253f0 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67  jects for a sing
25400 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  le table of the 
25410 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20 74  join where the t
25420 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66  able.** is idenf
25430 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d  ied by pBuilder-
25440 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68  >pNew->iTab.  Th
25450 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72  at table is guar
25460 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20  anteed to be.** 
25470 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20  a b-tree table, 
25480 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
25490 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
254a0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  nt whereLoopAddB
254b0 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f  tree(.  WhereLoo
254c0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
254d0 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  er, /* WHERE cla
254e0 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  use information 
254f0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78  */.  Bitmask mEx
25500 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20  tra             
25510 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65 71   /* Extra prereq
25520 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e  uesites for usin
25530 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  g this table */.
25540 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
25550 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
25560 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
25570 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  is context */.  
25580 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20  Index *pProbe;  
25590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
255a0 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65  n index we are e
255b0 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49  valuating */.  I
255c0 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20  ndex sPk;       
255d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
255e0 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63  fake index objec
255f0 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72  t for the primar
25600 79 20 6b 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63  y key */.  tRowc
25610 6e 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d  nt aiRowEstPk[2]
25620 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69  ;      /* The ai
25630 52 6f 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66  RowEst[] value f
25640 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
25650 20 2a 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c 75   */.  i16 aiColu
25660 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20  mnPk = -1;      
25670 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e    /* The aColumn
25680 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
25690 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
256a0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
256b0 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
256c0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
256d0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
256e0 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20  st_item *pSrc;  
256f0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
25700 73 65 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f  se btree term to
25710 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c   add */.  WhereL
25720 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  oop *pNew;      
25730 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74        /* Templat
25740 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
25750 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ct */.  int rc =
25760 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
25770 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
25780 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72  de */.  int iSor
25790 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20  tIdx = 1;       
257a0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d      /* Index num
257b0 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20  ber */.  int b; 
257c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257d0 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61       /* A boolea
257e0 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67  n value */.  Log
257f0 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20  Est rSize;      
25800 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62           /* numb
25810 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
25820 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67  e table */.  Log
25830 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  Est rLogSize;   
25840 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61           /* Loga
25850 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d  rithm of the num
25860 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
25870 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68  he table */.  Wh
25880 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
25890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
258a0 20 70 61 72 73 65 64 20 57 48 45 52 45 20 63 6c   parsed WHERE cl
258b0 61 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  ause */.  Table 
258c0 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
258d0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
258e0 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a  eing queried */.
258f0 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69    .  pNew = pBui
25900 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57  lder->pNew;.  pW
25910 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
25920 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c  >pWInfo;.  pTabL
25930 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
25940 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20 3d  abList;.  pSrc =
25950 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70   pTabList->a + p
25960 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54 61  New->iTab;.  pTa
25970 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  b = pSrc->pTab;.
25980 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
25990 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65 72 74 28  ->pWC;.  assert(
259a0 20 21 49 73 56 69 72 74 75 61 6c 28 70 53 72 63   !IsVirtual(pSrc
259b0 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66  ->pTab) );..  if
259c0 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29  ( pSrc->pIndex )
259d0 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45  {.    /* An INDE
259e0 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 73 70  XED BY clause sp
259f0 65 63 69 66 69 65 73 20 61 20 70 61 72 74 69 63  ecifies a partic
25a00 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73  ular index to us
25a10 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65 20  e */.    pProbe 
25a20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a  = pSrc->pIndex;.
25a30 20 20 7d 65 6c 73 65 20 69 66 28 20 21 48 61 73    }else if( !Has
25a40 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
25a50 20 20 20 70 50 72 6f 62 65 20 3d 20 70 54 61 62     pProbe = pTab
25a60 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  ->pIndex;.  }els
25a70 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
25a80 69 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59  is no INDEXED BY
25a90 20 63 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65   clause.  Create
25aa0 20 61 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62   a fake Index ob
25ab0 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20  ject in local.  
25ac0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50    ** variable sP
25ad0 6b 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74  k to represent t
25ae0 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79  he rowid primary
25af0 20 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b   key index.  Mak
25b00 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61  e this.    ** fa
25b10 6b 65 20 69 6e 64 65 78 20 74 68 65 20 66 69 72  ke index the fir
25b20 73 74 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66  st in a chain of
25b30 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77   Index objects w
25b40 69 74 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72  ith all of the r
25b50 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63  eal.    ** indic
25b60 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a  es to follow */.
25b70 20 20 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73      Index *pFirs
25b80 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
25b90 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20      /* First of 
25ba0 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20  real indices on 
25bb0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
25bc0 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c   memset(&sPk, 0,
25bd0 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b   sizeof(Index));
25be0 0a 20 20 20 20 73 50 6b 2e 6e 4b 65 79 43 6f 6c  .    sPk.nKeyCol
25bf0 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69   = 1;.    sPk.ai
25c00 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75  Column = &aiColu
25c10 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69  mnPk;.    sPk.ai
25c20 52 6f 77 45 73 74 20 3d 20 61 69 52 6f 77 45 73  RowEst = aiRowEs
25c30 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45  tPk;.    sPk.onE
25c40 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63  rror = OE_Replac
25c50 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c  e;.    sPk.pTabl
25c60 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 61 69  e = pTab;.    ai
25c70 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54  RowEstPk[0] = pT
25c80 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 20  ab->nRowEst;.   
25c90 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d   aiRowEstPk[1] =
25ca0 20 31 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d   1;.    pFirst =
25cb0 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e   pSrc->pTab->pIn
25cc0 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72  dex;.    if( pSr
25cd0 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30  c->notIndexed==0
25ce0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
25cf0 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66   real indices of
25d00 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f   the table are o
25d10 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69  nly considered i
25d20 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e  f the.      ** N
25d30 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69  OT INDEXED quali
25d40 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20  fier is omitted 
25d50 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c  from the FROM cl
25d60 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50  ause */.      sP
25d70 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74  k.pNext = pFirst
25d80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f  ;.    }.    pPro
25d90 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a 20  be = &sPk;.  }. 
25da0 20 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33   rSize = sqlite3
25db0 4c 6f 67 45 73 74 28 70 54 61 62 2d 3e 6e 52 6f  LogEst(pTab->nRo
25dc0 77 45 73 74 29 3b 0a 20 20 72 4c 6f 67 53 69 7a  wEst);.  rLogSiz
25dd0 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65  e = estLog(rSize
25de0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
25df0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
25e00 43 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74  C_INDEX.  /* Aut
25e10 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a  omatic indexes *
25e20 2f 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64 65  /.  if( !pBuilde
25e30 72 2d 3e 70 4f 72 53 65 74 0a 20 20 20 26 26 20  r->pOrSet.   && 
25e40 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  (pWInfo->pParse-
25e50 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
25e60 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d  ITE_AutoIndex)!=
25e70 30 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70 49  0.   && pSrc->pI
25e80 6e 64 65 78 3d 3d 30 0a 20 20 20 26 26 20 21 70  ndex==0.   && !p
25e90 53 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e  Src->viaCoroutin
25ea0 65 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 6e  e.   && !pSrc->n
25eb0 6f 74 49 6e 64 65 78 65 64 0a 20 20 20 26 26 20  otIndexed.   && 
25ec0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20  HasRowid(pTab). 
25ed0 20 20 26 26 20 21 70 53 72 63 2d 3e 69 73 43 6f    && !pSrc->isCo
25ee0 72 72 65 6c 61 74 65 64 0a 20 20 29 7b 0a 20 20  rrelated.  ){.  
25ef0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75    /* Generate au
25f00 74 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f  to-index WhereLo
25f10 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  ops */.    Where
25f20 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20  Term *pTerm;.   
25f30 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45   WhereTerm *pWCE
25f40 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57  nd = pWC->a + pW
25f50 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f  C->nTerm;.    fo
25f60 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
25f70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
25f80 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
25f90 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Term++){.      i
25fa0 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
25fb0 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61  Right & pNew->ma
25fc0 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75  skSelf ) continu
25fd0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72  e;.      if( ter
25fe0 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
25ff0 54 65 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29  Term, pSrc, 0) )
26000 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
26010 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b  u.btree.nEq = 1;
26020 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
26030 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20 30  .btree.nSkip = 0
26040 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
26050 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
26060 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   0;.        pNew
26070 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
26080 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
26090 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  rm[0] = pTerm;. 
260a0 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
260b0 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20  : One-time cost 
260c0 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68  for computing th
260d0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
260e0 78 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  x is.        ** 
260f0 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 37 2a  approximately 7*
26100 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20  N*log2(N) where 
26110 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
26120 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20  of rows in.     
26130 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20     ** the table 
26140 62 65 69 6e 67 20 69 6e 64 65 78 65 64 2e 20 2a  being indexed. *
26150 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
26160 72 53 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a  rSetup = rLogSiz
26170 65 20 2b 20 72 53 69 7a 65 20 2b 20 32 38 3b 20  e + rSize + 28; 
26180 20 61 73 73 65 72 74 28 20 32 38 3d 3d 73 71 6c   assert( 28==sql
26190 69 74 65 33 4c 6f 67 45 73 74 28 37 29 20 29 3b  ite3LogEst(7) );
261a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  .        /* TUNI
261b0 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c  NG: Each index l
261c0 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30 20  ookup yields 20 
261d0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
261e0 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20 20  e.  This.       
261f0 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61 6e   ** is more than
26200 20 74 68 65 20 75 73 75 61 6c 20 67 75 65 73 73   the usual guess
26210 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69 6e   of 10 rows, sin
26220 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77 61  ce we have no wa
26230 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  y.        ** of 
26240 6b 6e 6f 77 6e 69 6e 67 20 68 6f 77 20 73 65 6c  knowning how sel
26250 65 63 74 69 76 65 20 74 68 65 20 69 6e 64 65 78  ective the index
26260 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79   will ultimately
26270 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20   be.  It would. 
26280 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65         ** not be
26290 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f   unreasonable to
262a0 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65   make this value
262b0 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f   much larger. */
262c0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
262d0 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72  Out = 43;  asser
262e0 74 28 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 43==sqlite3Lo
262f0 67 45 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20  gEst(20) );.    
26300 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
26310 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
26320 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d  d(rLogSize,pNew-
26330 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  >nOut);.        
26340 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
26350 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
26360 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
26370 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 20  prereq = mExtra 
26380 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  | pTerm->prereqR
26390 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63  ight;.        rc
263a0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
263b0 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
263c0 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
263d0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
263e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
263f0 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
26400 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61    /* Loop over a
26410 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a  ll indices.  */.
26420 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49    for(; rc==SQLI
26430 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b  TE_OK && pProbe;
26440 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e   pProbe=pProbe->
26450 70 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b  pNext, iSortIdx+
26460 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72 6f  +){.    if( pPro
26470 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  be->pPartIdxWher
26480 65 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77 68  e!=0.     && !wh
26490 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c  ereUsablePartial
264a0 49 6e 64 65 78 28 70 4e 65 77 2d 3e 69 54 61 62  Index(pNew->iTab
264b0 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e 70  , pWC, pProbe->p
264c0 50 61 72 74 49 64 78 57 68 65 72 65 29 20 29 7b  PartIdxWhere) ){
264d0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
264e0 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64    /* Partial ind
264f0 65 78 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65  ex inappropriate
26500 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 20   for this query 
26510 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  */.    }.    pNe
26520 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
26530 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e   0;.    pNew->u.
26540 62 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20 30 3b  btree.nSkip = 0;
26550 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  .    pNew->nLTer
26560 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  m = 0;.    pNew-
26570 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20  >iSortIdx = 0;. 
26580 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
26590 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  = 0;.    pNew->p
265a0 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a  rereq = mExtra;.
265b0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
265c0 20 72 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77   rSize;.    pNew
265d0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
265e0 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 62   = pProbe;.    b
265f0 20 3d 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c   = indexMightHel
26600 70 57 69 74 68 4f 72 64 65 72 42 79 28 70 42 75  pWithOrderBy(pBu
26610 69 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c 20 70  ilder, pProbe, p
26620 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  Src->iCursor);. 
26630 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53     /* The ONEPAS
26640 53 5f 44 45 53 49 52 45 44 20 66 6c 61 67 73 20  S_DESIRED flags 
26650 6e 65 76 65 72 20 6f 63 63 75 72 73 20 74 6f 67  never occurs tog
26660 65 74 68 65 72 20 77 69 74 68 20 4f 52 44 45 52  ether with ORDER
26670 20 42 59 20 2a 2f 0a 20 20 20 20 61 73 73 65 72   BY */.    asser
26680 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  t( (pWInfo->wctr
26690 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
266a0 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
266b0 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20  =0 || b==0 );.  
266c0 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e    if( pProbe->tn
266d0 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  um<=0 ){.      /
266e0 2a 20 49 6e 74 65 67 65 72 20 70 72 69 6d 61 72  * Integer primar
266f0 79 20 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20  y key index */. 
26700 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
26710 67 73 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a  gs = WHERE_IPK;.
26720 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74  .      /* Full t
26730 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20  able scan */.   
26740 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64     pNew->iSortId
26750 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78  x = b ? iSortIdx
26760 20 3a 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54   : 0;.      /* T
26770 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66  UNING: Cost of f
26780 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69  ull table scan i
26790 73 20 33 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29  s 3*(N + log2(N)
267a0 29 2e 0a 20 20 20 20 20 20 2a 2a 20 20 2b 20 20  )..      **  +  
267b0 54 68 65 20 65 78 74 72 61 20 33 20 66 61 63 74  The extra 3 fact
267c0 6f 72 20 69 73 20 74 6f 20 65 6e 63 6f 75 72 61  or is to encoura
267d0 67 65 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e  ge the use of in
267e0 64 65 78 65 64 20 6c 6f 6f 6b 75 70 73 0a 20 20  dexed lookups.  
267f0 20 20 20 20 2a 2a 20 20 20 20 20 6f 76 65 72 20      **     over 
26800 66 75 6c 6c 20 73 63 61 6e 73 2e 20 20 46 49 58  full scans.  FIX
26810 4d 45 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  ME */.      pNew
26820 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
26830 4c 6f 67 45 73 74 41 64 64 28 72 53 69 7a 65 2c  LogEstAdd(rSize,
26840 72 4c 6f 67 53 69 7a 65 29 20 2b 20 31 36 3b 0a  rLogSize) + 16;.
26850 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f        whereLoopO
26860 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c  utputAdjust(pWC,
26870 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 63   pNew);.      rc
26880 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
26890 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
268a0 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  w);.      pNew->
268b0 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20  nOut = rSize;.  
268c0 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
268d0 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
268e0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 0a       Bitmask m;.
268f0 20 20 20 20 20 20 69 66 28 20 70 50 72 6f 62 65        if( pProbe
26900 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 29 7b 0a  ->isCovering ){.
26910 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
26920 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 44  Flags = WHERE_ID
26930 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49  X_ONLY | WHERE_I
26940 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 20 20  NDEXED;.        
26950 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  m = 0;.      }el
26960 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20  se{.        m = 
26970 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
26980 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28  ~columnsInIndex(
26990 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 20  pProbe);.       
269a0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
269b0 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52 45   (m==0) ? (WHERE
269c0 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f  _IDX_ONLY|WHERE_
269d0 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52 45  INDEXED) : WHERE
269e0 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20  _INDEXED;.      
269f0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c  }..      /* Full
26a00 20 73 63 61 6e 20 76 69 61 20 69 6e 64 65 78 20   scan via index 
26a10 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 0a 20  */.      if( b. 
26a20 20 20 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77        || !HasRow
26a30 69 64 28 70 54 61 62 29 0a 20 20 20 20 20 20 20  id(pTab).       
26a40 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20  || ( m==0.      
26a50 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55     && pProbe->bU
26a60 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20  nordered==0.    
26a70 20 20 20 20 20 26 26 20 28 70 50 72 6f 62 65 2d       && (pProbe-
26a80 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e  >szIdxRow<pTab->
26a90 73 7a 54 61 62 52 6f 77 29 0a 20 20 20 20 20 20  szTabRow).      
26aa0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
26ab0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
26ac0 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
26ad0 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  D)==0.         &
26ae0 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
26af0 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20 20  onfig.bUseCis.  
26b00 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69         && Optimi
26b10 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57  zationEnabled(pW
26b20 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
26b30 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64  , SQLITE_CoverId
26b40 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20 20  xScan).         
26b50 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20   ).      ){.    
26b60 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
26b70 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64  dx = b ? iSortId
26b80 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 69  x : 0;.        i
26b90 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( m==0 ){.     
26ba0 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
26bb0 43 6f 73 74 20 6f 66 20 61 20 63 6f 76 65 72 69  Cost of a coveri
26bc0 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69 73  ng index scan is
26bd0 20 4b 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29   K*(N + log2(N))
26be0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  ..          **  
26bf0 2b 20 20 54 68 65 20 65 78 74 72 61 20 66 61 63  +  The extra fac
26c00 74 6f 72 20 4b 20 6f 66 20 62 65 74 77 65 65 6e  tor K of between
26c10 20 31 2e 31 20 61 6e 64 20 33 2e 30 20 74 68 61   1.1 and 3.0 tha
26c20 74 20 64 65 70 65 6e 64 73 0a 20 20 20 20 20 20  t depends.      
26c30 20 20 20 20 2a 2a 20 20 20 20 20 6f 6e 20 74 68      **     on th
26c40 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73  e relative sizes
26c50 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e   of the table an
26c60 64 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4b 0a  d the index.  K.
26c70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20            **    
26c80 20 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20   is smaller for 
26c90 73 6d 61 6c 6c 65 72 20 69 6e 64 69 63 65 73 2c  smaller indices,
26ca0 20 74 68 75 73 20 66 61 76 6f 72 69 6e 67 20 74   thus favoring t
26cb0 68 65 6d 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  hem..          *
26cc0 2f 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  /.          pNew
26cd0 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
26ce0 4c 6f 67 45 73 74 41 64 64 28 72 53 69 7a 65 2c  LogEstAdd(rSize,
26cf0 72 4c 6f 67 53 69 7a 65 29 20 2b 20 31 20 2b 0a  rLogSize) + 1 +.
26d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d10 20 20 20 20 20 20 20 20 28 31 35 2a 70 50 72 6f          (15*pPro
26d20 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54  be->szIdxRow)/pT
26d30 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20  ab->szTabRow;.  
26d40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26d50 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
26d60 3a 20 43 6f 73 74 20 6f 66 20 73 63 61 6e 6e 69  : Cost of scanni
26d70 6e 67 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  ng a non-coverin
26d80 67 20 69 6e 64 65 78 20 69 73 20 28 4e 2b 31 29  g index is (N+1)
26d90 2a 6c 6f 67 32 28 4e 29 0a 20 20 20 20 20 20 20  *log2(N).       
26da0 20 20 20 2a 2a 20 77 68 69 63 68 20 77 65 20 77     ** which we w
26db0 69 6c 6c 20 73 69 6d 70 6c 69 66 79 20 74 6f 20  ill simplify to 
26dc0 6a 75 73 74 20 4e 2a 6c 6f 67 32 28 4e 29 20 2a  just N*log2(N) *
26dd0 2f 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  /.          pNew
26de0 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b  ->rRun = rSize +
26df0 20 72 4c 6f 67 53 69 7a 65 3b 0a 20 20 20 20 20   rLogSize;.     
26e00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77 68 65     }.        whe
26e10 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
26e20 73 74 28 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20  st(pWC, pNew);. 
26e30 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
26e40 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
26e50 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
26e60 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
26e70 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  = rSize;.       
26e80 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
26e90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
26ea0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
26eb0 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
26ec0 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
26ed0 70 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64  pProbe, 0);.#ifd
26ee0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
26ef0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
26f00 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 34      sqlite3Stat4
26f10 50 72 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64  ProbeFree(pBuild
26f20 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70  er->pRec);.    p
26f30 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
26f40 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69  id = 0;.    pBui
26f50 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a  lder->pRec = 0;.
26f60 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
26f70 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49  f there was an I
26f80 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
26f90 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74  , then only that
26fa0 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20   one index is.  
26fb0 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e    ** considered.
26fc0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63   */.    if( pSrc
26fd0 2d 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b  ->pIndex ) break
26fe0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
26ff0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
27000 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
27010 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64  LTABLE./*.** Add
27020 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
27030 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62  bjects for a tab
27040 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69  le of the join i
27050 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20  dentified by.** 
27060 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
27070 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c  iTab.  That tabl
27080 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
27090 74 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20  to be a virtual 
270a0 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
270b0 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
270c0 64 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72  dVirtual(.  Wher
270d0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
270e0 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52  uilder,  /* WHER
270f0 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61  E clause informa
27100 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
27110 6b 20 6d 45 78 74 72 61 0a 29 7b 0a 20 20 57 68  k mExtra.){.  Wh
27120 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
27130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48             /* WH
27140 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e  ERE analysis con
27150 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
27160 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
27170 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
27180 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
27190 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
271a0 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  pWC;            
271b0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
271c0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
271d0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
271e0 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
271f0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
27200 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62   search */.  Tab
27210 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69  le *pTab;.  sqli
27220 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74  te3 *db;.  sqlit
27230 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
27240 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63  IdxInfo;.  struc
27250 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
27260 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78  constraint *pIdx
27270 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
27280 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
27290 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70  straint_usage *p
272a0 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65  Usage;.  WhereTe
272b0 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
272c0 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65   i, j;.  int iTe
272d0 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e  rm, mxTerm;.  in
272e0 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  t nConstraint;. 
272f0 20 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b   int seenIn = 0;
27300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27310 20 54 72 75 65 20 69 66 20 61 6e 20 49 4e 20 6f   True if an IN o
27320 70 65 72 61 74 6f 72 20 69 73 20 73 65 65 6e 20  perator is seen 
27330 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56 61 72  */.  int seenVar
27340 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
27350 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6e    /* True if a n
27360 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73  on-constant cons
27370 74 72 61 69 6e 74 20 69 73 20 73 65 65 6e 20 2a  traint is seen *
27380 2f 0a 20 20 69 6e 74 20 69 50 68 61 73 65 3b 20  /.  int iPhase; 
27390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273a0 20 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f   /* 0: const w/o
273b0 20 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32   IN, 1: const, 2
273c0 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20  : no IN,  2: IN 
273d0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
273e0 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pNew;.  int rc =
273f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70   SQLITE_OK;..  p
27400 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
27410 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72  ->pWInfo;.  pPar
27420 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
27430 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
27440 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20  se->db;.  pWC = 
27450 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
27460 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
27470 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d  ->pNew;.  pSrc =
27480 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69   &pWInfo->pTabLi
27490 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62  st->a[pNew->iTab
274a0 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  ];.  pTab = pSrc
274b0 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74  ->pTab;.  assert
274c0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
274d0 29 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20  ) );.  pIdxInfo 
274e0 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49  = allocateIndexI
274f0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c  nfo(pParse, pWC,
27500 20 70 53 72 63 2c 20 70 42 75 69 6c 64 65 72 2d   pSrc, pBuilder-
27510 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66  >pOrderBy);.  if
27520 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20  ( pIdxInfo==0 ) 
27530 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
27540 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65  MEM;.  pNew->pre
27550 72 65 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  req = 0;.  pNew-
27560 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70  >rSetup = 0;.  p
27570 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
27580 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
27590 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  E;.  pNew->nLTer
275a0 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75  m = 0;.  pNew->u
275b0 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
275c0 20 30 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70   0;.  pUsage = p
275d0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
275e0 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f  aintUsage;.  nCo
275f0 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49  nstraint = pIdxI
27600 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
27610 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f  ;.  if( whereLoo
27620 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77  pResize(db, pNew
27630 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29  , nConstraint) )
27640 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
27650 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f  ree(db, pIdxInfo
27660 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
27670 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
27680 0a 20 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b  .  for(iPhase=0;
27690 20 69 50 68 61 73 65 3c 3d 33 3b 20 69 50 68 61   iPhase<=3; iPha
276a0 73 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21  se++){.    if( !
276b0 73 65 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73  seenIn && (iPhas
276c0 65 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  e&1)!=0 ){.     
276d0 20 69 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20   iPhase++;.     
276e0 20 69 66 28 20 69 50 68 61 73 65 3e 33 20 29 20   if( iPhase>3 ) 
276f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
27700 20 69 66 28 20 21 73 65 65 6e 56 61 72 20 26 26   if( !seenVar &&
27710 20 69 50 68 61 73 65 3e 31 20 29 20 62 72 65 61   iPhase>1 ) brea
27720 6b 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20  k;.    pIdxCons 
27730 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
27740 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
27750 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
27760 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
27770 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
27780 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
27790 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e  nt; i++, pIdxCon
277a0 73 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20  s++){.      j = 
277b0 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f  pIdxCons->iTermO
277c0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65  ffset;.      pTe
277d0 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b  rm = &pWC->a[j];
277e0 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 69  .      switch( i
277f0 50 68 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20  Phase ){.       
27800 20 63 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43   case 0:    /* C
27810 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74  onstants without
27820 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
27830 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
27840 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a  ns->usable = 0;.
27850 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
27860 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
27870 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20  & WO_IN)!=0 ){. 
27880 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 49             seenI
27890 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
278a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
278b0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
278c0 67 68 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ght!=0 ){.      
278d0 20 20 20 20 20 20 73 65 65 6e 56 61 72 20 3d 20        seenVar = 
278e0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  1;.          }el
278f0 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  se if( (pTerm->e
27900 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
27910 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
27920 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
27930 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
27940 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
27950 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
27960 61 73 65 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e  ase 1:    /* Con
27970 73 74 61 6e 74 73 20 77 69 74 68 20 49 4e 20 6f  stants with IN o
27980 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20  perators */.    
27990 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
279a0 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  enIn );.        
279b0 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
279c0 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65  le = (pTerm->pre
279d0 72 65 71 52 69 67 68 74 3d 3d 30 29 3b 0a 20 20  reqRight==0);.  
279e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
279f0 20 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 20         case 2:  
27a00 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77    /* Variables w
27a10 69 74 68 6f 75 74 20 49 4e 20 2a 2f 0a 20 20 20  ithout IN */.   
27a20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
27a30 65 65 6e 56 61 72 20 29 3b 0a 20 20 20 20 20 20  eenVar );.      
27a40 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
27a50 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 65  able = (pTerm->e
27a60 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
27a70 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  )==0;.          
27a80 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64  break;.        d
27a90 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20 56 61 72  efault:   /* Var
27aa0 69 61 62 6c 65 73 20 77 69 74 68 20 49 4e 20 2a  iables with IN *
27ab0 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
27ac0 72 74 28 20 73 65 65 6e 56 61 72 20 26 26 20 73  rt( seenVar && s
27ad0 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20  eenIn );.       
27ae0 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
27af0 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ble = 1;.       
27b00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
27b10 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  }.    }.    mems
27b20 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69  et(pUsage, 0, si
27b30 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a  zeof(pUsage[0])*
27b40 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
27b50 72 61 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  raint);.    if( 
27b60 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
27b70 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c  FreeIdxStr ) sql
27b80 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
27b90 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20  fo->idxStr);.   
27ba0 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74   pIdxInfo->idxSt
27bb0 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  r = 0;.    pIdxI
27bc0 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b  nfo->idxNum = 0;
27bd0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  .    pIdxInfo->n
27be0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
27bf0 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
27c00 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
27c10 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  ed = 0;.    pIdx
27c20 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
27c30 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47  ost = SQLITE_BIG
27c40 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32  _DBL / (double)2
27c50 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
27c60 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20  estimatedRows = 
27c70 32 35 3b 0a 20 20 20 20 72 63 20 3d 20 76 74 61  25;.    rc = vta
27c80 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73  bBestIndex(pPars
27c90 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66  e, pTab, pIdxInf
27ca0 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
27cb0 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41   goto whereLoopA
27cc0 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20  ddVtab_exit;.   
27cd0 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74   pIdxCons = *(st
27ce0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
27cf0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
27d00 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
27d10 74 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77  traint;.    pNew
27d20 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72  ->prereq = mExtr
27d30 61 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20  a;.    mxTerm = 
27d40 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
27d50 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43  pNew->nLSlot>=nC
27d60 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 20  onstraint );.   
27d70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e   for(i=0; i<nCon
27d80 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e  straint; i++) pN
27d90 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20  ew->aLTerm[i] = 
27da0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  0;.    pNew->u.v
27db0 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30  tab.omitMask = 0
27dc0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
27dd0 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  <nConstraint; i+
27de0 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a  +, pIdxCons++){.
27df0 20 20 20 20 20 20 69 66 28 20 28 69 54 65 72 6d        if( (iTerm
27e00 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67   = pUsage[i].arg
27e10 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29  vIndex - 1)>=0 )
27e20 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49  {.        j = pI
27e30 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
27e40 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  set;.        if(
27e50 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61   iTerm>=nConstra
27e60 69 6e 74 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  int.         || 
27e70 6a 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  j<0.         || 
27e80 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20  j>=pWC->nTerm.  
27e90 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e         || pNew->
27ea0 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30  aLTerm[iTerm]!=0
27eb0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
27ec0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27ed0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
27ee0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
27ef0 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 2e 78  sg(pParse, "%s.x
27f00 42 65 73 74 49 6e 64 65 78 28 29 20 6d 61 6c 66  BestIndex() malf
27f10 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e  unction", pTab->
27f20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
27f30 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70    goto whereLoop
27f40 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20  AddVtab_exit;.  
27f50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27f60 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d  testcase( iTerm=
27f70 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29  =nConstraint-1 )
27f80 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
27f90 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20  se( j==0 );.    
27fa0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
27fb0 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b  =pWC->nTerm-1 );
27fc0 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
27fd0 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20   &pWC->a[j];.   
27fe0 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
27ff0 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  q |= pTerm->prer
28000 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  eqRight;.       
28010 20 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70   assert( iTerm<p
28020 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
28030 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
28040 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65  erm[iTerm] = pTe
28050 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rm;.        if( 
28060 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d  iTerm>mxTerm ) m
28070 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20  xTerm = iTerm;. 
28080 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
28090 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20   iTerm==15 );.  
280a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
280b0 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20  iTerm==16 );.   
280c0 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31       if( iTerm<1
280d0 36 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f  6 && pUsage[i].o
280e0 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74  mit ) pNew->u.vt
280f0 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31  ab.omitMask |= 1
28100 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  <<iTerm;.       
28110 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
28120 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21  erator & WO_IN)!
28130 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
28140 69 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d  if( pUsage[i].om
28150 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
28160 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61       /* Do not a
28170 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e  ttempt to use an
28180 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69   IN constraint i
28190 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
281a0 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
281b0 2a 2a 20 73 61 79 73 20 74 68 61 74 20 74 68 65  ** says that the
281c0 20 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63   equivalent EQ c
281d0 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74  onstraint cannot
281e0 20 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74   be safely omitt
281f0 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed..            
28200 2a 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74 65  ** If we do atte
28210 6d 70 74 20 74 6f 20 75 73 65 20 73 75 63 68 20  mpt to use such 
28220 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f  a constraint, so
28230 6d 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65  me rows might be
28240 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
28250 72 65 70 65 61 74 65 64 20 69 6e 20 74 68 65 20  repeated in the 
28260 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20  output. */.     
28270 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
28280 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28290 20 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c      /* A virtual
282a0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 63   table that is c
282b0 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e  onstrained by an
282c0 20 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e   IN clause may n
282d0 6f 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ot.          ** 
282e0 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45  consume the ORDE
282f0 52 20 42 59 20 63 6c 61 75 73 65 20 62 65 63 61  R BY clause beca
28300 75 73 65 20 28 31 29 20 74 68 65 20 6f 72 64 65  use (1) the orde
28310 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20  r of IN terms.  
28320 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
28330 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65  t necessarily re
28340 6c 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64  lated to the ord
28350 65 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72  er of output ter
28360 6d 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ms and.         
28370 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65   ** (2) Multiple
28380 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20   outputs from a 
28390 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20  single IN value 
283a0 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20  will not merge. 
283b0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65           ** toge
283c0 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ther.  */.      
283d0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72      pIdxInfo->or
283e0 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
283f0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
28400 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
28410 66 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e  f( i>=nConstrain
28420 74 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  t ){.      pNew-
28430 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d  >nLTerm = mxTerm
28440 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +1;.      assert
28450 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d  ( pNew->nLTerm<=
28460 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a  pNew->nLSlot );.
28470 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74        pNew->u.vt
28480 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78  ab.idxNum = pIdx
28490 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20  Info->idxNum;.  
284a0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
284b0 2e 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64 78  .needFree = pIdx
284c0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
284d0 49 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49  IdxStr;.      pI
284e0 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
284f0 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
28500 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
28510 2e 69 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e  .idxStr = pIdxIn
28520 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20  fo->idxStr;.    
28530 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
28540 73 4f 72 64 65 72 65 64 20 3d 20 28 75 38 29 28  sOrdered = (u8)(
28550 28 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65  (pIdxInfo->nOrde
28560 72 42 79 21 3d 30 29 0a 20 20 20 20 20 20 20 20  rBy!=0).        
28570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28580 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
28590 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
285a0 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 20 20  yConsumed);.    
285b0 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
285c0 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   0;.      pNew->
285d0 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
285e0 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70  gEstFromDouble(p
285f0 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
28600 65 64 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 70  edCost);.      p
28610 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69  New->nOut = sqli
28620 74 65 33 4c 6f 67 45 73 74 28 70 49 64 78 49 6e  te3LogEst(pIdxIn
28630 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
28640 73 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  s);.      whereL
28650 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
28660 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
28670 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61   if( pNew->u.vta
28680 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20  b.needFree ){.  
28690 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
286a0 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  ee(pNew->u.vtab.
286b0 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20  idxStr);.       
286c0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
286d0 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  edFree = 0;.    
286e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a    }.    }.  }  .
286f0 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61  .whereLoopAddVta
28700 62 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 70 49  b_exit:.  if( pI
28710 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
28720 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74  eeIdxStr ) sqlit
28730 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f  e3_free(pIdxInfo
28740 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c  ->idxStr);.  sql
28750 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
28760 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75  IdxInfo);.  retu
28770 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
28780 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
28790 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
287a0 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c  /*.** Add WhereL
287b0 6f 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68  oop entries to h
287c0 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20  andle OR terms. 
287d0 20 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20   This works for 
287e0 65 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73  either.** btrees
287f0 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c   or virtual tabl
28800 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
28810 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  t whereLoopAddOr
28820 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
28830 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 42 69 74  r *pBuilder, Bit
28840 6d 61 73 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20  mask mExtra){.  
28850 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
28860 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
28870 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61  Info;.  WhereCla
28880 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72  use *pWC;.  Wher
28890 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57  eLoop *pNew;.  W
288a0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
288b0 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20   *pWCEnd;.  int 
288c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
288d0 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68    int iCur;.  Wh
288e0 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43  ereClause tempWC
288f0 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  ;.  WhereLoopBui
28900 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a  lder sSubBuild;.
28910 20 20 57 68 65 72 65 4f 72 53 65 74 20 73 53 75    WhereOrSet sSu
28920 6d 2c 20 73 43 75 72 2c 20 73 50 72 65 76 3b 0a  m, sCur, sPrev;.
28930 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
28940 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
28950 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65  .  pWC = pBuilde
28960 72 2d 3e 70 57 43 3b 0a 20 20 69 66 28 20 70 57  r->pWC;.  if( pW
28970 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
28980 20 26 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c   & WHERE_AND_ONL
28990 59 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  Y ) return SQLIT
289a0 45 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e 64 20 3d  E_OK;.  pWCEnd =
289b0 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e   pWC->a + pWC->n
289c0 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70  Term;.  pNew = p
289d0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
289e0 20 6d 65 6d 73 65 74 28 26 73 53 75 6d 2c 20 30   memset(&sSum, 0
289f0 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b  , sizeof(sSum));
28a00 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66  .  pItem = pWInf
28a10 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b  o->pTabList->a +
28a20 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69   pNew->iTab;.  i
28a30 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 49 74  f( !HasRowid(pIt
28a40 65 6d 2d 3e 70 54 61 62 29 20 29 20 72 65 74 75  em->pTab) ) retu
28a50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
28a60 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43  iCur = pItem->iC
28a70 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54  ursor;..  for(pT
28a80 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
28a90 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d  m<pWCEnd && rc==
28aa0 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d  SQLITE_OK; pTerm
28ab0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54  ++){.    if( (pT
28ac0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
28ad0 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20   WO_OR)!=0.     
28ae0 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  && (pTerm->u.pOr
28af0 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
28b00 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  & pNew->maskSelf
28b10 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
28b20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
28b30 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26   const pOrWC = &
28b40 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
28b50 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72  ->wc;.      Wher
28b60 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f  eTerm * const pO
28b70 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d  rWCEnd = &pOrWC-
28b80 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d  >a[pOrWC->nTerm]
28b90 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
28ba0 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20  m *pOrTerm;.    
28bb0 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a    int once = 1;.
28bc0 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
28bd0 20 20 20 20 0a 20 20 20 20 20 20 73 53 75 62 42      .      sSubB
28be0 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65 72  uild = *pBuilder
28bf0 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c  ;.      sSubBuil
28c00 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  d.pOrderBy = 0;.
28c10 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
28c20 70 4f 72 53 65 74 20 3d 20 26 73 43 75 72 3b 0a  pOrSet = &sCur;.
28c30 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65  .      for(pOrTe
28c40 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72  rm=pOrWC->a; pOr
28c50 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70  Term<pOrWCEnd; p
28c60 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
28c70 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
28c80 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
28c90 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  AND)!=0 ){.     
28ca0 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
28cb0 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75  WC = &pOrTerm->u
28cc0 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20  .pAndInfo->wc;. 
28cd0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
28ce0 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
28cf0 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20  rsor==iCur ){.  
28d00 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
28d10 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49  WInfo = pWC->pWI
28d20 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 74  nfo;.          t
28d30 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70  empWC.pOuter = p
28d40 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  WC;.          te
28d50 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  mpWC.op = TK_AND
28d60 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
28d70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20  WC.nTerm = 1;.  
28d80 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61          tempWC.a
28d90 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20   = pOrTerm;.    
28da0 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
28db0 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20  pWC = &tempWC;. 
28dc0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
28dd0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
28de0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28df0 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a      sCur.n = 0;.
28e00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28e10 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
28e20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56  .        if( IsV
28e30 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54  irtual(pItem->pT
28e40 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
28e50 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
28e60 64 64 56 69 72 74 75 61 6c 28 26 73 53 75 62 42  ddVirtual(&sSubB
28e70 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20  uild, mExtra);. 
28e80 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
28e90 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  dif.        {.  
28ea0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
28eb0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26  reLoopAddBtree(&
28ec0 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72  sSubBuild, mExtr
28ed0 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  a);.        }.  
28ee0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
28ef0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  ==SQLITE_OK || s
28f00 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  Cur.n==0 );.    
28f10 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d      if( sCur.n==
28f20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
28f30 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  Sum.n = 0;.     
28f40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
28f50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
28f60 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ce ){.          
28f70 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75  whereOrMove(&sSu
28f80 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20  m, &sCur);.     
28f90 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20       once = 0;. 
28fa0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
28fb0 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d          whereOrM
28fc0 6f 76 65 28 26 73 50 72 65 76 2c 20 26 73 53 75  ove(&sPrev, &sSu
28fd0 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53  m);.          sS
28fe0 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  um.n = 0;.      
28ff0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
29000 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Prev.n; i++){.  
29010 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
29020 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b  0; j<sCur.n; j++
29030 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
29040 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26   whereOrInsert(&
29050 73 53 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d  sSum, sPrev.a[i]
29060 2e 70 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61  .prereq | sCur.a
29070 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20  [j].prereq,.    
29080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29090 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c          sqlite3L
290a0 6f 67 45 73 74 41 64 64 28 73 50 72 65 76 2e 61  ogEstAdd(sPrev.a
290b0 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61  [i].rRun, sCur.a
290c0 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20  [j].rRun),.     
290d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
290f0 67 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b  gEstAdd(sPrev.a[
29100 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b  i].nOut, sCur.a[
29110 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20  j].nOut));.     
29120 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29130 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
29140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
29150 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20  w->nLTerm = 1;. 
29160 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
29170 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[0] = pTerm;.  
29180 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
29190 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s = WHERE_MULTI_
291a0 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  OR;.      pNew->
291b0 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20  rSetup = 0;.    
291c0 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78    pNew->iSortIdx
291d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73   = 0;.      mems
291e0 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20  et(&pNew->u, 0, 
291f0 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29  sizeof(pNew->u))
29200 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
29210 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
29220 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29  & i<sSum.n; i++)
29230 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e  {.        /* TUN
29240 49 4e 47 3a 20 4d 75 6c 74 69 70 6c 65 20 62 79  ING: Multiple by
29250 20 33 2e 35 20 66 6f 72 20 74 68 65 20 73 65 63   3.5 for the sec
29260 6f 6e 64 61 72 79 20 74 61 62 6c 65 20 6c 6f 6f  ondary table loo
29270 6b 75 70 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  kup */.        p
29280 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d  New->rRun = sSum
29290 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 38 3b  .a[i].rRun + 18;
292a0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
292b0 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e  Out = sSum.a[i].
292c0 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e  nOut;.        pN
292d0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75  ew->prereq = sSu
292e0 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20  m.a[i].prereq;. 
292f0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
29300 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
29310 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
29320 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
29330 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
29340 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65  *.** Add all Whe
29350 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66  reLoop objects f
29360 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a  or all tables .*
29370 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
29380 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65  reLoopAddAll(Whe
29390 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
293a0 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72  Builder){.  Wher
293b0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
293c0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
293d0 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74  ;.  Bitmask mExt
293e0 72 61 20 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73  ra = 0;.  Bitmas
293f0 6b 20 6d 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  k mPrior = 0;.  
29400 69 6e 74 20 69 54 61 62 3b 0a 20 20 53 72 63 4c  int iTab;.  SrcL
29410 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
29420 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
29430 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
29440 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
29450 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
29460 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
29470 64 62 3b 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69  db;.  int nTabLi
29480 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  st = pWInfo->nLe
29490 76 65 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  vel;.  int rc = 
294a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20  SQLITE_OK;.  u8 
294b0 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20  priorJoinType = 
294c0 30 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  0;.  WhereLoop *
294d0 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  pNew;..  /* Loop
294e0 20 6f 76 65 72 20 74 68 65 20 74 61 62 6c 65 73   over the tables
294f0 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72   in the join, fr
29500 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
29510 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75   */.  pNew = pBu
29520 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77  ilder->pNew;.  w
29530 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65  hereLoopInit(pNe
29540 77 29 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30  w);.  for(iTab=0
29550 2c 20 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74  , pItem=pTabList
29560 2d 3e 61 3b 20 69 54 61 62 3c 6e 54 61 62 4c 69  ->a; iTab<nTabLi
29570 73 74 3b 20 69 54 61 62 2b 2b 2c 20 70 49 74 65  st; iTab++, pIte
29580 6d 2b 2b 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  m++){.    pNew->
29590 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20  iTab = iTab;.   
295a0 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
295b0 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  = getMask(&pWInf
295c0 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49 74  o->sMaskSet, pIt
295d0 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
295e0 20 20 69 66 28 20 28 28 70 49 74 65 6d 2d 3e 6a    if( ((pItem->j
295f0 6f 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69  ointype|priorJoi
29600 6e 54 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46  nType) & (JT_LEF
29610 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20  T|JT_CROSS))!=0 
29620 29 7b 0a 20 20 20 20 20 20 6d 45 78 74 72 61 20  ){.      mExtra 
29630 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a  = mPrior;.    }.
29640 20 20 20 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70      priorJoinTyp
29650 65 20 3d 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74  e = pItem->joint
29660 79 70 65 3b 0a 20 20 20 20 69 66 28 20 49 73 56  ype;.    if( IsV
29670 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54  irtual(pItem->pT
29680 61 62 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ab) ){.      rc 
29690 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
296a0 72 74 75 61 6c 28 70 42 75 69 6c 64 65 72 2c 20  rtual(pBuilder, 
296b0 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 65 6c  mExtra);.    }el
296c0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  se{.      rc = w
296d0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
296e0 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72  (pBuilder, mExtr
296f0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  a);.    }.    if
29700 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29710 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  ){.      rc = wh
29720 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75  ereLoopAddOr(pBu
29730 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a  ilder, mExtra);.
29740 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72      }.    mPrior
29750 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65   |= pNew->maskSe
29760 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c  lf;.    if( rc |
29770 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
29780 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ed ) break;.  }.
29790 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
297a0 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65  (db, pNew);.  re
297b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
297c0 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72  * Examine a Wher
297d0 65 50 61 74 68 20 28 77 69 74 68 20 74 68 65 20  ePath (with the 
297e0 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  addition of the 
297f0 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20  extra WhereLoop 
29800 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a 20 70 61  of the 5th.** pa
29810 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65  rameters) to see
29820 20 69 66 20 69 74 20 6f 75 74 70 75 74 73 20 72   if it outputs r
29830 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75 65  ows in the reque
29840 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a  sted ORDER BY.**
29850 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77   (or GROUP BY) w
29860 69 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67  ithout requiring
29870 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74   a separate sort
29880 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74   operation.  Ret
29890 75 72 6e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 30  urn:.** .**    0
298a0 3a 20 20 4f 52 44 45 52 20 42 59 20 69 73 20 6e  :  ORDER BY is n
298b0 6f 74 20 73 61 74 69 73 66 69 65 64 2e 20 20 53  ot satisfied.  S
298c0 6f 72 74 69 6e 67 20 72 65 71 75 69 72 65 64 0a  orting required.
298d0 2a 2a 20 20 20 20 31 3a 20 20 4f 52 44 45 52 20  **    1:  ORDER 
298e0 42 59 20 69 73 20 73 61 74 69 73 66 69 65 64 2e  BY is satisfied.
298f0 20 20 20 20 20 20 4f 6d 69 74 20 73 6f 72 74 69        Omit sorti
29900 6e 67 0a 2a 2a 20 20 20 2d 31 3a 20 20 55 6e 6b  ng.**   -1:  Unk
29910 6e 6f 77 6e 20 61 74 20 74 68 69 73 20 74 69 6d  nown at this tim
29920 65 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  e.**.** Note tha
29930 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  t processing for
29940 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61   WHERE_GROUPBY a
29950 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  nd WHERE_DISTINC
29960 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a  TBY is not as.**
29970 20 73 74 72 69 63 74 2e 20 20 57 69 74 68 20 47   strict.  With G
29980 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
29990 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65  INCT the only re
299a0 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61  quirement is tha
299b0 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20  t.** equivalent 
299c0 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65  rows appear imme
299d0 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74  diately adjacent
299e0 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e   to one another.
299f0 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e    GROUP BY.** an
29a00 64 20 44 49 53 54 49 4e 54 20 64 6f 20 6e 6f 74  d DISTINT do not
29a10 20 72 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f   require rows to
29a20 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70   appear in any p
29a30 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20  articular order 
29a40 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71  as long.** as eq
29a50 75 69 76 65 6c 65 6e 74 20 72 6f 77 73 20 61 72  uivelent rows ar
29a60 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68  e grouped togeth
29a70 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52  er.  Thus for GR
29a80 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49  OUP BY and DISTI
29a90 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65  NCT.** the pOrde
29aa0 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65  rBy terms can be
29ab0 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20   matched in any 
29ac0 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44  order.  With ORD
29ad0 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70  ER BY, the .** p
29ae0 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75  OrderBy terms mu
29af0 73 74 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e  st be matched in
29b00 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d   strict left-to-
29b10 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a  right order..*/.
29b20 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
29b30 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
29b40 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66  erBy(.  WhereInf
29b50 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a  o *pWInfo,    /*
29b60 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
29b70 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
29b80 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
29b90 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
29ba0 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54  P BY or DISTINCT
29bb0 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b   clause to check
29bc0 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
29bd0 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54  *pPath,     /* T
29be0 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f 20  he WherePath to 
29bf0 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77  check */.  u16 w
29c00 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
29c10 20 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69   /* Might contai
29c20 6e 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  n WHERE_GROUPBY 
29c30 6f 72 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  or WHERE_DISTINC
29c40 54 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f  TBY */.  u16 nLo
29c50 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  op,            /
29c60 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
29c70 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c  ies in pPath->aL
29c80 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  oop[] */.  Where
29c90 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20  Loop *pLast,    
29ca0 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68 65   /* Add this Whe
29cb0 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e  reLoop to the en
29cc0 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  d of pPath->aLoo
29cd0 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  p[] */.  Bitmask
29ce0 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f   *pRevMask     /
29cf0 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57  * OUT: Mask of W
29d00 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e  hereLoops to run
29d10 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
29d20 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76  r */.){.  u8 rev
29d30 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Set;            
29d40 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76 20 69  /* True if rev i
29d50 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20  s known */.  u8 
29d60 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
29d70 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20     /* Composite 
29d80 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20  sort order */.  
29d90 75 38 20 72 65 76 49 64 78 3b 20 20 20 20 20 20  u8 revIdx;      
29da0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
29db0 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75  ort order */.  u
29dc0 38 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  8 isOrderDistinc
29dd0 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f  t;   /* All prio
29de0 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65  r WhereLoops are
29df0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20   order-distinct 
29e00 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74  */.  u8 distinct
29e10 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72  Columns;   /* Tr
29e20 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68  ue if the loop h
29e30 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55  as UNIQUE NOT NU
29e40 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  LL columns */.  
29e50 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20  u8 isMatch;     
29e60 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e        /* iColumn
29e70 20 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d 20   matches a term 
29e80 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
29e90 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20  clause */.  u16 
29ea0 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20  nKeyCol;        
29eb0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b    /* Number of k
29ec0 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49  ey columns in pI
29ed0 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43  ndex */.  u16 nC
29ee0 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
29ef0 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
29f00 6f 66 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d  of ordered colum
29f10 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
29f20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42  */.  u16 nOrderB
29f30 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
29f40 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68  mber terms in th
29f50 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
29f60 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70  e */.  int iLoop
29f70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
29f80 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f  Index of WhereLo
29f90 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e  op in pPath bein
29fa0 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  g processed */. 
29fb0 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
29fc0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
29fd0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
29fe0 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
29ff0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
2a000 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20  ber for current 
2a010 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69  WhereLoop */.  i
2a020 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  nt iColumn;     
2a030 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e       /* A column
2a040 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74   number within t
2a050 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57  able iCur */.  W
2a060 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
2a070 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  = 0; /* Current 
2a080 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20  WhereLoop being 
2a090 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20  processed. */.  
2a0a0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
2a0b0 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c  ;     /* A singl
2a0c0 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
2a0d0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
2a0e0 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20  Expr *pOBExpr;  
2a0f0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72        /* An expr
2a100 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  ession from the 
2a110 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2a120 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  */.  CollSeq *pC
2a130 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f  oll;       /* CO
2a140 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66  LLATE function f
2a150 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20  rom an ORDER BY 
2a160 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20  clause term */. 
2a170 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
2a180 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
2a190 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
2a1a0 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73  ith pLoop */.  s
2a1b0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
2a1c0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
2a1d0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
2a1e0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  nnection */.  Bi
2a1f0 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b  tmask obSat = 0;
2a200 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f      /* Mask of O
2a210 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73 61  RDER BY terms sa
2a220 74 69 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a  tisfied so far *
2a230 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f  /.  Bitmask obDo
2a240 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  ne;       /* Mas
2a250 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42  k of all ORDER B
2a260 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74  Y terms */.  Bit
2a270 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e  mask orderDistin
2a280 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b  ctMask;  /* Mask
2a290 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64   of all well-ord
2a2a0 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20  ered loops */.  
2a2b0 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20  Bitmask ready;  
2a2c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2a2d0 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f  ask of inner loo
2a2e0 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ps */..  /*.  **
2a2f0 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72   We say the Wher
2a300 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f  eLoop is "one-ro
2a310 77 22 20 69 66 20 69 74 20 67 65 6e 65 72 61 74  w" if it generat
2a320 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  es no more than 
2a330 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  one.  ** row of 
2a340 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65 72 65  output.  A Where
2a350 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20  Loop is one-row 
2a360 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
2a370 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
2a380 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20  :.  **  (a) All 
2a390 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61  index columns ma
2a3a0 74 63 68 20 77 69 74 68 20 57 48 45 52 45 5f 43  tch with WHERE_C
2a3b0 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20  OLUMN_EQ..  **  
2a3c0 28 62 29 20 54 68 65 20 69 6e 64 65 78 20 69 73  (b) The index is
2a3d0 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79   unique.  ** Any
2a3e0 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20   WhereLoop with 
2a3f0 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  an WHERE_COLUMN_
2a400 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  EQ constraint on
2a410 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e   the rowid is on
2a420 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72  e-row..  ** Ever
2a430 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c  y one-row WhereL
2a440 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68  oop will have th
2a450 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62  e WHERE_ONEROW b
2a460 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67  it set in wsFlag
2a470 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  s..  **.  ** We 
2a480 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  say the WhereLoo
2a490 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74  p is "order-dist
2a4a0 69 6e 63 74 22 20 69 66 20 74 68 65 20 73 65 74  inct" if the set
2a4b0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d   of columns from
2a4c0 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65  .  ** that Where
2a4d0 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e  Loop that are in
2a4e0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2a4f0 61 75 73 65 20 61 72 65 20 64 69 66 66 65 72 65  ause are differe
2a500 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a  nt for every.  *
2a510 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65  * row of the Whe
2a520 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f  reLoop.  Every o
2a530 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70  ne-row WhereLoop
2a540 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
2a550 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73  y.  ** order-dis
2a560 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65  tinct.   A Where
2a570 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f  Loop that has no
2a580 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
2a590 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
2a5a0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65    ** is not orde
2a5b0 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62  r-distinct. To b
2a5c0 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
2a5d0 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68   is not quite th
2a5e0 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a  e same as being.
2a5f0 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63    ** UNIQUE sinc
2a600 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d  e a UNIQUE colum
2a610 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68  n or index can h
2a620 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  ave multiple row
2a630 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65  s that .  ** are
2a640 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76   NULL and NULL v
2a650 61 6c 75 65 73 20 61 72 65 20 65 71 75 69 76 61  alues are equiva
2a660 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72  lent for the pur
2a670 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69  pose of order-di
2a680 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20  stinct..  ** To 
2a690 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  be order-distinc
2a6a0 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d  t, the columns m
2a6b0 75 73 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e  ust be UNIQUE an
2a6c0 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a  d NOT NULL..  **
2a6d0 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20  .  ** The rowid 
2a6e0 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20 61  for a table is a
2a6f0 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64  lways UNIQUE and
2a700 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65   NOT NULL so whe
2a710 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72  never the.  ** r
2a720 6f 77 69 64 20 61 70 70 65 61 72 73 20 69 6e 20  owid appears in 
2a730 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2a740 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  use, the corresp
2a750 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  onding WhereLoop
2a760 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74   is.  ** automat
2a770 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73  ically order-dis
2a780 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61  tinct..  */..  a
2a790 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21  ssert( pOrderBy!
2a7a0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 6f 72 74  =0 );..  /* Sort
2a7b0 61 62 69 6c 69 74 79 20 6f 66 20 76 69 72 74 75  ability of virtu
2a7c0 61 6c 20 74 61 62 6c 65 73 20 69 73 20 64 65 74  al tables is det
2a7d0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 78  ermined by the x
2a7e0 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
2a7f0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 76 69 72  .  ** of the vir
2a800 74 75 61 6c 20 74 61 62 6c 65 20 69 74 73 65 6c  tual table itsel
2a810 66 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74  f */.  if( pLast
2a820 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2a830 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29  E_VIRTUALTABLE )
2a840 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
2a850 6e 4c 6f 6f 70 3e 30 20 29 3b 20 20 2f 2a 20 54  nLoop>0 );  /* T
2a860 72 75 65 20 77 68 65 6e 20 6f 75 74 65 72 20 6c  rue when outer l
2a870 6f 6f 70 73 20 61 72 65 20 6f 6e 65 2d 72 6f 77  oops are one-row
2a880 20 61 6e 64 20 6d 61 74 63 68 20 0a 20 20 20 20   and match .    
2a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8a0 20 20 20 20 20 20 2a 2a 20 6e 6f 20 4f 52 44 45        ** no ORDE
2a8b0 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20  R BY terms */.  
2a8c0 20 20 72 65 74 75 72 6e 20 70 4c 61 73 74 2d 3e    return pLast->
2a8d0 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64  u.vtab.isOrdered
2a8e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 6f  ;.  }.  if( nLoo
2a8f0 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f  p && Optimizatio
2a900 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
2a910 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a  LITE_OrderByIdxJ
2a920 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b  oin) ) return 0;
2a930 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ..  nOrderBy = p
2a940 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
2a950 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64    testcase( nOrd
2a960 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  erBy==BMS-1 );. 
2a970 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d   if( nOrderBy>BM
2a980 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  S-1 ) return 0; 
2a990 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d   /* Cannot optim
2a9a0 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65  ize overly large
2a9b0 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20   ORDER BYs */.  
2a9c0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2a9d0 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20  = 1;.  obDone = 
2a9e0 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79  MASKBIT(nOrderBy
2a9f0 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74  )-1;.  orderDist
2aa00 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  inctMask = 0;.  
2aa10 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72  ready = 0;.  for
2aa20 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65  (iLoop=0; isOrde
2aa30 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53  rDistinct && obS
2aa40 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f  at<obDone && iLo
2aa50 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70  op<=nLoop; iLoop
2aa60 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f  ++){.    if( iLo
2aa70 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20  op>0 ) ready |= 
2aa80 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  pLoop->maskSelf;
2aa90 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f  .    pLoop = iLo
2aaa0 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68  op<nLoop ? pPath
2aab0 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a  ->aLoop[iLoop] :
2aac0 20 70 4c 61 73 74 3b 0a 20 20 20 20 61 73 73 65   pLast;.    asse
2aad0 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
2aae0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
2aaf0 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a  UALTABLE)==0 );.
2ab00 20 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66      iCur = pWInf
2ab10 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
2ab20 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72  Loop->iTab].iCur
2ab30 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72  sor;..    /* Mar
2ab40 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20  k off any ORDER 
2ab50 42 59 20 74 65 72 6d 20 58 20 74 68 61 74 20 69  BY term X that i
2ab60 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  s a column in th
2ab70 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a  e table of.    *
2ab80 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  * the current lo
2ab90 6f 70 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  op for which the
2aba0 72 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68  re is term in th
2abb0 65 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63  e WHERE.    ** c
2abc0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72  lause of the for
2abd0 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58  m X IS NULL or X
2abe0 3d 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  =? that referenc
2abf0 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20  e only outer.   
2ac00 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a   ** loops..    *
2ac10 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
2ac20 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
2ac30 0a 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42  .      if( MASKB
2ac40 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20  IT(i) & obSat ) 
2ac50 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2ac60 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65  pOBExpr = sqlite
2ac70 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
2ac80 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  (pOrderBy->a[i].
2ac90 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
2aca0 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54  ( pOBExpr->op!=T
2acb0 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69  K_COLUMN ) conti
2acc0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nue;.      if( p
2acd0 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d  OBExpr->iTable!=
2ace0 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
2acf0 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66  .      pTerm = f
2ad00 69 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d  indTerm(&pWInfo-
2ad10 3e 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42 45  >sWC, iCur, pOBE
2ad20 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  xpr->iColumn,.  
2ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad40 20 20 20 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f       ~ready, WO_
2ad50 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29  EQ|WO_ISNULL, 0)
2ad60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
2ad70 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  m==0 ) continue;
2ad80 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72  .      if( (pTer
2ad90 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f  m->eOperator&WO_
2ada0 45 51 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70  EQ)!=0 && pOBExp
2adb0 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  r->iColumn>=0 ){
2adc0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
2add0 68 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20  har *z1, *z2;.  
2ade0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2adf0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2ae00 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
2ae10 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
2ae20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
2ae30 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
2ae40 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
2ae50 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d  ll;.        z1 =
2ae60 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20   pColl->zName;. 
2ae70 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
2ae80 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
2ae90 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  q(pWInfo->pParse
2aea0 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b  , pTerm->pExpr);
2aeb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
2aec0 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
2aed0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
2aee0 20 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d       z2 = pColl-
2aef0 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
2af00 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
2af10 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20  mp(z1, z2)!=0 ) 
2af20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2af30 7d 0a 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d  }.      obSat |=
2af40 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
2af50 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f   }..    if( (pLo
2af60 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2af70 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29  ERE_ONEROW)==0 )
2af80 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f  {.      if( pLoo
2af90 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2afa0 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20  RE_IPK ){.      
2afb0 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
2afc0 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20        nKeyCol = 
2afd0 30 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75  0;.        nColu
2afe0 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  mn = 1;.      }e
2aff0 6c 73 65 20 69 66 28 20 28 70 49 6e 64 65 78 20  lse if( (pIndex 
2b000 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
2b010 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70  .pIndex)==0 || p
2b020 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65  Index->bUnordere
2b030 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  d ){.        ret
2b040 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 0;.      }el
2b050 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79  se{.        nKey
2b060 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b  Col = pIndex->nK
2b070 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e  eyCol;.        n
2b080 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d  Column = pIndex-
2b090 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >nColumn;.      
2b0a0 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
2b0b0 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20  n==nKeyCol+1 || 
2b0c0 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78  !HasRowid(pIndex
2b0d0 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a 20 20 20  ->pTable) );.   
2b0e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
2b0f0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43  dex->aiColumn[nC
2b100 6f 6c 75 6d 6e 2d 31 5d 3d 3d 28 2d 31 29 20 7c  olumn-1]==(-1) |
2b110 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64  | !HasRowid(pInd
2b120 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20 20  ex->pTable));.  
2b130 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
2b140 74 69 6e 63 74 20 3d 20 70 49 6e 64 65 78 2d 3e  tinct = pIndex->
2b150 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
2b160 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2b170 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
2b180 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   all columns of 
2b190 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65  the index and de
2b1a0 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73  al with the ones
2b1b0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61  .      ** that a
2b1c0 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e  re not constrain
2b1d0 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a  ed by == or IN..
2b1e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2b1f0 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b  ev = revSet = 0;
2b200 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43  .      distinctC
2b210 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20  olumns = 0;.    
2b220 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f    for(j=0; j<nCo
2b230 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
2b240 20 20 20 20 75 38 20 62 4f 6e 63 65 3b 20 20 20      u8 bOnce;   
2b250 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74  /* True to run t
2b260 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61 72  he ORDER BY sear
2b270 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20  ch loop */..    
2b280 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72      /* Skip over
2b290 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20   == and IS NULL 
2b2a0 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20  terms */.       
2b2b0 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e   if( j<pLoop->u.
2b2c0 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20  btree.nEq.      
2b2d0 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62     && pLoop->u.b
2b2e0 74 72 65 65 2e 6e 53 6b 69 70 3d 3d 30 0a 20 20  tree.nSkip==0.  
2b2f0 20 20 20 20 20 20 20 26 26 20 28 28 69 20 3d 20         && ((i = 
2b300 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
2b310 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20 26 20 28  ->eOperator) & (
2b320 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29  WO_EQ|WO_ISNULL)
2b330 29 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  )!=0.        ){.
2b340 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 20            if( i 
2b350 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  & WO_ISNULL ){. 
2b360 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
2b370 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74  ase( isOrderDist
2b380 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20  inct );.        
2b390 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
2b3a0 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
2b3b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
2b3c0 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20  ontinue;  .     
2b3d0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
2b3e0 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20   Get the column 
2b3f0 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61  number in the ta
2b400 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e  ble (iColumn) an
2b410 64 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20  d sort order.   
2b420 20 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29       ** (revIdx)
2b430 20 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f   for the j-th co
2b440 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
2b450 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  x..        */.  
2b460 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78        if( pIndex
2b470 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43   ){.          iC
2b480 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e  olumn = pIndex->
2b490 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
2b4a0 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20         revIdx = 
2b4b0 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
2b4c0 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20  er[j];.         
2b4d0 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49   if( iColumn==pI
2b4e0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50  ndex->pTable->iP
2b4f0 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20  Key ) iColumn = 
2b500 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
2b510 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  e{.          iCo
2b520 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
2b530 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b       revIdx = 0;
2b540 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2b550 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73      /* An uncons
2b560 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74  trained column t
2b570 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  hat might be NUL
2b580 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  L means that thi
2b590 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65  s.        ** Whe
2b5a0 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65  reLoop is not we
2b5b0 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20 20 20  ll-ordered.     
2b5c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2b5d0 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
2b5e0 74 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 43  t.         && iC
2b5f0 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20  olumn>=0.       
2b600 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75    && j>=pLoop->u
2b610 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20  .btree.nEq.     
2b620 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70      && pIndex->p
2b630 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  Table->aCol[iCol
2b640 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a  umn].notNull==0.
2b650 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2b660 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
2b670 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
2b680 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
2b690 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20 42  Find the ORDER B
2b6a0 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72 72  Y term that corr
2b6b0 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a  esponds to the j
2b6c0 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20  -th column.     
2b6d0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64     ** of the ind
2b6e0 65 78 20 61 6e 64 20 61 6e 64 20 6d 61 72 6b 20  ex and and mark 
2b6f0 74 68 61 74 20 4f 52 44 45 52 20 42 59 20 74 65  that ORDER BY te
2b700 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20  rm off .        
2b710 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65  */.        bOnce
2b720 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73   = 1;.        is
2b730 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20  Match = 0;.     
2b740 20 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63     for(i=0; bOnc
2b750 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b  e && i<nOrderBy;
2b760 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
2b770 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20   if( MASKBIT(i) 
2b780 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e  & obSat ) contin
2b790 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ue;.          pO
2b7a0 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  BExpr = sqlite3E
2b7b0 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
2b7c0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2b7d0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
2b7e0 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
2b7f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f  lags & WHERE_GRO
2b800 55 50 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20  UPBY );.        
2b810 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72    testcase( wctr
2b820 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
2b830 49 53 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20  ISTINCTBY );.   
2b840 20 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72         if( (wctr
2b850 6c 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  lFlags & (WHERE_
2b860 47 52 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49  GROUPBY|WHERE_DI
2b870 53 54 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20  STINCTBY))==0 ) 
2b880 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  bOnce = 0;.     
2b890 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
2b8a0 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
2b8b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2b8c0 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
2b8d0 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20  r->iTable!=iCur 
2b8e0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2b8f0 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
2b900 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  r->iColumn!=iCol
2b910 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
2b920 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
2b930 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
2b940 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
2b950 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
2b960 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  eq(pWInfo->pPars
2b970 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
2b980 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
2b990 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
2b9a0 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
2b9b0 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
2b9c0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2b9d0 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
2b9e0 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61  zName, pIndex->a
2b9f0 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63  zColl[j])!=0 ) c
2ba00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2ba10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
2ba20 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20  sMatch = 1;.    
2ba30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2ba40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2ba50 66 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20  f( isMatch ){.  
2ba60 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
2ba70 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  umn<0 ){.       
2ba80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64       testcase( d
2ba90 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d  istinctColumns==
2baa0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
2bab0 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
2bac0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2bad0 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61  }.          obSa
2bae0 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
2baf0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
2bb00 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2bb10 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50  gs & WHERE_GROUP
2bb20 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  BY)==0 ){.      
2bb30 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
2bb40 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65  re the sort orde
2bb50 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20  r is compatible 
2bb60 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  in an ORDER BY c
2bb70 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20 20  lause..         
2bb80 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72     ** Sort order
2bb90 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66   is irrelevant f
2bba0 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  or a GROUP BY cl
2bbb0 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ause. */.       
2bbc0 20 20 20 20 20 69 66 28 20 72 65 76 53 65 74 20       if( revSet 
2bbd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2bbe0 20 69 66 28 20 28 72 65 76 20 5e 20 72 65 76 49   if( (rev ^ revI
2bbf0 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61  dx)!=pOrderBy->a
2bc00 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20  [i].sortOrder ) 
2bc10 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
2bc20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2bc30 20 20 20 20 20 20 20 20 20 20 20 72 65 76 20 3d             rev =
2bc40 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65 72   revIdx ^ pOrder
2bc50 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
2bc60 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  er;.            
2bc70 20 20 69 66 28 20 72 65 76 20 29 20 2a 70 52 65    if( rev ) *pRe
2bc80 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54  vMask |= MASKBIT
2bc90 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  (iLoop);.       
2bca0 20 20 20 20 20 20 20 72 65 76 53 65 74 20 3d 20         revSet = 
2bcb0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
2bcc0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2bcd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2bce0 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63        /* No matc
2bcf0 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  h found */.     
2bd00 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c       if( j==0 ||
2bd10 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20   j<nKeyCol ){.  
2bd20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2bd30 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
2bd40 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nct!=0 );.      
2bd50 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
2bd60 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
2bd70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2bd80 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2bd90 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64  }.      } /* end
2bda0 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69   Loop over all i
2bdb0 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  ndex columns */.
2bdc0 20 20 20 20 20 20 69 66 28 20 64 69 73 74 69 6e        if( distin
2bdd0 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20  ctColumns ){.   
2bde0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2bdf0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d  sOrderDistinct==
2be00 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f  0 );.        isO
2be10 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31  rderDistinct = 1
2be20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
2be30 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e  /* end-if not on
2be40 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a  e-row */..    /*
2be50 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74   Mark off any ot
2be60 68 65 72 20 4f 52 44 45 52 20 42 59 20 74 65 72  her ORDER BY ter
2be70 6d 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  ms that referenc
2be80 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  e pLoop */.    i
2be90 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  f( isOrderDistin
2bea0 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65  ct ){.      orde
2beb0 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d  rDistinctMask |=
2bec0 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
2bed0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
2bee0 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
2bef0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
2bf00 2a 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  *p;.        if( 
2bf10 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53  MASKBIT(i) & obS
2bf20 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  at ) continue;. 
2bf30 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72 64 65         p = pOrde
2bf40 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
2bf50 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65 78  .        if( (ex
2bf60 70 72 54 61 62 6c 65 55 73 61 67 65 28 26 70 57  prTableUsage(&pW
2bf70 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
2bf80 70 29 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63  p)&~orderDistinc
2bf90 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  tMask)==0 ){.   
2bfa0 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20         obSat |= 
2bfb0 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
2bfc0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2bfd0 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74    }.  } /* End t
2bfe0 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  he loop over all
2bff0 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d   WhereLoops from
2c000 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e   outer-most down
2c010 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a   to inner-most *
2c020 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f  /.  if( obSat==o
2c030 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 31  bDone ) return 1
2c040 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64 65 72  ;.  if( !isOrder
2c050 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
2c060 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31  n 0;.  return -1
2c070 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52  ;.}..#ifdef WHER
2c080 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
2c090 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20  * For debugging 
2c0a0 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61  use only: */.sta
2c0b0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
2c0c0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68  wherePathName(Wh
2c0d0 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20  erePath *pPath, 
2c0e0 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65  int nLoop, Where
2c0f0 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20  Loop *pLast){.  
2c100 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d  static char zNam
2c110 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a  e[65];.  int i;.
2c120 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f    for(i=0; i<nLo
2c130 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b  op; i++){ zName[
2c140 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  i] = pPath->aLoo
2c150 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69  p[i]->cId; }.  i
2c160 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65  f( pLast ) zName
2c170 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63  [i++] = pLast->c
2c180 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d  Id;.  zName[i] =
2c190 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61   0;.  return zNa
2c1a0 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  me;.}.#endif.../
2c1b0 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c  *.** Given the l
2c1c0 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ist of WhereLoop
2c1d0 20 6f 62 6a 65 63 74 73 20 61 74 20 70 57 49 6e   objects at pWIn
2c1e0 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73  fo->pLoops, this
2c1f0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65   routine.** atte
2c200 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65  mpts to find the
2c210 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74   lowest cost pat
2c220 68 20 74 68 61 74 20 76 69 73 69 74 73 20 65 61  h that visits ea
2c230 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20  ch WhereLoop.** 
2c240 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74 68  once.  This path
2c250 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20   is then loaded 
2c260 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d  into the pWInfo-
2c270 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c  >a[].pWLoop fiel
2c280 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65  ds..**.** Assume
2c290 20 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20   that the total 
2c2a0 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
2c2b0 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
2c2c0 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72 74 65  need to be sorte
2c2d0 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f  d.** will be nRo
2c2e0 77 45 73 74 20 28 69 6e 20 74 68 65 20 31 30 2a  wEst (in the 10*
2c2f0 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74 61 74  log2 representat
2c300 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72  ion).  Or, ignor
2c310 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73  e sorting.** cos
2c320 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30  ts if nRowEst==0
2c330 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
2c340 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
2c350 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  ess or SQLITE_NO
2c360 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20  MEM of a memory 
2c370 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72  allocation.** er
2c380 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73  ror occurs..*/.s
2c390 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50  tatic int whereP
2c3a0 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49  athSolver(WhereI
2c3b0 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67  nfo *pWInfo, Log
2c3c0 45 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20  Est nRowEst){.  
2c3d0 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20 20  int mxChoice;   
2c3e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
2c3f0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
2c400 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68  imultaneous path
2c410 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69  s tracked */.  i
2c420 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt nLoop;       
2c430 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2c440 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
2c450 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72  he join */.  Par
2c460 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
2c470 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
2c480 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
2c490 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
2c4a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2c4b0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2c4c0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f  ion */.  int iLo
2c4d0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
2c4e0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2c4f0 65 72 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d  er over the term
2c500 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
2c510 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20  .  int ii, jj;  
2c520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c530 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
2c540 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20  .  int mxI = 0; 
2c550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c560 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 65 6e  Index of next en
2c570 74 72 79 20 74 6f 20 72 65 70 6c 61 63 65 20 2a  try to replace *
2c580 2f 0a 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74  /.  LogEst rCost
2c590 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2c5a0 20 43 6f 73 74 20 6f 66 20 61 20 70 61 74 68 20   Cost of a path 
2c5b0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74  */.  LogEst nOut
2c5c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2c5d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  * Number of outp
2c5e0 75 74 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  uts */.  LogEst 
2c5f0 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 20  mxCost = 0;     
2c600 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f     /* Maximum co
2c610 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70  st of a set of p
2c620 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  aths */.  LogEst
2c630 20 6d 78 4f 75 74 20 3d 20 30 3b 20 20 20 20 20   mxOut = 0;     
2c640 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
2c650 4f 75 74 20 76 61 6c 75 65 20 6f 6e 20 74 68 65  Out value on the
2c660 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f   set of paths */
2c670 0a 20 20 4c 6f 67 45 73 74 20 72 53 6f 72 74 43  .  LogEst rSortC
2c680 6f 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ost;         /* 
2c690 43 6f 73 74 20 74 6f 20 64 6f 20 61 20 73 6f 72  Cost to do a sor
2c6a0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20  t */.  int nTo, 
2c6b0 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20  nFrom;          
2c6c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
2c6d0 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61  lid entries in a
2c6e0 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d  To[] and aFrom[]
2c6f0 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
2c700 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20  *aFrom;         
2c710 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74  /* All nFrom pat
2c720 68 73 20 61 74 20 74 68 65 20 70 72 65 76 69 6f  hs at the previo
2c730 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68  us level */.  Wh
2c740 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20  erePath *aTo;   
2c750 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
2c760 54 6f 20 62 65 73 74 20 70 61 74 68 73 20 61 74  To best paths at
2c770 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76   the current lev
2c780 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  el */.  WherePat
2c790 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20  h *pFrom;       
2c7a0 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20    /* An element 
2c7b0 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20  of aFrom[] that 
2c7c0 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
2c7d0 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  n */.  WherePath
2c7e0 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20   *pTo;          
2c7f0 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f   /* An element o
2c800 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20  f aTo[] that we 
2c810 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
2c820 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
2c830 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a  WLoop;        /*
2c840 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72   One of the Wher
2c850 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f  eLoop objects */
2c860 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70  .  WhereLoop **p
2c870 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  X;           /* 
2c880 55 73 65 64 20 74 6f 20 64 69 76 79 20 75 70 20  Used to divy up 
2c890 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72  the pSpace memor
2c8a0 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70  y */.  char *pSp
2c8b0 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
2c8c0 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65   /* Temporary me
2c8d0 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69  mory used by thi
2c8e0 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20  s routine */..  
2c8f0 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
2c900 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
2c910 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c  pParse->db;.  nL
2c920 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c  oop = pWInfo->nL
2c930 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e  evel;.  /* TUNIN
2c940 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71 75  G: For simple qu
2c950 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20  eries, only the 
2c960 62 65 73 74 20 70 61 74 68 20 69 73 20 74 72 61  best path is tra
2c970 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32  cked..  ** For 2
2c980 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20  -way joins, the 
2c990 35 20 62 65 73 74 20 70 61 74 68 73 20 61 72 65  5 best paths are
2c9a0 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20   followed..  ** 
2c9b0 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f  For joins of 3 o
2c9c0 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20 74  r more tables, t
2c9d0 72 61 63 6b 20 74 68 65 20 31 30 20 62 65 73 74  rack the 10 best
2c9e0 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68   paths */.  mxCh
2c9f0 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3d 3d 31  oice = (nLoop==1
2ca00 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d  ) ? 1 : (nLoop==
2ca10 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20 61  2 ? 5 : 10);.  a
2ca20 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57  ssert( nLoop<=pW
2ca30 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
2ca40 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45 54  nSrc );.  WHERET
2ca50 52 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d 2d  RACE(0x002, ("--
2ca60 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72 5c  -- begin solver\
2ca70 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  n"));..  /* Allo
2ca80 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
2ca90 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61 54  ize space for aT
2caa0 6f 20 61 6e 64 20 61 46 72 6f 6d 20 2a 2f 0a 20  o and aFrom */. 
2cab0 20 69 69 20 3d 20 28 73 69 7a 65 6f 66 28 57 68   ii = (sizeof(Wh
2cac0 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66 28  erePath)+sizeof(
2cad0 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f  WhereLoop*)*nLoo
2cae0 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20  p)*mxChoice*2;. 
2caf0 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65   pSpace = sqlite
2cb00 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
2cb10 20 69 69 29 3b 0a 20 20 69 66 28 20 70 53 70 61   ii);.  if( pSpa
2cb20 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ce==0 ) return S
2cb30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61  QLITE_NOMEM;.  a
2cb40 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a  To = (WherePath*
2cb50 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d  )pSpace;.  aFrom
2cb60 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b   = aTo+mxChoice;
2cb70 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c  .  memset(aFrom,
2cb80 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d   0, sizeof(aFrom
2cb90 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57  [0]));.  pX = (W
2cba0 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f  hereLoop**)(aFro
2cbb0 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66  m+mxChoice);.  f
2cbc0 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32  or(ii=mxChoice*2
2cbd0 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e  , pFrom=aTo; ii>
2cbe0 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b  0; ii--, pFrom++
2cbf0 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a  , pX += nLoop){.
2cc00 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70      pFrom->aLoop
2cc10 20 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = pX;.  }..  /*
2cc20 20 53 65 65 64 20 74 68 65 20 73 65 61 72 63 68   Seed the search
2cc30 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 57   with a single W
2cc40 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69 6e  herePath contain
2cc50 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f  ing zero WhereLo
2cc60 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ops..  **.  ** T
2cc70 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65  UNING: Do not le
2cc80 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
2cc90 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61 62  iterations go ab
2cca0 6f 76 65 20 32 35 2e 20 20 49 66 20 74 68 65 20  ove 25.  If the 
2ccb0 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d  cost.  ** of com
2ccc0 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61  puting an automa
2ccd0 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  tic index is not
2cce0 20 70 61 69 64 20 62 61 63 6b 20 77 69 74 68 69   paid back withi
2ccf0 6e 20 74 68 65 20 66 69 72 73 74 20 32 35 0a 20  n the first 25. 
2cd00 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20 64   ** rows, then d
2cd10 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61 75  o not use the au
2cd20 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 2a  tomatic index. *
2cd30 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f  /.  aFrom[0].nRo
2cd40 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e  w = MIN(pParse->
2cd50 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 36 29 3b  nQueryLoop, 46);
2cd60 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71    assert( 46==sq
2cd70 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20  lite3LogEst(25) 
2cd80 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a  );.  nFrom = 1;.
2cd90 0a 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74 65  .  /* Precompute
2cda0 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72   the cost of sor
2cdb0 74 69 6e 67 20 74 68 65 20 66 69 6e 61 6c 20 72  ting the final r
2cdc0 65 73 75 6c 74 20 73 65 74 2c 20 69 66 20 74 68  esult set, if th
2cdd0 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 74 6f  e caller.  ** to
2cde0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2cdf0 69 6e 28 29 20 77 61 73 20 63 6f 6e 63 65 72 6e  in() was concern
2ce00 65 64 20 61 62 6f 75 74 20 73 6f 72 74 69 6e 67  ed about sorting
2ce10 20 2a 2f 0a 20 20 72 53 6f 72 74 43 6f 73 74 20   */.  rSortCost 
2ce20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  = 0;.  if( pWInf
2ce30 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  o->pOrderBy==0 |
2ce40 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a  | nRowEst==0 ){.
2ce50 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f      aFrom[0].isO
2ce60 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b  rderedValid = 1;
2ce70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2ce80 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74   TUNING: Estimat
2ce90 65 64 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69  ed cost of sorti
2cea0 6e 67 20 69 73 20 34 38 2a 4e 2a 6c 6f 67 32 28  ng is 48*N*log2(
2ceb0 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  N) where N is th
2cec0 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
2ced0 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2e 20  of output rows. 
2cee0 54 68 65 20 34 38 20 69 73 20 74 68 65 20 65 78  The 48 is the ex
2cef0 70 65 63 74 65 64 20 73 69 7a 65 20 6f 66 20 61  pected size of a
2cf00 20 72 6f 77 20 74 6f 20 73 6f 72 74 2e 20 0a 20   row to sort. . 
2cf10 20 20 20 2a 2a 20 46 49 58 4d 45 3a 20 20 63 6f     ** FIXME:  co
2cf20 6d 70 75 74 65 20 61 20 62 65 74 74 65 72 20 65  mpute a better e
2cf30 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 34  stimate of the 4
2cf40 38 20 6d 75 6c 74 69 70 6c 69 65 72 20 62 61 73  8 multiplier bas
2cf50 65 64 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ed on the.    **
2cf60 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
2cf70 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20  essions. */.    
2cf80 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77  rSortCost = nRow
2cf90 45 73 74 20 2b 20 65 73 74 4c 6f 67 28 6e 52 6f  Est + estLog(nRo
2cfa0 77 45 73 74 29 3b 0a 20 20 20 20 57 48 45 52 45  wEst);.    WHERE
2cfb0 54 52 41 43 45 28 30 78 30 30 32 2c 28 22 2d 2d  TRACE(0x002,("--
2cfc0 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33  -- sort cost=%-3
2cfd0 64 5c 6e 22 2c 20 72 53 6f 72 74 43 6f 73 74 29  d\n", rSortCost)
2cfe0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  );.  }..  /* Com
2cff0 70 75 74 65 20 73 75 63 63 65 73 73 69 76 65 6c  pute successivel
2d000 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61  y longer WherePa
2d010 74 68 73 20 75 73 69 6e 67 20 74 68 65 20 70 72  ths using the pr
2d020 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f  evious generatio
2d030 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50  n.  ** of WhereP
2d040 61 74 68 73 20 61 73 20 74 68 65 20 62 61 73 69  aths as the basi
2d050 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20  s for the next. 
2d060 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
2d070 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a  he mxChoice.  **
2d080 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20 65   best paths at e
2d090 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  ach generation *
2d0a0 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b  /.  for(iLoop=0;
2d0b0 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c   iLoop<nLoop; iL
2d0c0 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20  oop++){.    nTo 
2d0d0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  = 0;.    for(ii=
2d0e0 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20  0, pFrom=aFrom; 
2d0f0 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20  ii<nFrom; ii++, 
2d100 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
2d110 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66  for(pWLoop=pWInf
2d120 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f  o->pLoops; pWLoo
2d130 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70  p; pWLoop=pWLoop
2d140 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20  ->pNextLoop){.  
2d150 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61        Bitmask ma
2d160 73 6b 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 42  skNew;.        B
2d170 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d  itmask revMask =
2d180 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 69   0;.        u8 i
2d190 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20  sOrderedValid = 
2d1a0 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64  pFrom->isOrdered
2d1b0 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20 75  Valid;.        u
2d1c0 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70 46  8 isOrdered = pF
2d1d0 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a  rom->isOrdered;.
2d1e0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c          if( (pWL
2d1f0 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70  oop->prereq & ~p
2d200 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21  From->maskLoop)!
2d210 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2d220 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f         if( (pWLo
2d230 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70  op->maskSelf & p
2d240 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21  From->maskLoop)!
2d250 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2d260 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69         /* At thi
2d270 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20  s point, pWLoop 
2d280 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74  is a candidate t
2d290 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f  o be the next lo
2d2a0 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  op. .        ** 
2d2b0 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74  Compute its cost
2d2c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 43 6f 73   */.        rCos
2d2d0 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
2d2e0 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65  tAdd(pWLoop->rSe
2d2f0 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e  tup,pWLoop->rRun
2d300 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b   + pFrom->nRow);
2d310 0a 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d  .        rCost =
2d320 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
2d330 64 28 72 43 6f 73 74 2c 20 70 46 72 6f 6d 2d 3e  d(rCost, pFrom->
2d340 72 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20  rCost);.        
2d350 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52  nOut = pFrom->nR
2d360 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75  ow + pWLoop->nOu
2d370 74 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e  t;.        maskN
2d380 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  ew = pFrom->mask
2d390 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d  Loop | pWLoop->m
2d3a0 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20  askSelf;.       
2d3b0 20 69 66 28 20 21 69 73 4f 72 64 65 72 65 64 56   if( !isOrderedV
2d3c0 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  alid ){.        
2d3d0 20 20 73 77 69 74 63 68 28 20 77 68 65 72 65 50    switch( whereP
2d3e0 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
2d3f0 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20  rBy(pWInfo,.    
2d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d410 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65     pWInfo->pOrde
2d420 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e  rBy, pFrom, pWIn
2d430 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a  fo->wctrlFlags,.
2d440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d450 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57         iLoop, pW
2d460 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 20  Loop, &revMask) 
2d470 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
2d480 61 73 65 20 31 3a 20 20 2f 2a 20 59 65 73 2e 20  ase 1:  /* Yes. 
2d490 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 64 6f   pFrom+pWLoop do
2d4a0 65 73 20 73 61 74 69 73 66 79 20 74 68 65 20 4f  es satisfy the O
2d4b0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
2d4c0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
2d4d0 69 73 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20  isOrdered = 1;. 
2d4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
2d4f0 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b  rderedValid = 1;
2d500 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
2d510 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2d520 20 20 63 61 73 65 20 30 3a 20 20 2f 2a 20 4e 6f    case 0:  /* No
2d530 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20  .  pFrom+pWLoop 
2d540 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 73  will require a s
2d550 65 70 61 72 61 74 65 20 73 6f 72 74 20 2a 2f 0a  eparate sort */.
2d560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2d570 4f 72 64 65 72 65 64 20 3d 20 30 3b 0a 20 20 20  Ordered = 0;.   
2d580 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
2d590 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20  eredValid = 1;. 
2d5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 43 6f               rCo
2d5b0 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  st = sqlite3LogE
2d5c0 73 74 41 64 64 28 72 43 6f 73 74 2c 20 72 53 6f  stAdd(rCost, rSo
2d5d0 72 74 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20  rtCost);.       
2d5e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2d5f0 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c            defaul
2d600 74 3a 20 2f 2a 20 43 61 6e 6e 6f 74 20 74 65 6c  t: /* Cannot tel
2d610 6c 20 79 65 74 2e 20 20 54 72 79 20 61 67 61 69  l yet.  Try agai
2d620 6e 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 74  n on the next it
2d630 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  eration */.     
2d640 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2d650 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d670 20 20 20 20 20 72 65 76 4d 61 73 6b 20 3d 20 70       revMask = p
2d680 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20  From->revLoop;. 
2d690 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d6a0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
2d6b0 20 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c   if pWLoop shoul
2d6c0 64 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  d be added to th
2d6d0 65 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74 20  e mxChoice best 
2d6e0 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
2d6f0 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d    for(jj=0, pTo=
2d700 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b  aTo; jj<nTo; jj+
2d710 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
2d720 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61       if( pTo->ma
2d730 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a  skLoop==maskNew.
2d740 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 54             && pT
2d750 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  o->isOrderedVali
2d760 64 3d 3d 69 73 4f 72 64 65 72 65 64 56 61 6c 69  d==isOrderedVali
2d770 64 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  d.           && 
2d780 28 28 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43  ((pTo->rCost<=rC
2d790 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77  ost && pTo->nRow
2d7a0 3c 3d 6e 4f 75 74 29 20 7c 7c 0a 20 20 20 20 20  <=nOut) ||.     
2d7b0 20 20 20 20 20 20 20 20 20 20 20 28 70 54 6f 2d             (pTo-
2d7c0 3e 72 43 6f 73 74 3e 3d 72 43 6f 73 74 20 26 26  >rCost>=rCost &&
2d7d0 20 70 54 6f 2d 3e 6e 52 6f 77 3e 3d 6e 4f 75 74   pTo->nRow>=nOut
2d7e0 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  )).          ){.
2d7f0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2d800 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20  case( jj==nTo-1 
2d810 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
2d820 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2d830 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2d840 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20      if( jj>=nTo 
2d850 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2d860 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 26   nTo>=mxChoice &
2d870 26 20 72 43 6f 73 74 3e 3d 6d 78 43 6f 73 74 20  & rCost>=mxCost 
2d880 29 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ){.#ifdef WHERET
2d890 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
2d8a0 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
2d8b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
2d8c0 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
2d8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2d8e0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2d8f0 28 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74  ("Skip   %s cost
2d900 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
2d910 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
2d920 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
2d930 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
2d940 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
2d950 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20  ost, nOut,.     
2d960 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
2d970 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69  rderedValid ? (i
2d980 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a  sOrdered ? 'Y' :
2d990 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20   'N') : '?');.  
2d9a0 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
2d9b0 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  if.            c
2d9c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2d9d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f     }.          /
2d9e0 2a 20 41 64 64 20 61 20 6e 65 77 20 50 61 74 68  * Add a new Path
2d9f0 20 74 6f 20 74 68 65 20 61 54 6f 5b 5d 20 73 65   to the aTo[] se
2da00 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  t */.          i
2da10 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20  f( nTo<mxChoice 
2da20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
2da30 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 73  * Increase the s
2da40 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73  ize of the aTo s
2da50 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20  et by one */.   
2da60 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54           jj = nT
2da70 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  o++;.          }
2da80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2da90 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65    /* New path re
2daa0 70 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f 72  places the prior
2dab0 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63   worst to keep c
2dac0 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f  ount below mxCho
2dad0 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ice */.         
2dae0 20 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20     jj = mxI;.   
2daf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2db00 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a     pTo = &aTo[jj
2db10 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ];.#ifdef WHERET
2db20 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
2db30 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
2db40 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2db50 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
2db60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2db70 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65  3DebugPrintf("Ne
2db80 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33  w    %s cost=%-3
2db90 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  d,%3d order=%c\n
2dba0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2dbb0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
2dbc0 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
2dbd0 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e  WLoop), rCost, n
2dbe0 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Out,.           
2dbf0 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61       isOrderedVa
2dc00 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64  lid ? (isOrdered
2dc10 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20   ? 'Y' : 'N') : 
2dc20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
2dc30 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
2dc40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2dc50 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74    if( pTo->rCost
2dc60 3c 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e  <=rCost && pTo->
2dc70 6e 52 6f 77 3c 3d 6e 4f 75 74 20 29 7b 0a 23 69  nRow<=nOut ){.#i
2dc80 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
2dc90 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a  ENABLED /* 0x4 *
2dca0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
2dcb0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
2dcc0 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
2dcd0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2dce0 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
2dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2dd00 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25  Skip   %s cost=%
2dd10 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  -3d,%3d order=%c
2dd20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2dd30 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
2dd40 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
2dd50 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
2dd60 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20   nOut,.         
2dd70 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
2dd80 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64  edValid ? (isOrd
2dd90 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
2dda0 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
2ddb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2ddc0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 76  ebugPrintf("   v
2ddd0 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25  s %s cost=%-3d,%
2dde0 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
2ddf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de00 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
2de10 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
2de20 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f   pTo->rCost, pTo
2de30 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  ->nRow,.        
2de40 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
2de50 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20  sOrderedValid ? 
2de60 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20  (pTo->isOrdered 
2de70 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27  ? 'Y' : 'N') : '
2de80 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
2de90 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
2dea0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2deb0 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73  pTo->rCost==rCos
2dec0 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t );.           
2ded0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2dee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2def0 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e   testcase( pTo->
2df00 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29  rCost==rCost+1 )
2df10 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;.          /* A
2df20 20 6e 65 77 20 61 6e 64 20 62 65 74 74 65 72 20   new and better 
2df30 73 63 6f 72 65 20 66 6f 72 20 61 20 70 72 65 76  score for a prev
2df40 69 6f 75 73 6c 79 20 63 72 65 61 74 65 64 20 65  iously created e
2df50 71 75 69 76 61 6c 65 6e 74 20 70 61 74 68 20 2a  quivalent path *
2df60 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  /.#ifdef WHERETR
2df70 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
2df80 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
2df90 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2dfa0 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
2dfb0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2dfc0 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
2dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55 70               "Up
2dfe0 64 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33  date %s cost=%-3
2dff0 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c  d,%3d order=%c",
2e000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e010 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
2e020 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
2e030 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
2e040 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2e050 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69     isOrderedVali
2e060 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f  d ? (isOrdered ?
2e070 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f   'Y' : 'N') : '?
2e080 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
2e090 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2e0a0 74 66 28 22 20 20 77 61 73 20 25 73 20 63 6f 73  tf("  was %s cos
2e0b0 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72  t=%-3d,%3d order
2e0c0 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
2e0d0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
2e0e0 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
2e0f0 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
2e100 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20  st, pTo->nRow,. 
2e110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2e120 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c  To->isOrderedVal
2e130 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  id ? (pTo->isOrd
2e140 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
2e150 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
2e160 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2e170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
2e180 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69  * pWLoop is a wi
2e190 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f  nner.  Add it to
2e1a0 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74   the set of best
2e1b0 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20   so far */.     
2e1c0 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70     pTo->maskLoop
2e1d0 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   = pFrom->maskLo
2e1e0 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73  op | pWLoop->mas
2e1f0 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70  kSelf;.        p
2e200 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65  To->revLoop = re
2e210 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70  vMask;.        p
2e220 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b  To->nRow = nOut;
2e230 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 43  .        pTo->rC
2e240 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20  ost = rCost;.   
2e250 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
2e260 72 65 64 56 61 6c 69 64 20 3d 20 69 73 4f 72 64  redValid = isOrd
2e270 65 72 65 64 56 61 6c 69 64 3b 0a 20 20 20 20 20  eredValid;.     
2e280 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
2e290 64 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a 20  d = isOrdered;. 
2e2a0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54         memcpy(pT
2e2b0 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d  o->aLoop, pFrom-
2e2c0 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57  >aLoop, sizeof(W
2e2d0 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70  hereLoop*)*iLoop
2e2e0 29 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  );.        pTo->
2e2f0 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70  aLoop[iLoop] = p
2e300 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69  WLoop;.        i
2e310 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65  f( nTo>=mxChoice
2e320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 78   ){.          mx
2e330 49 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  I = 0;.         
2e340 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d   mxCost = aTo[0]
2e350 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  .rCost;.        
2e360 20 20 6d 78 4f 75 74 20 3d 20 61 54 6f 5b 30 5d    mxOut = aTo[0]
2e370 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 20  .nRow;.         
2e380 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26   for(jj=1, pTo=&
2e390 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f  aTo[1]; jj<mxCho
2e3a0 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b  ice; jj++, pTo++
2e3b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2e3c0 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78  f( pTo->rCost>mx
2e3d0 43 6f 73 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43  Cost || (pTo->rC
2e3e0 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70  ost==mxCost && p
2e3f0 54 6f 2d 3e 6e 52 6f 77 3e 6d 78 4f 75 74 29 20  To->nRow>mxOut) 
2e400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2e410 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72   mxCost = pTo->r
2e420 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
2e430 20 20 20 20 6d 78 4f 75 74 20 3d 20 70 54 6f 2d      mxOut = pTo-
2e440 3e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 20  >nRow;.         
2e450 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20       mxI = jj;. 
2e460 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2e470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e480 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2e490 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
2e4a0 41 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f 2a 20  ACE_ENABLED  /* 
2e4b0 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  >=2 */.    if( s
2e4c0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
2e4d0 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  >=2 ){.      sql
2e4e0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2e4f0 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e  "---- after roun
2e500 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c  d %d ----\n", iL
2e510 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  oop);.      for(
2e520 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69  ii=0, pTo=aTo; i
2e530 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f  i<nTo; ii++, pTo
2e540 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
2e550 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2e560 22 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e  " %s cost=%-3d n
2e570 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25  row=%-3d order=%
2e580 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 77  c",.           w
2e590 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
2e5a0 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
2e5b0 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
2e5c0 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
2e5d0 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56   pTo->isOrderedV
2e5e0 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f  alid ? (pTo->isO
2e5f0 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27  rdered ? 'Y' : '
2e600 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  N') : '?');.    
2e610 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f      if( pTo->isO
2e620 72 64 65 72 65 64 56 61 6c 69 64 20 26 26 20 70  rderedValid && p
2e630 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 7b  To->isOrdered ){
2e640 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2e650 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
2e660 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70  rev=0x%llx\n", p
2e670 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20  To->revLoop);.  
2e680 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2e690 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
2e6a0 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
2e6b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e6c0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
2e6d0 0a 20 20 20 20 2f 2a 20 53 77 61 70 20 74 68 65  .    /* Swap the
2e6e0 20 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20   roles of aFrom 
2e6f0 61 6e 64 20 61 54 6f 20 66 6f 72 20 74 68 65 20  and aTo for the 
2e700 6e 65 78 74 20 67 65 6e 65 72 61 74 69 6f 6e 20  next generation 
2e710 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20 61  */.    pFrom = a
2e720 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61 46  To;.    aTo = aF
2e730 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d  rom;.    aFrom =
2e740 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f   pFrom;.    nFro
2e750 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20  m = nTo;.  }..  
2e760 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a  if( nFrom==0 ){.
2e770 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2e780 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
2e790 71 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29  query solution")
2e7a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
2e7b0 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b  ree(db, pSpace);
2e7c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2e7d0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
2e7e0 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c  .  /* Find the l
2e7f0 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 2e  owest cost path.
2e800 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20    pFrom will be 
2e810 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f  left pointing to
2e820 20 74 68 61 74 20 70 61 74 68 20 2a 2f 0a 20 20   that path */.  
2e830 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20  pFrom = aFrom;. 
2e840 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46   for(ii=1; ii<nF
2e850 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  rom; ii++){.    
2e860 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74  if( pFrom->rCost
2e870 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74  >aFrom[ii].rCost
2e880 20 29 20 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f   ) pFrom = &aFro
2e890 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73  m[ii];.  }.  ass
2e8a0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ert( pWInfo->nLe
2e8b0 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20  vel==nLoop );.  
2e8c0 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65  /* Load the lowe
2e8d0 73 74 20 63 6f 73 74 20 70 61 74 68 20 69 6e 74  st cost path int
2e8e0 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f  o pWInfo */.  fo
2e8f0 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70  r(iLoop=0; iLoop
2e900 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  <nLoop; iLoop++)
2e910 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c  {.    WhereLevel
2e920 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66   *pLevel = pWInf
2e930 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20  o->a + iLoop;.  
2e940 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70    pLevel->pWLoop
2e950 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f   = pWLoop = pFro
2e960 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b  m->aLoop[iLoop];
2e970 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72  .    pLevel->iFr
2e980 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61  om = pWLoop->iTa
2e990 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  b;.    pLevel->i
2e9a0 54 61 62 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d  TabCur = pWInfo-
2e9b0 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
2e9c0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72  vel->iFrom].iCur
2e9d0 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  sor;.  }.  if( (
2e9e0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2e9f0 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
2ea00 44 49 53 54 49 4e 43 54 29 21 3d 30 0a 20 20 20  DISTINCT)!=0.   
2ea10 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
2ea20 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
2ea30 49 53 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20 20  ISTINCTBY)==0.  
2ea40 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73   && pWInfo->eDis
2ea50 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53  tinct==WHERE_DIS
2ea60 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26 26  TINCT_NOOP.   &&
2ea70 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20   nRowEst.  ){.  
2ea80 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65    Bitmask notUse
2ea90 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  d;.    int rc = 
2eaa0 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
2eab0 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f  esOrderBy(pWInfo
2eac0 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c  , pWInfo->pResul
2ead0 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20  tSet, pFrom,.   
2eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
2eaf0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 2c 20  ERE_DISTINCTBY, 
2eb00 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e  nLoop-1, pFrom->
2eb10 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20  aLoop[nLoop-1], 
2eb20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69  &notUsed);.    i
2eb30 66 28 20 72 63 3d 3d 31 20 29 20 70 57 49 6e 66  f( rc==1 ) pWInf
2eb40 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
2eb50 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
2eb60 44 45 52 45 44 3b 0a 20 20 7d 0a 20 20 69 66 28  DERED;.  }.  if(
2eb70 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
2eb80 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 57 49  d ){.    if( pWI
2eb90 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2eba0 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  & WHERE_DISTINCT
2ebb0 42 59 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e  BY ){.      pWIn
2ebc0 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
2ebd0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
2ebe0 52 44 45 52 45 44 3b 0a 20 20 20 20 7d 65 6c 73  RDERED;.    }els
2ebf0 65 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  e{.      pWInfo-
2ec00 3e 62 4f 42 53 61 74 20 3d 20 31 3b 0a 20 20 20  >bOBSat = 1;.   
2ec10 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61     pWInfo->revMa
2ec20 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c  sk = pFrom->revL
2ec30 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  oop;.    }.  }. 
2ec40 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
2ec50 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a   = pFrom->nRow;.
2ec60 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d 70 6f  .  /* Free tempo
2ec70 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e 64 20  rary memory and 
2ec80 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 20 2a  return success *
2ec90 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  /.  sqlite3DbFre
2eca0 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20  e(db, pSpace);. 
2ecb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ecc0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74  K;.}../*.** Most
2ecd0 20 71 75 65 72 69 65 73 20 75 73 65 20 6f 6e 6c   queries use onl
2ece0 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
2ecf0 20 28 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6a   (they are not j
2ed00 6f 69 6e 73 29 20 61 6e 64 20 68 61 76 65 0a 2a  oins) and have.*
2ed10 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73  * simple == cons
2ed20 74 72 61 69 6e 74 73 20 61 67 61 69 6e 73 74 20  traints against 
2ed30 69 6e 64 65 78 65 64 20 66 69 65 6c 64 73 2e 20  indexed fields. 
2ed40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
2ed50 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61  tempts.** to pla
2ed60 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c 65 20 63  n those simple c
2ed70 61 73 65 73 20 75 73 69 6e 67 20 6d 75 63 68 20  ases using much 
2ed80 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79 20 74 68  less ceremony th
2ed90 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61  an the.** genera
2eda0 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20  l-purpose query 
2edb0 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68 65  planner, and the
2edc0 72 65 62 79 20 79 69 65 6c 64 20 66 61 73 74 65  reby yield faste
2edd0 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  r sqlite3_prepar
2ede0 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f 72  e().** times for
2edf0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2ee00 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ..**.** Return n
2ee10 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65  on-zero on succe
2ee20 73 73 2c 20 69 66 20 74 68 69 73 20 71 75 65 72  ss, if this quer
2ee30 79 20 63 61 6e 20 62 65 20 68 61 6e 64 6c 65 64  y can be handled
2ee40 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66   by this.** no-f
2ee50 72 69 6c 6c 73 20 71 75 65 72 79 20 70 6c 61 6e  rills query plan
2ee60 6e 65 72 2e 20 20 52 65 74 75 72 6e 20 7a 65 72  ner.  Return zer
2ee70 6f 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20  o if this query 
2ee80 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a 20 67 65  needs the .** ge
2ee90 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75  neral-purpose qu
2eea0 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a  ery planner..*/.
2eeb0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
2eec0 53 68 6f 72 74 43 75 74 28 57 68 65 72 65 4c 6f  ShortCut(WhereLo
2eed0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
2eee0 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  der){.  WhereInf
2eef0 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74 72  o *pWInfo;.  str
2ef00 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2ef10 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65 72 65   *pItem;.  Where
2ef20 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57  Clause *pWC;.  W
2ef30 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
2ef40 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
2ef50 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b  oop;.  int iCur;
2ef60 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c  .  int j;.  Tabl
2ef70 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
2ef80 20 2a 70 49 64 78 3b 0a 20 20 0a 20 20 70 57 49   *pIdx;.  .  pWI
2ef90 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
2efa0 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 57  pWInfo;.  if( pW
2efb0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2efc0 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54   & WHERE_FORCE_T
2efd0 41 42 4c 45 20 29 20 72 65 74 75 72 6e 20 30 3b  ABLE ) return 0;
2efe0 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
2eff0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  o->pTabList->nSr
2f000 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d 20  c>=1 );.  pItem 
2f010 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
2f020 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d 20  st->a;.  pTab = 
2f030 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 69  pItem->pTab;.  i
2f040 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
2f050 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  b) ) return 0;. 
2f060 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 49 6e 64   if( pItem->zInd
2f070 65 78 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ex ) return 0;. 
2f080 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69   iCur = pItem->i
2f090 43 75 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20  Cursor;.  pWC = 
2f0a0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20  &pWInfo->sWC;.  
2f0b0 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65 72  pLoop = pBuilder
2f0c0 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d  ->pNew;.  pLoop-
2f0d0 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  >wsFlags = 0;.  
2f0e0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
2f0f0 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70 54 65 72  Skip = 0;.  pTer
2f100 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
2f110 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57  , iCur, -1, 0, W
2f120 4f 5f 45 51 2c 20 30 29 3b 0a 20 20 69 66 28 20  O_EQ, 0);.  if( 
2f130 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 70 4c 6f  pTerm ){.    pLo
2f140 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  op->wsFlags = WH
2f150 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48  ERE_COLUMN_EQ|WH
2f160 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e  ERE_IPK|WHERE_ON
2f170 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  EROW;.    pLoop-
2f180 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65  >aLTerm[0] = pTe
2f190 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e  rm;.    pLoop->n
2f1a0 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70  LTerm = 1;.    p
2f1b0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
2f1c0 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55  q = 1;.    /* TU
2f1d0 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20  NING: Cost of a 
2f1e0 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20  rowid lookup is 
2f1f0 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d  10 */.    pLoop-
2f200 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20  >rRun = 33;  /* 
2f210 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  33==sqlite3LogEs
2f220 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65  t(10) */.  }else
2f230 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  {.    for(pIdx=p
2f240 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
2f250 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
2f260 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
2f270 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  rt( pLoop->aLTer
2f280 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61  mSpace==pLoop->a
2f290 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 61  LTerm );.      a
2f2a0 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65  ssert( ArraySize
2f2b0 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70  (pLoop->aLTermSp
2f2c0 61 63 65 29 3d 3d 34 20 29 3b 0a 20 20 20 20 20  ace)==4 );.     
2f2d0 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
2f2e0 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 0a 20 20 20  or==OE_None .   
2f2f0 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61      || pIdx->pPa
2f300 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 0a 20  rtIdxWhere!=0 . 
2f310 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e        || pIdx->n
2f320 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65  KeyCol>ArraySize
2f330 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70  (pLoop->aLTermSp
2f340 61 63 65 29 20 0a 20 20 20 20 20 20 29 20 63 6f  ace) .      ) co
2f350 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f  ntinue;.      fo
2f360 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e  r(j=0; j<pIdx->n
2f370 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  KeyCol; j++){.  
2f380 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
2f390 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
2f3a0 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  , pIdx->aiColumn
2f3b0 5b 6a 5d 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 70  [j], 0, WO_EQ, p
2f3c0 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Idx);.        if
2f3d0 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65  ( pTerm==0 ) bre
2f3e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  ak;.        pLoo
2f3f0 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70  p->aLTerm[j] = p
2f400 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
2f410 20 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78 2d      if( j!=pIdx-
2f420 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69  >nKeyCol ) conti
2f430 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  nue;.      pLoop
2f440 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
2f450 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
2f460 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49  E_ONEROW|WHERE_I
2f470 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69 66  NDEXED;.      if
2f480 28 20 70 49 64 78 2d 3e 69 73 43 6f 76 65 72 69  ( pIdx->isCoveri
2f490 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63 6f  ng || (pItem->co
2f4a0 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73  lUsed & ~columns
2f4b0 49 6e 49 6e 64 65 78 28 70 49 64 78 29 29 3d 3d  InIndex(pIdx))==
2f4c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  0 ){.        pLo
2f4d0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  op->wsFlags |= W
2f4e0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20  HERE_IDX_ONLY;. 
2f4f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f       }.      pLo
2f500 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a  op->nLTerm = j;.
2f510 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62        pLoop->u.b
2f520 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20  tree.nEq = j;.  
2f530 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
2f540 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  ee.pIndex = pIdx
2f550 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
2f560 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69  G: Cost of a uni
2f570 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70  que index lookup
2f580 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20   is 15 */.      
2f590 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39  pLoop->rRun = 39
2f5a0 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65  ;  /* 39==sqlite
2f5b0 33 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a 20  3LogEst(15) */. 
2f5c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2f5d0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f  }.  }.  if( pLoo
2f5e0 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20  p->wsFlags ){.  
2f5f0 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20    pLoop->nOut = 
2f600 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20 20 70  (LogEst)1;.    p
2f610 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
2f620 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20  op = pLoop;.    
2f630 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20  pLoop->maskSelf 
2f640 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  = getMask(&pWInf
2f650 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75  o->sMaskSet, iCu
2f660 72 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  r);.    pWInfo->
2f670 61 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d 20 69  a[0].iTabCur = i
2f680 43 75 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  Cur;.    pWInfo-
2f690 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20  >nRowOut = 1;.  
2f6a0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
2f6b0 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d  rderBy ) pWInfo-
2f6c0 3e 62 4f 42 53 61 74 20 3d 20 20 31 3b 0a 20 20  >bOBSat =  1;.  
2f6d0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
2f6e0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2f6f0 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
2f700 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
2f710 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
2f720 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
2f730 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  E;.    }.#ifdef 
2f740 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
2f750 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30   pLoop->cId = '0
2f760 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  ';.#endif.    re
2f770 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
2f780 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2f790 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62 65   Generate the be
2f7a0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c  ginning of the l
2f7b0 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48 45  oop used for WHE
2f7c0 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
2f7d0 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74  sing..** The ret
2f7e0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70  urn value is a p
2f7f0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61  ointer to an opa
2f800 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74 68  que structure th
2f810 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69  at contains.** i
2f820 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65  nformation neede
2f830 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  d to terminate t
2f840 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c  he loop.  Later,
2f850 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
2f860 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69  tine.** should i
2f870 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65  nvoke sqlite3Whe
2f880 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68 65  reEnd() with the
2f890 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
2f8a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
2f8b0 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  * in order to co
2f8c0 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52 45  mplete the WHERE
2f8d0 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
2f8e0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
2f8f0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
2f900 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2f910 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  ns NULL..**.** T
2f920 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69 73  he basic idea is
2f930 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20   to do a nested 
2f940 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66  loop, one loop f
2f950 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e  or each table in
2f960 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
2f970 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e  use of a select.
2f980 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50    (INSERT and UP
2f990 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20  DATE statements 
2f9a0 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  are the.** same 
2f9b0 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74 68  as a SELECT with
2f9c0 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
2f9d0 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
2f9e0 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a   clause.)  For.*
2f9f0 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  * example, if th
2fa00 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a  e SQL is this:.*
2fa10 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43  *.**       SELEC
2fa20 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c  T * FROM t1, t2,
2fa30 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a   t3 WHERE ...;.*
2fa40 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f  *.** Then the co
2fa50 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73 20  de generated is 
2fa60 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b  conceptually lik
2fa70 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  e the following:
2fa80 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  .**.**      fore
2fa90 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
2faa0 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64  o       \    Cod
2fab0 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20  e generated.**  
2fac0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
2fad0 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20  w2 in t2 do     
2fae0 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57   |-- by sqlite3W
2faf0 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20  hereBegin().**  
2fb00 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
2fb10 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20  row3 in t3 do   
2fb20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  /.**            
2fb30 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
2fb40 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
2fb50 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64          \    Cod
2fb60 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20  e generated.**  
2fb70 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
2fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb90 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57   |-- by sqlite3W
2fba0 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20  hereEnd().**    
2fbb0 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
2fbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a                /.
2fbd0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2fbe0 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20  the loops might 
2fbf0 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e  not be nested in
2fc00 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68   the order in wh
2fc10 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65  ich they.** appe
2fc20 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ar in the FROM c
2fc30 6c 61 75 73 65 20 69 66 20 61 20 64 69 66 66 65  lause if a diffe
2fc40 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65  rent order is be
2fc50 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b  tter able to mak
2fc60 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69  e.** use of indi
2fc70 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20  ces.  Note also 
2fc80 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e  that when the IN
2fc90 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61 72   operator appear
2fca0 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52  s in.** the WHER
2fcb0 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67  E clause, it mig
2fcc0 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64  ht result in add
2fcd0 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c  itional nested l
2fce0 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e  oops for.** scan
2fcf0 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c  ning through all
2fd00 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72   values on the r
2fd10 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
2fd20 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20  f the IN..**.** 
2fd30 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65 20  There are Btree 
2fd40 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
2fd50 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61 62  ed with each tab
2fd60 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75 72  le.  t1 uses cur
2fd70 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54  sor.** number pT
2fd80 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75  abList->a[0].iCu
2fd90 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74  rsor.  t2 uses t
2fda0 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69  he cursor pTabLi
2fdb0 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72  st->a[1].iCursor
2fdc0 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74  ..** And so fort
2fdd0 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  h.  This routine
2fde0 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
2fdf0 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44  to open those VD
2fe00 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e  BE cursors.** an
2fe10 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  d sqlite3WhereEn
2fe20 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74 68  d() generates th
2fe30 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20  e code to close 
2fe40 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  them..**.** The 
2fe50 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65  code that sqlite
2fe60 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67 65  3WhereBegin() ge
2fe70 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20 74  nerates leaves t
2fe80 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64  he cursors named
2fe90 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20  .** in pTabList 
2fea0 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69  pointing at thei
2feb0 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e  r appropriate en
2fec0 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e  tries.  The [...
2fed0 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73  ] code.** can us
2fee0 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20  e OP_Column and 
2fef0 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73  OP_Rowid opcodes
2ff00 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72   on these cursor
2ff10 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20  s to extract.** 
2ff20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61  data from the va
2ff30 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20  rious tables of 
2ff40 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
2ff50 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  If the WHERE cla
2ff60 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  use is empty, th
2ff70 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20  e foreach loops 
2ff80 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20 74  must each scan t
2ff90 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74  heir.** entire t
2ffa0 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74  ables.  Thus a t
2ffb0 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73  hree-way join is
2ffc0 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61   an O(N^3) opera
2ffd0 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a  tion.  But if.**
2ffe0 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76 65   the tables have
2fff0 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65   indices and the
30000 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20  re are terms in 
30010 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
30020 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74   that.** refer t
30030 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c  o those indices,
30040 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c   a complete tabl
30050 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76  e scan can be av
30060 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  oided and the.**
30070 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d   code will run m
30080 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73  uch faster.  Mos
30090 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66  t of the work of
300a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
300b0 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20   checking.** to 
300c0 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
300d0 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63 61   indices that ca
300e0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65  n be used to spe
300f0 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a  ed up the loop..
30100 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74  **.** Terms of t
30110 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
30120 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f  are also used to
30130 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77   limit which row
30140 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61  s actually.** ma
30150 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e  ke it to the "..
30160 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ." in the middle
30170 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41   of the loop.  A
30180 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65 61  fter each "forea
30190 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66  ch",.** terms of
301a0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
301b0 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20  e that use only 
301c0 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f  terms in that lo
301d0 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20  op and outer.** 
301e0 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61  loops are evalua
301f0 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65  ted and if false
30200 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20   a jump is made 
30210 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65  around all subse
30220 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c  quent.** inner l
30230 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20  oops (or around 
30240 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65  the "..." if the
30250 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69 74   test occurs wit
30260 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a  hin the inner-.*
30270 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a  * most loop).**.
30280 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a  ** OUTER JOINS.*
30290 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f  *.** An outer jo
302a0 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20  in of tables t1 
302b0 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70  and t2 is concep
302c0 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66  tally coded as f
302d0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
302e0 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
302f0 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66   t1 do.**      f
30300 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20  lag = 0.**      
30310 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
30320 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20  t2 do.**        
30330 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20  start:.**       
30340 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
30350 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20     flag = 1.**  
30360 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20      end.**      
30370 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a  if flag==0 then.
30380 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74  **        move t
30390 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74  he row2 cursor t
303a0 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20  o a null row.** 
303b0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72         goto star
303c0 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20  t.**      fi.** 
303d0 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44     end.**.** ORD
303e0 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f  ER BY CLAUSE PRO
303f0 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f  CESSING.**.** pO
30400 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e  rderBy is a poin
30410 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52  ter to the ORDER
30420 20 42 59 20 63 6c 61 75 73 65 20 28 6f 72 20 74   BY clause (or t
30430 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
30440 73 65 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45  se.** if the WHE
30450 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20  RE_GROUPBY flag 
30460 69 73 20 73 65 74 20 69 6e 20 77 63 74 72 6c 46  is set in wctrlF
30470 6c 61 67 73 29 20 6f 66 20 61 20 53 45 4c 45 43  lags) of a SELEC
30480 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69  T statement.** i
30490 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
304a0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
304b0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
304c0 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  or if this routi
304d0 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
304e0 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f  from an UPDATE o
304f0 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
30500 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72 42  nt, then pOrderB
30510 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  y is NULL..**.**
30520 20 54 68 65 20 69 49 64 78 43 75 72 20 70 61 72   The iIdxCur par
30530 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 63 75  ameter is the cu
30540 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61  rsor number of a
30550 6e 20 69 6e 64 65 78 2e 20 20 49 66 20 0a 2a 2a  n index.  If .**
30560 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
30570 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 49 64  ONLY is set, iId
30580 78 43 75 72 20 69 73 20 74 68 65 20 63 75 72 73  xCur is the curs
30590 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  or number of an 
305a0 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20  index.** to use 
305b0 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72  for OR clause pr
305c0 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 20 57  ocessing.  The W
305d0 48 45 52 45 20 63 6c 61 75 73 65 20 73 68 6f 75  HERE clause shou
305e0 6c 64 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 73  ld use this.** s
305f0 70 65 63 69 66 69 63 20 63 75 72 73 6f 72 2e 20  pecific cursor. 
30600 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 50 41 53   If WHERE_ONEPAS
30610 53 5f 44 45 53 49 52 45 44 20 69 73 20 73 65 74  S_DESIRED is set
30620 2c 20 74 68 65 6e 20 69 49 64 78 43 75 72 20 69  , then iIdxCur i
30630 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  s.** the first c
30640 75 72 73 6f 72 20 69 6e 20 61 6e 20 61 72 72 61  ursor in an arra
30650 79 20 6f 66 20 63 75 72 73 6f 72 73 20 66 6f 72  y of cursors for
30660 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20 20 69   all indices.  i
30670 49 64 78 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a  IdxCur should.**
30680 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   be used to comp
30690 75 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ute the appropri
306a0 61 74 65 20 63 75 72 73 6f 72 20 64 65 70 65 6e  ate cursor depen
306b0 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 69 6e  ding on which in
306c0 64 65 78 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a  dex is.** used..
306d0 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71  */.WhereInfo *sq
306e0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
306f0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
30700 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
30710 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
30720 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
30730 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 46 52 4f  bList,    /* FRO
30740 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74  M clause: A list
30750 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74   of all tables t
30760 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
30770 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
30780 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
30790 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
307a0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
307b0 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44  rBy,   /* An ORD
307c0 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72  ER BY clause, or
307d0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
307e0 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74 2c  ist *pResultSet,
307f0 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 20 6f   /* Result set o
30800 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  f the query */. 
30810 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c   u16 wctrlFlags,
30820 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
30830 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61   the WHERE_* fla
30840 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71  gs defined in sq
30850 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69  liteInt.h */.  i
30860 6e 74 20 69 49 64 78 43 75 72 20 20 20 20 20 20  nt iIdxCur      
30870 20 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45       /* If WHERE
30880 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69  _ONETABLE_ONLY i
30890 73 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72  s set, index cur
308a0 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  sor number */.){
308b0 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66  .  int nByteWInf
308c0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
308d0 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f   Num. bytes allo
308e0 63 61 74 65 64 20 66 6f 72 20 57 68 65 72 65 49  cated for WhereI
308f0 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20  nfo struct */.  
30900 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20  int nTabList;   
30910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
30920 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
30930 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a   in pTabList */.
30940 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
30950 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nfo;         /* 
30960 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  Will become the 
30970 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
30980 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
30990 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
309a0 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a  rse->pVdbe;   /*
309b0 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74   The virtual dat
309c0 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  abase engine */.
309d0 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
309e0 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dy;          /* 
309f0 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  Cursors that are
30a00 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f   not yet positio
30a10 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ned */.  WhereLo
30a20 6f 70 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20  opBuilder sWLB; 
30a30 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
30a40 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a  Loop builder */.
30a50 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a    WhereMaskSet *
30a60 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20  pMaskSet;    /* 
30a70 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  The expression m
30a80 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65  ask set */.  Whe
30a90 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
30aa0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
30ab0 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49  gle level in pWI
30ac0 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68  nfo->a[] */.  Wh
30ad0 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20  ereLoop *pLoop; 
30ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
30af0 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ter to a single 
30b00 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
30b10 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20   */.  int ii;   
30b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b30 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
30b40 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
30b50 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
30b60 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
30b70 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
30b80 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
30b90 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
30ba0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 0a 20 20 2f 2a  n code */...  /*
30bb0 20 56 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61   Variable initia
30bc0 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62  lization */.  db
30bd0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
30be0 20 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c 20 30   memset(&sWLB, 0
30bf0 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b  , sizeof(sWLB));
30c00 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  .  sWLB.pOrderBy
30c10 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20   = pOrderBy;..  
30c20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44  /* Disable the D
30c30 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61  ISTINCT optimiza
30c40 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44  tion if SQLITE_D
30c50 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65  istinctOpt is se
30c60 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74  t via.  ** sqlit
30c70 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c  e3_test_ctrl(SQL
30c80 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
30c90 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20  IMIZATIONS,...) 
30ca0 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
30cb0 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
30cc0 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63  , SQLITE_Distinc
30cd0 74 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74  tOpt) ){.    wct
30ce0 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52  rlFlags &= ~WHER
30cf0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b  E_WANT_DISTINCT;
30d00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  .  }..  /* The n
30d10 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20  umber of tables 
30d20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
30d30 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
30d40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
30d50 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69   ** bits in a Bi
30d60 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65  tmask .  */.  te
30d70 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74  stcase( pTabList
30d80 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20  ->nSrc==BMS );. 
30d90 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
30da0 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73  Src>BMS ){.    s
30db0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
30dc0 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20  Parse, "at most 
30dd0 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a  %d tables in a j
30de0 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20  oin", BMS);.    
30df0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
30e00 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
30e10 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72  n normally gener
30e20 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f  ates a nested lo
30e30 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  op for all table
30e40 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c  s in .  ** pTabL
30e50 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65  ist.  But if the
30e60 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
30e70 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74  ONLY flag is set
30e80 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64  , then we should
30e90 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72  .  ** only gener
30ea0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
30eb0 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20   first table in 
30ec0 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73  pTabList and ass
30ed0 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e  ume that.  ** an
30ee0 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  y cursors associ
30ef0 61 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71  ated with subseq
30f00 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20  uent tables are 
30f10 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
30f20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d   */.  nTabList =
30f30 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
30f40 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
30f50 4c 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69  LY) ? 1 : pTabLi
30f60 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20  st->nSrc;..  /* 
30f70 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
30f80 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72  tialize the Wher
30f90 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
30fa0 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
30fb0 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e   the.  ** return
30fc0 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65   value. A single
30fd0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75   allocation is u
30fe0 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
30ff0 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20   WhereInfo.  ** 
31000 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74  struct, the cont
31010 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66  ents of WhereInf
31020 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65  o.a[], the Where
31030 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
31040 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68  .  ** and the Wh
31050 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63  ereMaskSet struc
31060 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72  ture. Since Wher
31070 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73  eClause contains
31080 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20   an 8-byte.  ** 
31090 66 69 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d  field (type Bitm
310a0 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20  ask) it must be 
310b0 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d  aligned on an 8-
310c0 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e  byte boundary on
310d0 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69  .  ** some archi
310e0 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20  tectures. Hence 
310f0 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c  the ROUND8() bel
31100 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65  ow..  */.  nByte
31110 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73  WInfo = ROUND8(s
31120 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29  izeof(WhereInfo)
31130 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69  +(nTabList-1)*si
31140 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29  zeof(WhereLevel)
31150 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  );.  pWInfo = sq
31160 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
31170 6f 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f  o(db, nByteWInfo
31180 20 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c   + sizeof(WhereL
31190 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d  oop));.  if( db-
311a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
311b0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
311c0 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
311d0 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a      pWInfo = 0;.
311e0 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
311f0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ginError;.  }.  
31200 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
31210 50 61 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f  Pass[0] = pWInfo
31220 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31  ->aiCurOnePass[1
31230 5d 20 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f  ] = -1;.  pWInfo
31240 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c  ->nLevel = nTabL
31250 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  ist;.  pWInfo->p
31260 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
31270 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69    pWInfo->pTabLi
31280 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
31290 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
312a0 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
312b0 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
312c0 65 74 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b  et = pResultSet;
312d0 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  .  pWInfo->iBrea
312e0 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
312f0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70  akeLabel(v);.  p
31300 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
31310 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a  s = wctrlFlags;.
31320 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e    pWInfo->savedN
31330 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72  QueryLoop = pPar
31340 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a  se->nQueryLoop;.
31350 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57    pMaskSet = &pW
31360 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a  Info->sMaskSet;.
31370 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20    sWLB.pWInfo = 
31380 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70  pWInfo;.  sWLB.p
31390 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57  WC = &pWInfo->sW
313a0 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d  C;.  sWLB.pNew =
313b0 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28   (WhereLoop*)(((
313c0 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42  char*)pWInfo)+nB
313d0 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73  yteWInfo);.  ass
313e0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
313f0 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70  ALIGNMENT(sWLB.p
31400 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72 65 4c  New) );.  whereL
31410 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65  oopInit(sWLB.pNe
31420 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  w);.#ifdef SQLIT
31430 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42 2e 70  E_DEBUG.  sWLB.p
31440 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a  New->cId = '*';.
31450 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c  #endif..  /* Spl
31460 69 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  it the WHERE cla
31470 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74  use into separat
31480 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  e subexpressions
31490 20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a   where each.  **
314a0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69   subexpression i
314b0 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61  s separated by a
314c0 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
314d0 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53    */.  initMaskS
314e0 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20  et(pMaskSet);.  
314f0 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
31500 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57  &pWInfo->sWC, pW
31510 49 6e 66 6f 29 3b 0a 20 20 77 68 65 72 65 53 70  Info);.  whereSp
31520 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  lit(&pWInfo->sWC
31530 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44  , pWhere, TK_AND
31540 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65  );.  sqlite3Code
31550 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
31560 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73  rse, -1); /* Ins
31570 65 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  ert the cookie v
31580 65 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a  erifier Goto */.
31590 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61      .  /* Specia
315a0 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20  l case: a WHERE 
315b0 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63  clause that is c
315c0 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61  onstant.  Evalua
315d0 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72  te the.  ** expr
315e0 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65  ession and eithe
315f0 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20  r jump over all 
31600 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66  of the code or f
31610 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20  all thru..  */. 
31620 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 57   for(ii=0; ii<sW
31630 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69  LB.pWC->nTerm; i
31640 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 54  i++){.    if( nT
31650 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c  abList==0 || sql
31660 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
31670 6e 74 4e 6f 74 4a 6f 69 6e 28 73 57 4c 42 2e 70  ntNotJoin(sWLB.p
31680 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29  WC->a[ii].pExpr)
31690 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
316a0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
316b0 72 73 65 2c 20 73 57 4c 42 2e 70 57 43 2d 3e 61  rse, sWLB.pWC->a
316c0 5b 69 69 5d 2e 70 45 78 70 72 2c 20 70 57 49 6e  [ii].pExpr, pWIn
316d0 66 6f 2d 3e 69 42 72 65 61 6b 2c 0a 20 20 20 20  fo->iBreak,.    
316e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316f0 20 20 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50       SQLITE_JUMP
31700 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
31710 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 77  WLB.pWC->a[ii].w
31720 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
31730 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ODED;.    }.  }.
31740 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
31750 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75  se: No FROM clau
31760 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54  se.  */.  if( nT
31770 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  abList==0 ){.   
31780 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20   if( pOrderBy ) 
31790 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d  pWInfo->bOBSat =
317a0 20 31 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72   1;.    if( wctr
317b0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
317c0 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a  ANT_DISTINCT ){.
317d0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
317e0 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
317f0 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b  DISTINCT_UNIQUE;
31800 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
31810 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72   Assign a bit fr
31820 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74  om the bitmask t
31830 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
31840 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
31850 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
31860 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73  assigning bitmas
31870 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d  k values to FROM
31880 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c   clause cursors,
31890 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a   it must be.  **
318a0 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 69   the case that i
318b0 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61  f X is the bitma
318c0 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20  sk for the N-th 
318d0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
318e0 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62   then.  ** the b
318f0 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46  itmask for all F
31900 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
31910 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
31920 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20  the N-th term.  
31930 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41  ** is (X-1).   A
31940 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
31950 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  m the ON clause 
31960 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63  of a LEFT JOIN c
31970 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20  an use.  ** its 
31980 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
31990 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69  able value to fi
319a0 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f  nd the bitmask o
319b0 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
319c0 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  e.  ** of the jo
319d0 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67  in.  Subtracting
319e0 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69   one from the ri
319f0 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73  ght table bitmas
31a00 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62  k gives a.  ** b
31a10 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74  itmask for all t
31a20 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
31a30 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  t of the join.  
31a40 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d  Knowing the bitm
31a50 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c  ask.  ** for all
31a60 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
31a70 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  eft of a left jo
31a80 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e  in is important.
31a90 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a    Ticket #3015..
31aa0 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
31ab0 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65  hat bitmasks are
31ac0 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c   created for all
31ad0 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20   pTabList->nSrc 
31ae0 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70  tables in.  ** p
31af0 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73  TabList, not jus
31b00 74 20 74 68 65 20 66 69 72 73 74 20 6e 54 61 62  t the first nTab
31b10 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54  List tables.  nT
31b20 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c  abList is normal
31b30 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f  ly.  ** equal to
31b40 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20   pTabList->nSrc 
31b50 62 75 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f  but might be sho
31b60 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74  rtened to 1 if t
31b70 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f 4e  he.  ** WHERE_ON
31b80 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67  ETABLE_ONLY flag
31b90 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   is set..  */.  
31ba0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61  for(ii=0; ii<pTa
31bb0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b  bList->nSrc; ii+
31bc0 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61  +){.    createMa
31bd0 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
31be0 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75  bList->a[ii].iCu
31bf0 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  rsor);.  }.#ifnd
31c00 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20  ef NDEBUG.  {.  
31c10 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c    Bitmask toTheL
31c20 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  eft = 0;.    for
31c30 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69  (ii=0; ii<pTabLi
31c40 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b  st->nSrc; ii++){
31c50 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
31c60 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
31c70 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
31c80 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  [ii].iCursor);. 
31c90 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6d 2d       assert( (m-
31ca0 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b  1)==toTheLeft );
31cb0 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65 66 74  .      toTheLeft
31cc0 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d   |= m;.    }.  }
31cd0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
31ce0 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65  alyze all of the
31cf0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e   subexpressions.
31d00 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72    Note that expr
31d10 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a  Analyze() might.
31d20 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72    ** add new vir
31d30 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20  tual terms onto 
31d40 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
31d50 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65  HERE clause.  We
31d60 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e   do not.  ** wan
31d70 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65  t to analyze the
31d80 73 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  se virtual terms
31d90 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79  , so start analy
31da0 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a  zing at the end.
31db0 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f    ** and work fo
31dc0 72 77 61 72 64 20 73 6f 20 74 68 61 74 20 74 68  rward so that th
31dd0 65 20 61 64 64 65 64 20 76 69 72 74 75 61 6c 20  e added virtual 
31de0 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20  terms are never 
31df0 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a  processed..  */.
31e00 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
31e10 28 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e  (pTabList, &pWIn
31e20 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28 20  fo->sWC);.  if( 
31e30 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
31e40 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
31e50 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
31e60 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f  }..  /* If the O
31e70 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55  RDER BY (or GROU
31e80 50 20 42 59 29 20 63 6c 61 75 73 65 20 63 6f 6e  P BY) clause con
31e90 74 61 69 6e 73 20 72 65 66 65 72 65 6e 63 65 73  tains references
31ea0 20 74 6f 20 67 65 6e 65 72 61 6c 0a 20 20 2a 2a   to general.  **
31eb0 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 74 68   expressions, th
31ec0 65 6e 20 77 65 20 77 6f 6e 27 74 20 62 65 20 61  en we won't be a
31ed0 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 69  ble to satisfy i
31ee0 74 20 75 73 69 6e 67 20 69 6e 64 69 63 65 73 2c  t using indices,
31ef0 20 73 6f 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61   so.  ** go ahea
31f00 64 20 61 6e 64 20 64 69 73 61 62 6c 65 20 69 74  d and disable it
31f10 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
31f20 20 70 4f 72 64 65 72 42 79 20 26 26 20 28 77 63   pOrderBy && (wc
31f30 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
31f40 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21  _WANT_DISTINCT)!
31f50 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 69  =0 ){.    for(ii
31f60 3d 30 3b 20 69 69 3c 70 4f 72 64 65 72 42 79 2d  =0; ii<pOrderBy-
31f70 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
31f80 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
31f90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
31fa0 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72  ipCollate(pOrder
31fb0 42 79 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29  By->a[ii].pExpr)
31fc0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
31fd0 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
31fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e   ){.        pWIn
31ff0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  fo->pOrderBy = p
32000 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
32010 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
32020 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70    }else if( pExp
32030 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
32040 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
32050 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
32060 0a 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61  ..  if( wctrlFla
32070 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
32080 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
32090 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 52 65  if( isDistinctRe
320a0 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20  dundant(pParse, 
320b0 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66  pTabList, &pWInf
320c0 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53  o->sWC, pResultS
320d0 65 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  et) ){.      /* 
320e0 54 68 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72  The DISTINCT mar
320f0 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73  king is pointles
32100 73 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a  s.  Ignore it. *
32110 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  /.      pWInfo->
32120 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
32130 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
32140 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  E;.    }else if(
32150 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
32160 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20        /* Try to 
32170 4f 52 44 45 52 20 42 59 20 74 68 65 20 72 65 73  ORDER BY the res
32180 75 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20  ult set to make 
32190 64 69 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73  distinct process
321a0 69 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20  ing easier */.  
321b0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72      pWInfo->wctr
321c0 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  lFlags |= WHERE_
321d0 44 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20  DISTINCTBY;.    
321e0 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
321f0 42 79 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b  By = pResultSet;
32200 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
32210 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57   Construct the W
32220 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
32230 20 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43 45   */.  WHERETRACE
32240 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70  (0xffff,("*** Op
32250 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a  timizer Start **
32260 2a 5c 6e 22 29 29 3b 0a 20 20 2f 2a 20 44 69 73  *\n"));.  /* Dis
32270 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f  play all terms o
32280 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
32290 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  se */.#if define
322a0 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  d(WHERETRACE_ENA
322b0 42 4c 45 44 29 20 26 26 20 64 65 66 69 6e 65 64  BLED) && defined
322c0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54  (SQLITE_ENABLE_T
322d0 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20 69  REE_EXPLAIN).  i
322e0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
322f0 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
32300 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56      int i;.    V
32310 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
32320 3e 70 56 64 62 65 3b 0a 20 20 20 20 73 71 6c 69  >pVdbe;.    sqli
32330 74 65 33 45 78 70 6c 61 69 6e 42 65 67 69 6e 28  te3ExplainBegin(
32340 76 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  v);.    for(i=0;
32350 20 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65   i<sWLB.pWC->nTe
32360 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; i++){.      
32370 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
32380 69 6e 74 66 28 76 2c 20 22 23 25 2d 32 64 20 22  intf(v, "#%-2d "
32390 2c 20 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , i);.      sqli
323a0 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 76  te3ExplainPush(v
323b0 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 45 78  );.      whereEx
323c0 70 6c 61 69 6e 54 65 72 6d 28 76 2c 20 26 73 57  plainTerm(v, &sW
323d0 4c 42 2e 70 57 43 2d 3e 61 5b 69 5d 29 3b 0a 20  LB.pWC->a[i]);. 
323e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
323f0 61 69 6e 50 6f 70 28 76 29 3b 0a 20 20 20 20 20  ainPop(v);.     
32400 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
32410 4c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  L(v);.    }.    
32420 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 46 69  sqlite3ExplainFi
32430 6e 69 73 68 28 76 29 3b 0a 20 20 20 20 73 71 6c  nish(v);.    sql
32440 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
32450 22 25 73 22 2c 20 73 71 6c 69 74 65 33 56 64 62  "%s", sqlite3Vdb
32460 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28 76 29 29  eExplanation(v))
32470 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
32480 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c  f( nTabList!=1 |
32490 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28  | whereShortCut(
324a0 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20  &sWLB)==0 ){.   
324b0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
324c0 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20  ddAll(&sWLB);.  
324d0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
324e0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
324f0 0a 20 20 0a 20 20 20 20 2f 2a 20 44 69 73 70 6c  .  .    /* Displ
32500 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68  ay all of the Wh
32510 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
32520 69 66 20 77 68 65 72 65 74 72 61 63 65 20 69 73  if wheretrace is
32530 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 23 69 66 64   enabled */.#ifd
32540 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
32550 41 42 4c 45 44 20 2f 2a 20 21 3d 30 20 2a 2f 0a  ABLED /* !=0 */.
32560 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
32570 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20  hereTrace ){.   
32580 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b     WhereLoop *p;
32590 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
325a0 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20      static char 
325b0 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33  zLabel[] = "0123
325c0 34 35 36 37 38 39 61 62 63 64 65 66 67 68 69 6a  456789abcdefghij
325d0 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a  klmnopqrstuvwyxz
325e0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
325f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32600 20 20 20 20 20 20 20 20 20 22 41 42 43 44 45 46           "ABCDEF
32610 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
32620 57 59 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72  WYXZ";.      for
32630 28 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  (p=pWInfo->pLoop
32640 73 2c 20 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e  s, i=0; p; p=p->
32650 70 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b  pNextLoop, i++){
32660 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 49 64 20  .        p->cId 
32670 3d 20 7a 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f  = zLabel[i%sizeo
32680 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20  f(zLabel)];.    
32690 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
326a0 6e 74 28 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b  nt(p, sWLB.pWC);
326b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
326c0 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 77 68 65  endif.  .    whe
326d0 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49  rePathSolver(pWI
326e0 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  nfo, 0);.    if(
326f0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
32700 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
32710 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66  ginError;.    if
32720 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
32730 42 79 20 29 7b 0a 20 20 20 20 20 20 20 77 68 65  By ){.       whe
32740 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49  rePathSolver(pWI
32750 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  nfo, pWInfo->nRo
32760 77 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20 20 20  wOut+1);.       
32770 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
32780 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
32790 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20  eBeginError;.   
327a0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49   }.  }.  if( pWI
327b0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  nfo->pOrderBy==0
327c0 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26   && (db->flags &
327d0 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f   SQLITE_ReverseO
327e0 72 64 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20  rder)!=0 ){.    
327f0 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
32800 20 3d 20 28 42 69 74 6d 61 73 6b 29 28 2d 31 29   = (Bitmask)(-1)
32810 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
32820 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45  se->nErr || NEVE
32830 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  R(db->mallocFail
32840 65 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ed) ){.    goto 
32850 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
32860 0a 20 20 7d 0a 23 69 66 64 65 66 20 57 48 45 52  .  }.#ifdef WHER
32870 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
32880 2a 20 21 3d 30 20 2a 2f 0a 20 20 69 66 28 20 73  * !=0 */.  if( s
32890 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
328a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   ){.    int ii;.
328b0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
328c0 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c  Printf("---- Sol
328d0 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20  ution nRow=%d", 
328e0 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29  pWInfo->nRowOut)
328f0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
32900 2d 3e 62 4f 42 53 61 74 20 29 7b 0a 20 20 20 20  ->bOBSat ){.    
32910 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
32920 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59 3d 30  intf(" ORDERBY=0
32930 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e  x%llx", pWInfo->
32940 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a  revMask);.    }.
32950 20 20 20 20 73 77 69 74 63 68 28 20 70 57 49 6e      switch( pWIn
32960 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 29 7b  fo->eDistinct ){
32970 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
32980 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
32990 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E: {.        sql
329a0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
329b0 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 69 71  "  DISTINCT=uniq
329c0 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ue");.        br
329d0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
329e0 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
329f0 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20  STINCT_ORDERED: 
32a00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
32a10 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
32a20 44 49 53 54 49 4e 43 54 3d 6f 72 64 65 72 65 64  DISTINCT=ordered
32a30 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ");.        brea
32a40 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
32a50 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
32a60 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20  INCT_UNORDERED: 
32a70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
32a80 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
32a90 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72  DISTINCT=unorder
32aa0 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ed");.        br
32ab0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
32ac0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
32ad0 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
32ae0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
32af0 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i<pWInfo->nLevel
32b00 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77  ; ii++){.      w
32b10 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57  hereLoopPrint(pW
32b20 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f  Info->a[ii].pWLo
32b30 6f 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20  op, sWLB.pWC);. 
32b40 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
32b50 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20    /* Attempt to 
32b60 6f 6d 69 74 20 74 61 62 6c 65 73 20 66 72 6f 6d  omit tables from
32b70 20 74 68 65 20 6a 6f 69 6e 20 74 68 61 74 20 64   the join that d
32b80 6f 20 6e 6f 74 20 65 66 66 65 63 74 20 74 68 65  o not effect the
32b90 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 66 28   result */.  if(
32ba0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e   pWInfo->nLevel>
32bb0 3d 32 0a 20 20 20 26 26 20 70 52 65 73 75 6c 74  =2.   && pResult
32bc0 53 65 74 21 3d 30 0a 20 20 20 26 26 20 4f 70 74  Set!=0.   && Opt
32bd0 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
32be0 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74  (db, SQLITE_Omit
32bf0 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20  NoopJoin).  ){. 
32c00 20 20 20 42 69 74 6d 61 73 6b 20 74 61 62 55 73     Bitmask tabUs
32c10 65 64 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62  ed = exprListTab
32c20 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
32c30 2c 20 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20  , pResultSet);. 
32c40 20 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72 64     if( sWLB.pOrd
32c50 65 72 42 79 20 29 20 74 61 62 55 73 65 64 20 7c  erBy ) tabUsed |
32c60 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
32c70 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 73  sage(pMaskSet, s
32c80 57 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20  WLB.pOrderBy);. 
32c90 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f     while( pWInfo
32ca0 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20  ->nLevel>=2 ){. 
32cb0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
32cc0 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20  pTerm, *pEnd;.  
32cd0 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e      pLoop = pWIn
32ce0 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c  fo->a[pWInfo->nL
32cf0 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a  evel-1].pWLoop;.
32d00 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66        if( (pWInf
32d10 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
32d20 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 6a 6f 69 6e  Loop->iTab].join
32d30 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d  type & JT_LEFT)=
32d40 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
32d50 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
32d60 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
32d70 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20 20 20  ISTINCT)==0.    
32d80 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
32d90 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
32da0 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20 20 29  EROW)==0.      )
32db0 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
32dc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
32dd0 66 28 20 28 74 61 62 55 73 65 64 20 26 20 70 4c  f( (tabUsed & pL
32de0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d  oop->maskSelf)!=
32df0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
32e00 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57 43   pEnd = sWLB.pWC
32e10 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d 3e  ->a + sWLB.pWC->
32e20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72  nTerm;.      for
32e30 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d  (pTerm=sWLB.pWC-
32e40 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20  >a; pTerm<pEnd; 
32e50 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
32e60 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
32e70 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d  ereqAll & pLoop-
32e80 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a 20 20  >maskSelf)!=0.  
32e90 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72 48         && !ExprH
32ea0 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
32eb0 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
32ec0 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 29 7b  Join).        ){
32ed0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
32ee0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32ef0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54    }.      if( pT
32f00 65 72 6d 3c 70 45 6e 64 20 29 20 62 72 65 61 6b  erm<pEnd ) break
32f10 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  ;.      WHERETRA
32f20 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d 3e 20  CE(0xffff, ("-> 
32f30 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f 74  drop loop %c not
32f40 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d   used\n", pLoop-
32f50 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20 70 57  >cId));.      pW
32f60 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a  Info->nLevel--;.
32f70 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74 2d 2d        nTabList--
32f80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48  ;.    }.  }.  WH
32f90 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c  ERETRACE(0xffff,
32fa0 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
32fb0 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29  Finished ***\n")
32fc0 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61  );.  pWInfo->pPa
32fd0 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
32fe0 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  += pWInfo->nRowO
32ff0 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ut;..  /* If the
33000 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50   caller is an UP
33010 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
33020 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73  tatement that is
33030 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a   requesting.  **
33040 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61   to use a one-pa
33050 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65  ss algorithm, de
33060 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20  termine if this 
33070 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  is appropriate..
33080 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61 73    ** The one-pas
33090 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79  s algorithm only
330a0 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57 48   works if the WH
330b0 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
330c0 72 61 69 6e 73 0a 20 20 2a 2a 20 74 68 65 20 73  rains.  ** the s
330d0 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70 64 61  tatement to upda
330e0 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e  te a single row.
330f0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
33100 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
33110 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
33120 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66  RED)==0 || pWInf
33130 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a  o->nLevel==1 );.
33140 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
33150 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
33160 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 0a 20  S_DESIRED)!=0 . 
33170 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 61 5b    && (pWInfo->a[
33180 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  0].pWLoop->wsFla
33190 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
331a0 57 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57 49  W)!=0 ){.    pWI
331b0 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d  nfo->okOnePass =
331c0 20 31 3b 0a 20 20 20 20 69 66 28 20 48 61 73 52   1;.    if( HasR
331d0 6f 77 69 64 28 70 54 61 62 4c 69 73 74 2d 3e 61  owid(pTabList->a
331e0 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20  [0].pTab) ){.   
331f0 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e     pWInfo->a[0].
33200 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  pWLoop->wsFlags 
33210 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e  &= ~WHERE_IDX_ON
33220 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  LY;.    }.  }.. 
33230 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62   /* Open all tab
33240 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c  les in the pTabL
33250 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69  ist and any indi
33260 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72  ces selected for
33270 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20  .  ** searching 
33280 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20  those tables..  
33290 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20  */.  notReady = 
332a0 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66  ~(Bitmask)0;.  f
332b0 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  or(ii=0, pLevel=
332c0 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54  pWInfo->a; ii<nT
332d0 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c  abList; ii++, pL
332e0 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62  evel++){.    Tab
332f0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a  le *pTab;     /*
33300 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   Table to open *
33310 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20  /.    int iDb;  
33320 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
33330 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  of database cont
33340 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64  aining table/ind
33350 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  ex */.    struct
33360 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
33370 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54  TabItem;..    pT
33380 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
33390 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
333a0 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d  rom];.    pTab =
333b0 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
333c0 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
333d0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
333e0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
333f0 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  a);.    pLoop = 
33400 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
33410 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74      if( (pTab->t
33420 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
33430 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54  emeral)!=0 || pT
33440 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
33450 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74       if( pTab->t
33460 61 62 46 6c 61 67 73 20 26 20 54 46 5f 52 65 63  abFlags & TF_Rec
33470 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
33480 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61    int iCur = pTa
33490 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
334a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
334b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
334c0 4f 70 65 6e 45 70 68 72 65 61 64 65 72 2c 20 69  OpenEphreader, i
334d0 43 75 72 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29  Cur, pTab->tnum)
334e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
334f0 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 64 6f 20  /* Otherwise do 
33500 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d  nothing */.    }
33510 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c  else.#ifndef SQL
33520 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
33530 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70  TABLE.    if( (p
33540 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
33550 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
33560 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LE)!=0 ){.      
33570 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61  const char *pVTa
33580 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  b = (const char 
33590 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  *)sqlite3GetVTab
335a0 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
335b0 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70      int iCur = p
335c0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
335d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
335e0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
335f0 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20  VOpen, iCur, 0, 
33600 30 2c 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41  0, pVTab, P4_VTA
33610 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  B);.    }else if
33620 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
33630 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  ) ){.      /* no
33640 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a  op */.    }else.
33650 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
33660 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
33670 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
33680 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
33690 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
336a0 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c  ERE_OMIT_OPEN_CL
336b0 4f 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  OSE)==0 ){.     
336c0 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65   int op = OP_Ope
336d0 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 69 66 28  nRead;.      if(
336e0 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61   pWInfo->okOnePa
336f0 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70  ss ){.        op
33700 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b   = OP_OpenWrite;
33710 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
33720 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d  >aiCurOnePass[0]
33730 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
33740 72 73 6f 72 3b 0a 20 20 20 20 20 20 7d 3b 0a 20  rsor;.      };. 
33750 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
33760 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
33770 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c  abItem->iCursor,
33780 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b   iDb, pTab, op);
33790 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
337a0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
337b0 3d 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  ==pLevel->iTabCu
337c0 72 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  r );.      testc
337d0 61 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b  ase( !pWInfo->ok
337e0 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62 2d  OnePass && pTab-
337f0 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a  >nCol==BMS-1 );.
33800 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
33810 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
33820 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  ss && pTab->nCol
33830 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69  ==BMS );.      i
33840 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  f( !pWInfo->okOn
33850 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e  ePass && pTab->n
33860 43 6f 6c 3c 42 4d 53 20 26 26 20 48 61 73 52 6f  Col<BMS && HasRo
33870 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
33880 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d       Bitmask b =
33890 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73   pTabItem->colUs
338a0 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ed;.        int 
338b0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  n = 0;.        f
338c0 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20  or(; b; b=b>>1, 
338d0 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73  n++){}.        s
338e0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
338f0 50 34 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62  P4(v, sqlite3Vdb
33900 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d  eCurrentAddr(v)-
33910 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  1, .            
33920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33930 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
33940 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b  R(n), P4_INT32);
33950 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
33960 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29   n<=pTab->nCol )
33970 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
33980 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
33990 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
339a0 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
339b0 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
339c0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
339d0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
339e0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
339f0 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65  ED ){.      Inde
33a00 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e  x *pIx = pLoop->
33a10 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
33a20 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78        int iIndex
33a30 43 75 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  Cur;.      int o
33a40 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b  p = OP_OpenRead;
33a50 0a 20 20 20 20 20 20 2f 2a 20 69 49 64 78 43 75  .      /* iIdxCu
33a60 72 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  r is always set 
33a70 69 66 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65  if to a positive
33a80 20 76 61 6c 75 65 20 69 66 20 4f 4e 45 50 41 53   value if ONEPAS
33a90 53 20 69 73 20 70 6f 73 73 69 62 6c 65 20 2a 2f  S is possible */
33aa0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
33ab0 49 64 78 43 75 72 21 3d 30 20 7c 7c 20 28 70 57  IdxCur!=0 || (pW
33ac0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
33ad0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
33ae0 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 29 3b 0a  _DESIRED)==0 );.
33af0 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
33b00 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 29 7b 0a 20  ->okOnePass ){. 
33b10 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4a         Index *pJ
33b20 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
33b30 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
33b40 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69     iIndexCur = i
33b50 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
33b60 61 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61  assert( wctrlFla
33b70 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
33b80 53 53 5f 44 45 53 49 52 45 44 20 29 3b 0a 20 20  SS_DESIRED );.  
33b90 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
33ba0 41 59 53 28 70 4a 29 20 26 26 20 70 4a 21 3d 70  AYS(pJ) && pJ!=p
33bb0 49 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Ix ){.          
33bc0 69 49 6e 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20  iIndexCur++;.   
33bd0 20 20 20 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e         pJ = pJ->
33be0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
33bf0 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  .        op = OP
33c00 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20  _OpenWrite;.    
33c10 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75      pWInfo->aiCu
33c20 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 69 49  rOnePass[1] = iI
33c30 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 7d  ndexCur;.      }
33c40 65 6c 73 65 20 69 66 28 20 69 49 64 78 43 75 72  else if( iIdxCur
33c50 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
33c60 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
33c70 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20  _ONLY)!=0 ){.   
33c80 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d       iIndexCur =
33c90 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20   iIdxCur;.      
33ca0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
33cb0 49 6e 64 65 78 43 75 72 20 3d 20 70 50 61 72 73  IndexCur = pPars
33cc0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
33cd0 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d   }.      pLevel-
33ce0 3e 69 49 64 78 43 75 72 20 3d 20 69 49 6e 64 65  >iIdxCur = iInde
33cf0 78 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65  xCur;.      asse
33d00 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61  rt( pIx->pSchema
33d10 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
33d20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
33d30 20 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b   iIndexCur>=0 );
33d40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
33d50 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
33d60 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e  iIndexCur, pIx->
33d70 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
33d80 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
33d90 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  P4KeyInfo(pParse
33da0 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 56 64  , pIx);.      Vd
33db0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
33dc0 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29  s", pIx->zName))
33dd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
33de0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
33df0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
33e00 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26  ;.    notReady &
33e10 3d 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e  = ~getMask(&pWIn
33e20 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 54  fo->sMaskSet, pT
33e30 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29  abItem->iCursor)
33e40 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
33e50 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  iTop = sqlite3Vd
33e60 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
33e70 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
33e80 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
33e90 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
33ea0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
33eb0 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74  the code to do t
33ec0 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68  he search.  Each
33ed0 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
33ee0 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20  e for.  ** loop 
33ef0 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20  below generates 
33f00 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
33f10 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  e nested loop of
33f20 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f   the VM.  ** pro
33f30 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74  gram..  */.  not
33f40 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
33f50 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  k)0;.  for(ii=0;
33f60 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69   ii<nTabList; ii
33f70 2b 2b 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20  ++){.    pLevel 
33f80 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d  = &pWInfo->a[ii]
33f90 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
33fa0 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
33fb0 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28 70  INDEX.    if( (p
33fc0 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77  Level->pWLoop->w
33fd0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
33fe0 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b  UTO_INDEX)!=0 ){
33ff0 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74  .      construct
34000 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70  AutomaticIndex(p
34010 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e  Parse, &pWInfo->
34020 73 57 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20  sWC,.           
34030 20 20 20 20 20 26 70 54 61 62 4c 69 73 74 2d 3e       &pTabList->
34040 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
34050 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76  , notReady, pLev
34060 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  el);.      if( d
34070 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
34080 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
34090 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65  nError;.    }.#e
340a0 6e 64 69 66 0a 20 20 20 20 65 78 70 6c 61 69 6e  ndif.    explain
340b0 4f 6e 65 53 63 61 6e 28 70 50 61 72 73 65 2c 20  OneScan(pParse, 
340c0 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c  pTabList, pLevel
340d0 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46  , ii, pLevel->iF
340e0 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 29  rom, wctrlFlags)
340f0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  ;.    pLevel->ad
34100 64 72 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33  drBody = sqlite3
34110 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
34120 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79  v);.    notReady
34130 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74   = codeOneLoopSt
34140 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20  art(pWInfo, ii, 
34150 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70  notReady);.    p
34160 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
34170 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43   = pLevel->addrC
34180 6f 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ont;.  }..  /* D
34190 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64 62 65 4d 6f  one. */.  VdbeMo
341a0 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  duleComment((v, 
341b0 22 42 65 67 69 6e 20 57 48 45 52 45 2d 63 6f 72  "Begin WHERE-cor
341c0 65 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  e"));.  return p
341d0 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  WInfo;..  /* Jum
341e0 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63  p here if malloc
341f0 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42   fails */.whereB
34200 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28  eginError:.  if(
34210 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70   pWInfo ){.    p
34220 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
34230 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  p = pWInfo->save
34240 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20  dNQueryLoop;.   
34250 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64   whereInfoFree(d
34260 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
34270 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
34280 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
34290 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
342a0 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f  RE loop.  See co
342b0 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71  mments on .** sq
342c0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
342d0 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
342e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
342f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65  .void sqlite3Whe
34300 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20  reEnd(WhereInfo 
34310 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73  *pWInfo){.  Pars
34320 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
34330 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64  fo->pParse;.  Vd
34340 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
34350 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
34360 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
34370 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  evel;.  WhereLoo
34380 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c  p *pLoop;.  SrcL
34390 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
343a0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
343b0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
343c0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
343d0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f   /* Generate loo
343e0 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  p termination co
343f0 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4d  de..  */.  VdbeM
34400 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
34410 20 22 45 6e 64 20 57 48 45 52 45 2d 63 6f 72 65   "End WHERE-core
34420 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  "));.  sqlite3Ex
34430 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
34440 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57  rse);.  for(i=pW
34450 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20  Info->nLevel-1; 
34460 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
34470 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 70 4c  int addr;.    pL
34480 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
34490 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  a[i];.    pLoop 
344a0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
344b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
344c0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
344d0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
344e0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  t);.    if( pLev
344f0 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  el->op!=OP_Noop 
34500 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
34510 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c  VdbeAddOp2(v, pL
34520 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c  evel->op, pLevel
34530 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  ->p1, pLevel->p2
34540 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
34550 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
34560 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20  pLevel->p5);.   
34570 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70   }.    if( pLoop
34580 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
34590 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65  E_IN_ABLE && pLe
345a0 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20  vel->u.in.nIn>0 
345b0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
345c0 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20  InLoop *pIn;.   
345d0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
345e0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
345f0 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
34600 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  l->addrNxt);.   
34610 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d     for(j=pLevel-
34620 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26  >u.in.nIn, pIn=&
34630 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
34640 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20  Loop[j-1]; j>0; 
34650 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20  j--, pIn--){.   
34660 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34670 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d  JumpHere(v, pIn-
34680 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20  >addrInTop+1);. 
34690 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
346a0 62 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d  beAddOp2(v, pIn-
346b0 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e  >eEndLoopOp, pIn
346c0 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64  ->iCur, pIn->add
346d0 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20  rInTop);.       
346e0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
346f0 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64  Here(v, pIn->add
34700 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20  rInTop-1);.     
34710 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
34720 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65  DbFree(db, pLeve
34730 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29  l->u.in.aInLoop)
34740 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
34750 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
34760 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
34770 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28  ddrBrk);.    if(
34780 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69   pLevel->addrSki
34790 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
347a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
347b0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76  OP_Goto, 0, pLev
347c0 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20  el->addrSkip);. 
347d0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
347e0 28 28 76 2c 20 22 6e 65 78 74 20 73 6b 69 70 2d  ((v, "next skip-
347f0 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c 6f  scan on %s", pLo
34800 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
34810 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ex->zName));.   
34820 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
34830 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c  mpHere(v, pLevel
34840 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20  ->addrSkip);.   
34850 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
34860 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c  mpHere(v, pLevel
34870 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a 20  ->addrSkip-2);. 
34880 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
34890 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
348a0 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  {.      addr = s
348b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
348c0 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c  (v, OP_IfPos, pL
348d0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
348e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
348f0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
34900 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
34910 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
34920 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  || (pLoop->wsFla
34930 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
34940 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ED)!=0 );.      
34950 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
34960 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
34970 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
34980 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34990 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
349a0 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Row, pTabList->a
349b0 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  [i].iCursor);.  
349c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
349d0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
349e0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
349f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
34a00 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
34a10 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65  P_NullRow, pLeve
34a20 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20  l->iIdxCur);.   
34a30 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
34a40 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65  Level->op==OP_Re
34a50 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  turn ){.        
34a60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34a70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
34a80 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65  Level->p1, pLeve
34a90 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20  l->addrFirst);. 
34aa0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34ab0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34ac0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
34ad0 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  , 0, pLevel->add
34ae0 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d  rFirst);.      }
34af0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
34b00 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
34b10 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56  dr);.    }.    V
34b20 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
34b30 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d  ((v, "End WHERE-
34b40 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 20 69 2c 0a  loop%d: %s", i,.
34b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b60 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61       pWInfo->pTa
34b70 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
34b80 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e  >iFrom].pTab->zN
34b90 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ame));.  }..  /*
34ba0 20 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69   The "break" poi
34bb0 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74  nt is here, just
34bc0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
34bd0 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e   the outer loop.
34be0 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20  .  ** Set it..  
34bf0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
34c00 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
34c10 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b  pWInfo->iBreak);
34c20 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ..  assert( pWIn
34c30 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61 62  fo->nLevel<=pTab
34c40 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
34c50 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  for(i=0, pLevel=
34c60 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49  pWInfo->a; i<pWI
34c70 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b  nfo->nLevel; i++
34c80 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
34c90 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30   Index *pIdx = 0
34ca0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
34cb0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
34cc0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
34cd0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
34ce0 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ];.    Table *pT
34cf0 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70  ab = pTabItem->p
34d00 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
34d10 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
34d20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
34d30 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 20  pWLoop;..    /* 
34d40 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65  Close all of the
34d50 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 65   cursors that we
34d60 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c  re opened by sql
34d70 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a  ite3WhereBegin..
34d80 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64      ** Except, d
34d90 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 63 75 72 73  o not close curs
34da0 6f 72 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ors that will be
34db0 20 72 65 75 73 65 64 20 62 79 20 74 68 65 20 4f   reused by the O
34dc0 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20  R optimization. 
34dd0 20 20 20 2a 2a 20 28 57 48 45 52 45 5f 4f 4d 49     ** (WHERE_OMI
34de0 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 2e 20 20  T_OPEN_CLOSE).  
34df0 41 6e 64 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65  And do not close
34e00 20 74 68 65 20 4f 50 5f 4f 70 65 6e 57 72 69 74   the OP_OpenWrit
34e10 65 20 63 75 72 73 6f 72 73 0a 20 20 20 20 2a 2a  e cursors.    **
34e20 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 65   created for the
34e30 20 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a   ONEPASS optimiz
34e40 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
34e50 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
34e60 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
34e70 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26  eral)==0.     &&
34e80 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
34e90 30 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66  0.     && (pWInf
34ea0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
34eb0 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f  WHERE_OMIT_OPEN_
34ec0 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b  CLOSE)==0.    ){
34ed0 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20  .      int ws = 
34ee0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  pLoop->wsFlags;.
34ef0 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66        if( !pWInf
34f00 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20  o->okOnePass && 
34f10 28 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  (ws & WHERE_IDX_
34f20 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
34f30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34f40 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
34f50 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
34f60 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
34f70 20 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57       if( (ws & W
34f80 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
34f90 0a 20 20 20 20 20 20 20 26 26 20 28 77 73 20 26  .       && (ws &
34fa0 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52   (WHERE_IPK|WHER
34fb0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 29 3d 3d  E_AUTO_INDEX))==
34fc0 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 4c 65  0 .       && pLe
34fd0 76 65 6c 2d 3e 69 49 64 78 43 75 72 21 3d 70 57  vel->iIdxCur!=pW
34fe0 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
34ff0 73 73 5b 31 5d 0a 20 20 20 20 20 20 29 7b 0a 20  ss[1].      ){. 
35000 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
35010 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
35020 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lose, pLevel->iI
35030 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a  dxCur);.      }.
35040 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
35050 20 74 68 69 73 20 73 63 61 6e 20 75 73 65 73 20   this scan uses 
35060 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 56  an index, make V
35070 44 42 45 20 63 6f 64 65 20 73 75 62 73 74 69 74  DBE code substit
35080 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64  utions to read d
35090 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  ata.    ** from 
350a0 74 68 65 20 69 6e 64 65 78 20 69 6e 73 74 65 61  the index instea
350b0 64 20 6f 66 20 66 72 6f 6d 20 74 68 65 20 74 61  d of from the ta
350c0 62 6c 65 20 77 68 65 72 65 20 70 6f 73 73 69 62  ble where possib
350d0 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63 61 73  le.  In some cas
350e0 65 73 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 6f  es.    ** this o
350f0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72 65 76  ptimization prev
35100 65 6e 74 73 20 74 68 65 20 74 61 62 6c 65 20 66  ents the table f
35110 72 6f 6d 20 65 76 65 72 20 62 65 69 6e 67 20 72  rom ever being r
35120 65 61 64 2c 20 77 68 69 63 68 20 63 61 6e 0a 20  ead, which can. 
35130 20 20 20 2a 2a 20 79 69 65 6c 64 20 61 20 73 69     ** yield a si
35140 67 6e 69 66 69 63 61 6e 74 20 70 65 72 66 6f 72  gnificant perfor
35150 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20 20  mance boost..   
35160 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c   ** .    ** Call
35170 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65  s to the code ge
35180 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65  nerator in betwe
35190 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  en sqlite3WhereB
351a0 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20  egin and.    ** 
351b0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20  sqlite3WhereEnd 
351c0 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65  will have create
351d0 64 20 63 6f 64 65 20 74 68 61 74 20 72 65 66 65  d code that refe
351e0 72 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65  rences the table
351f0 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
35200 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61  .  This loop sca
35210 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65  ns all that code
35220 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63   looking for opc
35230 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  odes.    ** that
35240 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74   reference the t
35250 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74  able and convert
35260 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f  s them into opco
35270 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  des that.    ** 
35280 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e  reference the in
35290 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  dex..    */.    
352a0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
352b0 67 73 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45  gs & (WHERE_INDE
352c0 58 45 44 7c 57 48 45 52 45 5f 49 44 58 5f 4f 4e  XED|WHERE_IDX_ON
352d0 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64  LY) ){.      pId
352e0 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
352f0 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d  ee.pIndex;.    }
35300 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  else if( pLoop->
35310 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
35320 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20  MULTI_OR ){.    
35330 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d    pIdx = pLevel-
35340 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20 20 20  >u.pCovidx;.    
35350 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 26  }.    if( pIdx &
35360 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
35370 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  led ){.      int
35380 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20   k, last;.      
35390 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20  VdbeOp *pOp;..  
353a0 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74      last = sqlit
353b0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
353c0 72 28 76 29 3b 0a 20 20 20 20 20 20 6b 20 3d 20  r(v);.      k = 
353d0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79  pLevel->addrBody
353e0 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71  ;.      pOp = sq
353f0 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
35400 2c 20 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  , k);.      for(
35410 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70  ; k<last; k++, p
35420 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Op++){.        i
35430 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76  f( pOp->p1!=pLev
35440 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f  el->iTabCur ) co
35450 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
35460 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
35470 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  =OP_Column ){.  
35480 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
35490 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
354a0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
354b0 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b  >pTable==pTab );
354c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
354d0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
354e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e  {.            In
354f0 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74  dex *pPk = sqlit
35500 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
35510 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  x(pTab);.       
35520 20 20 20 20 20 78 20 3d 20 70 50 6b 2d 3e 61 69       x = pPk->ai
35530 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20  Column[x];.     
35540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
35550 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75   x = sqlite3Colu
35560 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20  mnOfIndex(pIdx, 
35570 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  x);.          if
35580 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( x>=0 ){.      
35590 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
355a0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  x;.            p
355b0 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d  Op->p1 = pLevel-
355c0 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
355d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
355e0 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
355f0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
35600 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20  IDX_ONLY)==0 || 
35610 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  x>=0 );.        
35620 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
35630 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20  pcode==OP_Rowid 
35640 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
35650 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
35660 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
35670 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
35680 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20  OP_IdxRowid;.   
35690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
356a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
356b0 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a  inal cleanup.  *
356c0 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  /.  pParse->nQue
356d0 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  ryLoop = pWInfo-
356e0 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
356f0 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65  ;.  whereInfoFre
35700 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
35710 20 72 65 74 75 72 6e 3b 0a 7d 0a                  return;.}.