/ Hex Artifact Content
Login

Artifact e6a4e713abe6f995495ea53dd6a5e48f88b53883:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65  Int.h"../*.** Re
0360: 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61 74  turn the estimat
0370: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
0380: 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61 20  put rows from a 
0390: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a  WHERE clause.*/.
03a0: 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72 65  u64 sqlite3Where
03b0: 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 57  OutputRowCount(W
03c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
03d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
03e0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
03f0: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
0400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0410: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
0420: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
0430: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
0440: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
0450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0460: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
0470: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
0480: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
0490: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
04a0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
04b0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04c0: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
04d0: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
04e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
04f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0500: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
0510: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
0520: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
0530: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
0540: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
0550: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0560: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
0570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0580: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0590: 3e 62 4f 42 53 61 74 21 3d 30 3b 0a 7d 0a 0a 2f  >bOBSat!=0;.}../
05a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
05b0: 56 44 42 45 20 61 64 64 72 65 73 73 20 6f 72 20  VDBE address or 
05c0: 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f  label to jump to
05d0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e   in order to con
05e0: 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61  tinue.** immedia
05f0: 74 65 6c 79 20 77 69 74 68 20 74 68 65 20 6e 65  tely with the ne
0600: 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48 45 52  xt row of a WHER
0610: 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74  E clause..*/.int
0620: 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e   sqlite3WhereCon
0630: 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65 72 65  tinueLabel(Where
0640: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
0650: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
0660: 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  iContinue;.}../*
0670: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56  .** Return the V
0680: 44 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c  DBE address or l
0690: 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20  abel to jump to 
06a0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61  in order to brea
06b0: 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48  k.** out of a WH
06c0: 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74  ERE loop..*/.int
06d0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
06e0: 61 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  akLabel(WhereInf
06f0: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
0700: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72  turn pWInfo->iBr
0710: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eak;.}../*.** Re
0720: 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20  turn TRUE if an 
0730: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
0740: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f   statement can o
0750: 70 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20  perate directly 
0760: 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73  on.** the rowids
0770: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57   returned by a W
0780: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65  HERE clause.  Re
0790: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f  turn FALSE if do
07a0: 69 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45  ing an.** UPDATE
07b0: 20 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74   or DELETE might
07c0: 20 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65   change subseque
07d0: 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  nt WHERE clause 
07e0: 72 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49  results..**.** I
07f0: 66 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70  f the ONEPASS op
0800: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73  timization is us
0810: 65 64 20 28 69 66 20 74 68 69 73 20 72 6f 75 74  ed (if this rout
0820: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65  ine returns true
0830: 29 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77  ).** then also w
0840: 72 69 74 65 20 74 68 65 20 69 6e 64 69 63 65 73  rite the indices
0850: 20 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72 73   of open cursors
0860: 20 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53 53   used by ONEPASS
0870: 0a 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b 30  .** into aiCur[0
0880: 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20  ] and aiCur[1]. 
0890: 20 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20 74   iaCur[0] gets t
08a0: 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65  he cursor of the
08b0: 20 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61   data.** table a
08c0: 6e 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74 73  nd iaCur[1] gets
08d0: 20 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64   the cursor used
08e0: 20 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79   by an auxiliary
08f0: 20 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65   index..** Eithe
0900: 72 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 2d  r value may be -
0910: 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  1, indicating th
0920: 61 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  at cursor is not
0930: 20 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75   used..** Any cu
0940: 72 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20 77  rsors returned w
0950: 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ill have been op
0960: 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  ened for writing
0970: 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d  ..**.** aiCur[0]
0980: 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62 6f   and aiCur[1] bo
0990: 74 68 20 67 65 74 20 2d 31 20 69 66 20 74 68 65  th get -1 if the
09a0: 20 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f   where-clause lo
09b0: 67 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65  gic is.** unable
09c0: 20 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45 50   to use the ONEP
09d0: 41 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ASS optimization
09e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
09f0: 57 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57  WhereOkOnePass(W
0a00: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
0a10: 2c 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20  , int *aiCur){. 
0a20: 20 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20 70   memcpy(aiCur, p
0a30: 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
0a40: 61 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  ass, sizeof(int)
0a50: 2a 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57  *2);.  return pW
0a60: 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b  Info->okOnePass;
0a70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
0a80: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53  he content of pS
0a90: 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f  rc into pDest.*/
0aa0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
0ab0: 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72  reOrMove(WhereOr
0ac0: 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72  Set *pDest, Wher
0ad0: 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20  eOrSet *pSrc){. 
0ae0: 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63   pDest->n = pSrc
0af0: 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44  ->n;.  memcpy(pD
0b00: 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c  est->a, pSrc->a,
0b10: 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66   pDest->n*sizeof
0b20: 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pDest->a[0]));.
0b30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
0b40: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65  insert a new pre
0b50: 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65  requisite/cost e
0b60: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68  ntry into the Wh
0b70: 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a  ereOrSet pSet..*
0b80: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74  *.** The new ent
0b90: 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ry might overwri
0ba0: 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  te an existing e
0bb0: 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  ntry, or it migh
0bc0: 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64  t be.** appended
0bd0: 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  , or it might be
0be0: 20 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20   discarded.  Do 
0bf0: 77 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20  whatever is the 
0c00: 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73  right thing.** s
0c10: 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70  o that pSet keep
0c20: 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20  s the N_OR_COST 
0c30: 62 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65  best entries see
0c40: 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61  n so far..*/.sta
0c50: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49  tic int whereOrI
0c60: 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72  nsert(.  WhereOr
0c70: 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20  Set *pSet,      
0c80: 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65  /* The WhereOrSe
0c90: 74 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  t to be updated 
0ca0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
0cb0: 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  req,        /* P
0cc0: 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20  rerequisites of 
0cd0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
0ce0: 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20  .  LogEst rRun, 
0cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e            /* Run
0d00: 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77  -cost of the new
0d10: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
0d20: 73 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20  st nOut         
0d30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0d40: 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20  outputs for the 
0d50: 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a  new entry */.){.
0d60: 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65    u16 i;.  Where
0d70: 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72  OrCost *p;.  for
0d80: 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53  (i=pSet->n, p=pS
0d90: 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  et->a; i>0; i--,
0da0: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72   p++){.    if( r
0db0: 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20  Run<=p->rRun && 
0dc0: 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65  (prereq & p->pre
0dd0: 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a  req)==prereq ){.
0de0: 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
0df0: 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20  OrInsert_done;. 
0e00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
0e10: 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70  rRun<=rRun && (p
0e20: 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65  ->prereq & prere
0e30: 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b  q)==p->prereq ){
0e40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
0e50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
0e60: 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f   pSet->n<N_OR_CO
0e70: 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  ST ){.    p = &p
0e80: 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b  Set->a[pSet->n++
0e90: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d  ];.    p->nOut =
0ea0: 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nOut;.  }else{.
0eb0: 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b      p = pSet->a;
0ec0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
0ed0: 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  pSet->n; i++){. 
0ee0: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e       if( p->rRun
0ef0: 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e  >pSet->a[i].rRun
0f00: 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b   ) p = pSet->a +
0f10: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
0f20: 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20  ( p->rRun<=rRun 
0f30: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
0f40: 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f  whereOrInsert_do
0f50: 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20  ne:.  p->prereq 
0f60: 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72  = prereq;.  p->r
0f70: 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66  Run = rRun;.  if
0f80: 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  ( p->nOut>nOut )
0f90: 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b   p->nOut = nOut;
0fa0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
0fb0: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
0fc0: 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
0fd0: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
0fe0: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
0ff0: 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73   void whereClaus
1000: 65 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c  eInit(.  WhereCl
1010: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
1020: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c    /* The WhereCl
1030: 61 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69  ause to be initi
1040: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alized */.  Wher
1050: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20  eInfo *pWInfo   
1060: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
1070: 45 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e  E processing con
1080: 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43  text */.){.  pWC
1090: 2d 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66  ->pWInfo = pWInf
10a0: 6f 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72  o;.  pWC->pOuter
10b0: 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65   = 0;.  pWC->nTe
10c0: 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e  rm = 0;.  pWC->n
10d0: 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65  Slot = ArraySize
10e0: 28 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a  (pWC->aStatic);.
10f0: 20 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e    pWC->a = pWC->
1100: 61 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46  aStatic;.}../* F
1110: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1120: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
1130: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
1140: 28 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a  (WhereClause*);.
1150: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
1160: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
1170: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57  ociated with a W
1180: 68 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63  hereOrInfo objec
1190: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
11a0: 64 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c  d whereOrInfoDel
11b0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
11c0: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29   WhereOrInfo *p)
11d0: 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43  {.  whereClauseC
11e0: 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20  lear(&p->wc);.  
11f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1200: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  , p);.}../*.** D
1210: 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65  eallocate all me
1220: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
1230: 77 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49  with a WhereAndI
1240: 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  nfo object..*/.s
1250: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
1260: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71  AndInfoDelete(sq
1270: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
1280: 41 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77  AndInfo *p){.  w
1290: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
12a0: 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74  &p->wc);.  sqlit
12b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
12c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
12d0: 63 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75  cate a WhereClau
12e0: 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  se structure.  T
12f0: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
1300: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65  tructure.** itse
1310: 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e  lf is not freed.
1320: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
1330: 73 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66  s the inverse of
1340: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
1350: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
1360: 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  id whereClauseCl
1370: 65 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20  ear(WhereClause 
1380: 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  *pWC){.  int i;.
1390: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a    WhereTerm *a;.
13a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
13b0: 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61  pWC->pWInfo->pPa
13c0: 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69  rse->db;.  for(i
13d0: 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61  =pWC->nTerm-1, a
13e0: 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69  =pWC->a; i>=0; i
13f0: 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66  --, a++){.    if
1400: 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  ( a->wtFlags & T
1410: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ERM_DYNAMIC ){. 
1420: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1430: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45  Delete(db, a->pE
1440: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xpr);.    }.    
1450: 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26  if( a->wtFlags &
1460: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a   TERM_ORINFO ){.
1470: 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66        whereOrInf
1480: 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75  oDelete(db, a->u
1490: 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  .pOrInfo);.    }
14a0: 65 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c  else if( a->wtFl
14b0: 61 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e  ags & TERM_ANDIN
14c0: 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72  FO ){.      wher
14d0: 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64  eAndInfoDelete(d
14e0: 62 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  b, a->u.pAndInfo
14f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
1500: 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e  f( pWC->a!=pWC->
1510: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73  aStatic ){.    s
1520: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1530: 20 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a   pWC->a);.  }.}.
1540: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e  ./*.** Add a sin
1550: 67 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72  gle new WhereTer
1560: 6d 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57  m entry to the W
1570: 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63  hereClause objec
1580: 74 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65  t pWC..** The ne
1590: 77 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65  w WhereTerm obje
15a0: 63 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65  ct is constructe
15b0: 64 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e  d from Expr p an
15c0: 64 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a  d with wtFlags..
15d0: 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20  ** The index in 
15e0: 70 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  pWC->a[] of the 
15f0: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73  new WhereTerm is
1600: 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
1610: 63 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65  cess..** 0 is re
1620: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65  turned if the ne
1630: 77 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c  w WhereTerm coul
1640: 64 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64  d not be added d
1650: 75 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a  ue to a memory.*
1660: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  * allocation err
1670: 6f 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20  or.  The memory 
1680: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75  allocation failu
1690: 72 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72  re will be recor
16a0: 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62  ded in.** the db
16b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
16c0: 6c 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68  lag so that high
16d0: 65 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f  er-level functio
16e0: 6e 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74  ns can detect it
16f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1700: 74 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61  tine will increa
1710: 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
1720: 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61  he pWC->a[] arra
1730: 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  y as necessary..
1740: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46  **.** If the wtF
1750: 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e  lags argument in
1760: 63 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41  cludes TERM_DYNA
1770: 4d 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e  MIC, then respon
1780: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20  sibility.** for 
1790: 66 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72  freeing the expr
17a0: 65 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75  ession p is assu
17b0: 6d 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65  med by the Where
17c0: 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57  Clause object pW
17d0: 43 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72  C..** This is tr
17e0: 75 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20  ue even if this 
17f0: 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f  routine fails to
1800: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
1810: 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a  WhereTerm..**.**
1820: 20 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20   WARNING:  This 
1830: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65  routine might re
1840: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61  allocate the spa
1850: 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ce used to store
1860: 0a 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20  .** WhereTerms. 
1870: 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f   All pointers to
1880: 20 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75   WhereTerms shou
1890: 6c 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  ld be invalidate
18a0: 64 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69  d after.** calli
18b0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
18c0: 20 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20    Such pointers 
18d0: 6d 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c  may be reinitial
18e0: 69 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63  ized by referenc
18f0: 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e  ing.** the pWC->
1900: 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  a[] array..*/.st
1910: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c  atic int whereCl
1920: 61 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65  auseInsert(Where
1930: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70  Clause *pWC, Exp
1940: 72 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73  r *p, u8 wtFlags
1950: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
1960: 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78  pTerm;.  int idx
1970: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74  ;.  testcase( wt
1980: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1990: 54 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57  TUAL );.  if( pW
19a0: 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e  C->nTerm>=pWC->n
19b0: 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72  Slot ){.    Wher
19c0: 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57  eTerm *pOld = pW
19d0: 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65  C->a;.    sqlite
19e0: 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49  3 *db = pWC->pWI
19f0: 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
1a00: 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71  .    pWC->a = sq
1a10: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1a20: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  (db, sizeof(pWC-
1a30: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f  >a[0])*pWC->nSlo
1a40: 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  t*2 );.    if( p
1a50: 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  WC->a==0 ){.    
1a60: 20 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20    if( wtFlags & 
1a70: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
1a80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a90: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29  xprDelete(db, p)
1aa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ab0: 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20  pWC->a = pOld;. 
1ac0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1ad0: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
1ae0: 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69  pWC->a, pOld, si
1af0: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
1b00: 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  pWC->nTerm);.   
1b10: 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e   if( pOld!=pWC->
1b20: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  aStatic ){.     
1b30: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1b40: 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a  b, pOld);.    }.
1b50: 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d      pWC->nSlot =
1b60: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1b70: 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Size(db, pWC->a)
1b80: 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30  /sizeof(pWC->a[0
1b90: 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20  ]);.  }.  pTerm 
1ba0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20  = &pWC->a[idx = 
1bb0: 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20  pWC->nTerm++];. 
1bc0: 20 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61   if( p && ExprHa
1bd0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
1be0: 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20  Unlikely) ){.   
1bf0: 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
1c00: 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  b = sqlite3LogEs
1c10: 74 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 39  t(p->iTable) - 9
1c20: 39 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  9;.  }else{.    
1c30: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c40: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 70 54 65   = -1;.  }.  pTe
1c50: 72 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69  rm->pExpr = sqli
1c60: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
1c70: 74 65 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e  te(p);.  pTerm->
1c80: 77 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67  wtFlags = wtFlag
1c90: 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20  s;.  pTerm->pWC 
1ca0: 3d 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e  = pWC;.  pTerm->
1cb0: 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20  iParent = -1;.  
1cc0: 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f  return idx;.}../
1cd0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1ce0: 65 20 69 64 65 6e 74 69 66 69 65 73 20 73 75 62  e identifies sub
1cf0: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
1d00: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1d10: 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75  where.** each su
1d20: 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
1d30: 65 70 61 72 61 74 65 64 20 62 79 20 74 68 65 20  eparated by the 
1d40: 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  AND operator or 
1d50: 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70  some other.** op
1d60: 65 72 61 74 6f 72 20 73 70 65 63 69 66 69 65 64  erator specified
1d70: 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d   in the op param
1d80: 65 74 65 72 2e 20 20 54 68 65 20 57 68 65 72 65  eter.  The Where
1d90: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
1da0: 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69  .** is filled wi
1db0: 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73  th pointers to s
1dc0: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  ubexpressions.  
1dd0: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
1de0: 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d  **    WHERE  a==
1df0: 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c  'hello' AND coal
1e00: 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e  esce(b,11)<10 AN
1e10: 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d  D (c+12!=d OR c=
1e20: 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =22).**         
1e30: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20    \________/    
1e40: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
1e50: 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  _/     \________
1e60: 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
1e70: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20          slot[0] 
1e80: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
1e90: 31 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1]              
1ea0: 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54   slot[2].**.** T
1eb0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52  he original WHER
1ec0: 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70  E clause in pExp
1ed0: 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20  r is unaltered. 
1ee0: 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e   All this routin
1ef0: 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b  e.** does is mak
1f00: 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73  e slot[] entries
1f10: 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72   point to substr
1f20: 75 63 74 75 72 65 20 77 69 74 68 69 6e 20 70 45  ucture within pE
1f30: 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  xpr..**.** In th
1f40: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
1f50: 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64  nce and in the d
1f60: 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22  iagram, "slot[]"
1f70: 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68   refers to.** th
1f80: 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b  e WhereClause.a[
1f90: 5d 20 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c  ] array.  The sl
1fa0: 6f 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73  ot[] array grows
1fb0: 20 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f   as needed to co
1fc0: 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72  ntain.** all ter
1fd0: 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
1fe0: 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  clause..*/.stati
1ff0: 63 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69  c void whereSpli
2000: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
2010: 57 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  WC, Expr *pExpr,
2020: 20 75 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e   u8 op){.  pWC->
2030: 6f 70 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70  op = op;.  if( p
2040: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
2050: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
2060: 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65  p!=op ){.    whe
2070: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
2080: 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  WC, pExpr, 0);. 
2090: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72   }else{.    wher
20a0: 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70  eSplit(pWC, pExp
20b0: 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20  r->pLeft, op);. 
20c0: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57     whereSplit(pW
20d0: 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  C, pExpr->pRight
20e0: 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  , op);.  }.}../*
20f0: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
2100: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62   WhereMaskSet ob
2110: 6a 65 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ject.*/.#define 
2120: 69 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20  initMaskSet(P)  
2130: 28 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20  (P)->n=0../*.** 
2140: 52 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61  Return the bitma
2150: 73 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  sk for the given
2160: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20   cursor number. 
2170: 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20   Return 0 if.** 
2180: 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69  iCursor is not i
2190: 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74  n the set..*/.st
21a0: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74  atic Bitmask get
21b0: 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65  Mask(WhereMaskSe
21c0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74  t *pMaskSet, int
21d0: 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74   iCursor){.  int
21e0: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   i;.  assert( pM
21f0: 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29  askSet->n<=(int)
2200: 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a  sizeof(Bitmask)*
2210: 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  8 );.  for(i=0; 
2220: 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69  i<pMaskSet->n; i
2230: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61  ++){.    if( pMa
2240: 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43  skSet->ix[i]==iC
2250: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72  ursor ){.      r
2260: 65 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29  eturn MASKBIT(i)
2270: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2280: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2290: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61   Create a new ma
22a0: 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43  sk for cursor iC
22b0: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
22c0: 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72  re is one cursor
22d0: 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68   per table in th
22e0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
22f0: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  The number of.**
2300: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
2310: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
2320: 6d 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20  mited by a test 
2330: 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20  early in the.** 
2340: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2350: 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f  n() routine.  So
2360: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
2370: 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d  e pMaskSet->ix[]
2380: 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e  .** array will n
2390: 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a  ever overflow..*
23a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72  /.static void cr
23b0: 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61  eateMask(WhereMa
23c0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
23d0: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
23e0: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
23f0: 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65  t->n < ArraySize
2400: 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29  (pMaskSet->ix) )
2410: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  ;.  pMaskSet->ix
2420: 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20  [pMaskSet->n++] 
2430: 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a  = iCursor;.}../*
2440: 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
2450: 65 73 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69  es walk (recursi
2460: 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73  vely) an express
2470: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e  ion tree and gen
2480: 65 72 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61  erate.** a bitma
2490: 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68  sk indicating wh
24a0: 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75  ich tables are u
24b0: 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72  sed in that expr
24c0: 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a  ession.** tree..
24d0: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
24e0: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
24f0: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
2500: 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  t*, ExprList*);.
2510: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
2520: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
2530: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
2540: 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61  *, Select*);.sta
2550: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
2560: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
2570: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
2580: 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42  t, Expr *p){.  B
2590: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
25a0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
25b0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
25c0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
25d0: 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74  {.    mask = get
25e0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
25f0: 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72  ->iTable);.    r
2600: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a  eturn mask;.  }.
2610: 20 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62    mask = exprTab
2620: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2630: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
2640: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
2650: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2660: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66   p->pLeft);.  if
2670: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
2680: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
2690: 74 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c  t) ){.    mask |
26a0: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
26b0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
26c0: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a   p->x.pSelect);.
26d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73    }else{.    mas
26e0: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
26f0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2700: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  , p->x.pList);. 
2710: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
2720: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
2730: 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  sk exprListTable
2740: 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53  Usage(WhereMaskS
2750: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78  et *pMaskSet, Ex
2760: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
2770: 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61    int i;.  Bitma
2780: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69  sk mask = 0;.  i
2790: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
27a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
27b0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
27c0: 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70       mask |= exp
27d0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
27e0: 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  kSet, pList->a[i
27f0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ].pExpr);.    }.
2800: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73    }.  return mas
2810: 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d  k;.}.static Bitm
2820: 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61  ask exprSelectTa
2830: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
2840: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
2850: 20 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20   Select *pS){.  
2860: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30  Bitmask mask = 0
2870: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b  ;.  while( pS ){
2880: 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
2890: 72 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  rc = pS->pSrc;. 
28a0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
28b0: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
28c0: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69  askSet, pS->pELi
28d0: 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  st);.    mask |=
28e0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
28f0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
2900: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
2910: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
2920: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
2930: 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72  kSet, pS->pOrder
2940: 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  By);.    mask |=
2950: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
2960: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57  pMaskSet, pS->pW
2970: 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20  here);.    mask 
2980: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
2990: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
29a0: 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66  pHaving);.    if
29b0: 28 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30  ( ALWAYS(pSrc!=0
29c0: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
29d0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
29e0: 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69   i<pSrc->nSrc; i
29f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73  ++){.        mas
2a00: 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54  k |= exprSelectT
2a10: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2a20: 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  et, pSrc->a[i].p
2a30: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
2a40: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
2a50: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2a60: 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e  , pSrc->a[i].pOn
2a70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2a80: 0a 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50  .    pS = pS->pP
2a90: 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rior;.  }.  retu
2aa0: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn mask;.}../*.*
2ab0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
2ac0: 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61   the given opera
2ad0: 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  tor is one of th
2ae0: 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  e operators that
2af0: 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66   is.** allowed f
2b00: 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20  or an indexable 
2b10: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
2b20: 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20  m.  The allowed 
2b30: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a  operators are.**
2b40: 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20   "=", "<", ">", 
2b50: 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22  "<=", ">=", "IN"
2b60: 2c 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a  , and "IS NULL".
2b70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
2b80: 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b  lowedOp(int op){
2b90: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54  .  assert( TK_GT
2ba0: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c  >TK_EQ && TK_GT<
2bb0: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
2bc0: 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26  t( TK_LT>TK_EQ &
2bd0: 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b  & TK_LT<TK_GE );
2be0: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45  .  assert( TK_LE
2bf0: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c  >TK_EQ && TK_LE<
2c00: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
2c10: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b  t( TK_GE==TK_EQ+
2c20: 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70  4 );.  return op
2c30: 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d  ==TK_IN || (op>=
2c40: 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f  TK_EQ && op<=TK_
2c50: 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53  GE) || op==TK_IS
2c60: 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  NULL;.}../*.** S
2c70: 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20  wap two objects 
2c80: 6f 66 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f  of type TYPE..*/
2c90: 0a 23 64 65 66 69 6e 65 20 53 57 41 50 28 54 59  .#define SWAP(TY
2ca0: 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d  PE,A,B) {TYPE t=
2cb0: 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f  A; A=B; B=t;}../
2cc0: 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63  *.** Commute a c
2cd0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
2ce0: 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73  or.  Expressions
2cf0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
2d00: 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e  op Y".** are con
2d10: 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f  verted into "Y o
2d20: 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c  p X"..**.** If l
2d30: 65 66 74 2f 72 69 67 68 74 20 70 72 65 63 65 64  eft/right preced
2d40: 65 6e 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20  ence rules come 
2d50: 69 6e 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64  into play when d
2d60: 65 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a  etermining the.*
2d70: 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * collating sequ
2d80: 65 6e 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c 41  ence, then COLLA
2d90: 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65  TE operators are
2da0: 20 61 64 6a 75 73 74 65 64 20 74 6f 20 65 6e 73   adjusted to ens
2db0: 75 72 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ure.** that the 
2dc0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
2dd0: 63 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e  ce does not chan
2de0: 67 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ge.  For example
2df0: 3a 0a 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65 20  :.** "Y collate 
2e00: 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62 65 63  NOCASE op X" bec
2e10: 6f 6d 65 73 20 22 58 20 6f 70 20 59 22 20 62 65  omes "X op Y" be
2e20: 63 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74  cause any collat
2e30: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a  ion sequence on.
2e40: 2a 2a 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64  ** the left hand
2e50: 20 73 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61   side of a compa
2e60: 72 69 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  rison overrides 
2e70: 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  any collation se
2e80: 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63  quence .** attac
2e90: 68 65 64 20 74 6f 20 74 68 65 20 72 69 67 68 74  hed to the right
2ea0: 2e 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72  . For the same r
2eb0: 65 61 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c  eason the EP_Col
2ec0: 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20  late flag.** is 
2ed0: 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f  not commuted..*/
2ee0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
2ef0: 72 43 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a  rCommute(Parse *
2f00: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
2f10: 78 70 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52  xpr){.  u16 expR
2f20: 69 67 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70  ight = (pExpr->p
2f30: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
2f40: 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31  P_Collate);.  u1
2f50: 36 20 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78  6 expLeft = (pEx
2f60: 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73  pr->pLeft->flags
2f70: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a   & EP_Collate);.
2f80: 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65    assert( allowe
2f90: 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26  dOp(pExpr->op) &
2fa0: 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  & pExpr->op!=TK_
2fb0: 49 4e 20 29 3b 0a 20 20 69 66 28 20 65 78 70 52  IN );.  if( expR
2fc0: 69 67 68 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b  ight==expLeft ){
2fd0: 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 58  .    /* Either X
2fe0: 20 61 6e 64 20 59 20 62 6f 74 68 20 68 61 76 65   and Y both have
2ff0: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
3000: 72 20 6f 72 20 6e 65 69 74 68 65 72 20 64 6f 20  r or neither do 
3010: 2a 2f 0a 20 20 20 20 69 66 28 20 65 78 70 52 69  */.    if( expRi
3020: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ght ){.      /* 
3030: 42 6f 74 68 20 58 20 61 6e 64 20 59 20 68 61 76  Both X and Y hav
3040: 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  e COLLATE operat
3050: 6f 72 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ors.  Make sure 
3060: 58 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20  X is always.    
3070: 20 20 2a 2a 20 75 73 65 64 20 62 79 20 63 6c 65    ** used by cle
3080: 61 72 69 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c  aring the EP_Col
3090: 6c 61 74 65 20 66 6c 61 67 20 66 72 6f 6d 20 59  late flag from Y
30a0: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72  . */.      pExpr
30b0: 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ->pRight->flags 
30c0: 26 3d 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a  &= ~EP_Collate;.
30d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
30e0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
30f0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
3100: 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20  pLeft)!=0 ){.   
3110: 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 58 20     /* Neither X 
3120: 6e 6f 72 20 59 20 68 61 76 65 20 43 4f 4c 4c 41  nor Y have COLLA
3130: 54 45 20 6f 70 65 72 61 74 6f 72 73 2c 20 62 75  TE operators, bu
3140: 74 20 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65  t X has a non-de
3150: 66 61 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63  fault.      ** c
3160: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
3170: 65 2e 20 20 53 6f 20 61 64 64 20 74 68 65 20 45  e.  So add the E
3180: 50 5f 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72  P_Collate marker
3190: 20 6f 6e 20 58 20 74 6f 20 63 61 75 73 65 0a 20   on X to cause. 
31a0: 20 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65       ** it to be
31b0: 20 73 65 61 72 63 68 65 64 20 66 69 72 73 74 2e   searched first.
31c0: 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
31d0: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d  >pLeft->flags |=
31e0: 20 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20   EP_Collate;.   
31f0: 20 7d 0a 20 20 7d 0a 20 20 53 57 41 50 28 45 78   }.  }.  SWAP(Ex
3200: 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68  pr*,pExpr->pRigh
3210: 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  t,pExpr->pLeft);
3220: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
3230: 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61  >=TK_GT ){.    a
3240: 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b  ssert( TK_LT==TK
3250: 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73  _GT+2 );.    ass
3260: 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c  ert( TK_GE==TK_L
3270: 45 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  E+2 );.    asser
3280: 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29  t( TK_GT>TK_EQ )
3290: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
32a0: 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  _GT<TK_LE );.   
32b0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
32c0: 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78  op>=TK_GT && pEx
32d0: 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b  pr->op<=TK_GE );
32e0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
32f0: 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f   ((pExpr->op-TK_
3300: 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20  GT)^2)+TK_GT;.  
3310: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  }.}../*.** Trans
3320: 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20  late from TK_xx 
3330: 6f 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78  operator to WO_x
3340: 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74  x bitmask..*/.st
3350: 61 74 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f  atic u16 operato
3360: 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20  rMask(int op){. 
3370: 20 75 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74   u16 c;.  assert
3380: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20  ( allowedOp(op) 
3390: 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
33a0: 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f  IN ){.    c = WO
33b0: 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _IN;.  }else if(
33c0: 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
33d0: 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e  {.    c = WO_ISN
33e0: 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
33f0: 20 20 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51    assert( (WO_EQ
3400: 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20  <<(op-TK_EQ)) < 
3410: 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20  0x7fff );.    c 
3420: 3d 20 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28  = (u16)(WO_EQ<<(
3430: 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a  op-TK_EQ));.  }.
3440: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
3450: 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f  _ISNULL || c==WO
3460: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73  _ISNULL );.  ass
3470: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c  ert( op!=TK_IN |
3480: 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20  | c==WO_IN );.  
3490: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45  assert( op!=TK_E
34a0: 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b  Q || c==WO_EQ );
34b0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
34c0: 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54  K_LT || c==WO_LT
34d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
34e0: 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f  !=TK_LE || c==WO
34f0: 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _LE );.  assert(
3500: 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d   op!=TK_GT || c=
3510: 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65  =WO_GT );.  asse
3520: 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c  rt( op!=TK_GE ||
3530: 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72   c==WO_GE );.  r
3540: 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn c;.}../*.*
3550: 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65  * Advance to the
3560: 20 6e 65 78 74 20 57 68 65 72 65 54 65 72 6d 20   next WhereTerm 
3570: 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 63 63  that matches acc
3580: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72  ording to the cr
3590: 69 74 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c  iteria.** establ
35a0: 69 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 70  ished when the p
35b0: 53 63 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20  Scan object was 
35c0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77  initialized by w
35d0: 68 65 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a  hereScanInit()..
35e0: 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
35f0: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  f there are no m
3600: 6f 72 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65  ore matching Whe
3610: 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74  reTerms..*/.stat
3620: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68  ic WhereTerm *wh
3630: 65 72 65 53 63 61 6e 4e 65 78 74 28 57 68 65 72  ereScanNext(Wher
3640: 65 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20  eScan *pScan){. 
3650: 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
3660: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
3670: 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f  sor on the LHS o
3680: 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20  f the term */.  
3690: 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  int iColumn;    
36a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75       /* The colu
36b0: 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66  mn on the LHS of
36c0: 20 74 68 65 20 74 65 72 6d 2e 20 20 2d 31 20 66   the term.  -1 f
36d0: 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72  or IPK */.  Expr
36e0: 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
36f0: 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f   /* An expressio
3700: 6e 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a  n being tested *
3710: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
3720: 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72  *pWC;    /* Shor
3730: 74 68 61 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d  thand for pScan-
3740: 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65 72 65 54  >pWC */.  WhereT
3750: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f  erm *pTerm;    /
3760: 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67  * The term being
3770: 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74   tested */.  int
3780: 20 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20   k = pScan->k;  
3790: 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74    /* Where to st
37a0: 61 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a  art scanning */.
37b0: 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d  .  while( pScan-
37c0: 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e  >iEquiv<=pScan->
37d0: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43  nEquiv ){.    iC
37e0: 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75  ur = pScan->aEqu
37f0: 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  iv[pScan->iEquiv
3800: 2d 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e  -2];.    iColumn
3810: 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76   = pScan->aEquiv
3820: 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31  [pScan->iEquiv-1
3830: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70  ];.    while( (p
3840: 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29  WC = pScan->pWC)
3850: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  !=0 ){.      for
3860: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b  (pTerm=pWC->a+k;
3870: 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b   k<pWC->nTerm; k
3880: 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
3890: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
38a0: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
38b0: 72 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 54  r.         && pT
38c0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
38d0: 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  n==iColumn.     
38e0: 20 20 20 20 26 26 20 28 70 53 63 61 6e 2d 3e 69      && (pScan->i
38f0: 45 71 75 69 76 3c 3d 32 20 7c 7c 20 21 45 78 70  Equiv<=2 || !Exp
3900: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
3910: 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
3920: 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 20  omJoin)).       
3930: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
3940: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
3950: 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21  tor & WO_EQUIV)!
3960: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
3970: 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41   pScan->nEquiv<A
3980: 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e  rraySize(pScan->
3990: 61 45 71 75 69 76 29 0a 20 20 20 20 20 20 20 20  aEquiv).        
39a0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
39b0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
39c0: 20 20 20 20 70 58 20 3d 20 73 71 6c 69 74 65 33      pX = sqlite3
39d0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
39e0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
39f0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
3a00: 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f     assert( pX->o
3a10: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
3a30: 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45  j=0; j<pScan->nE
3a40: 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20  quiv; j+=2){.   
3a50: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
3a60: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d  Scan->aEquiv[j]=
3a70: 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20  =pX->iTable.    
3a80: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 53             && pS
3a90: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d  can->aEquiv[j+1]
3aa0: 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  ==pX->iColumn ){
3ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3ac0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3ad0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3ae0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3af0: 20 20 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e      if( j==pScan
3b00: 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20  ->nEquiv ){.    
3b10: 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d            pScan-
3b20: 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58 2d  >aEquiv[j] = pX-
3b30: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
3b40: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45         pScan->aE
3b50: 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e  quiv[j+1] = pX->
3b60: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
3b70: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45         pScan->nE
3b80: 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20  quiv += 2;.     
3b90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3ba0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
3bb0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
3bc0: 61 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70  ator & pScan->op
3bd0: 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  Mask)!=0 ){.    
3be0: 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66          /* Verif
3bf0: 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 61  y the affinity a
3c00: 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nd collating seq
3c10: 75 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20  uence match */. 
3c20: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
3c30: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20  Scan->zCollName 
3c40: 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  && (pTerm->eOper
3c50: 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
3c60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
3c70: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
3c80: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
3c90: 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73      Parse *pPars
3ca0: 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d  e = pWC->pWInfo-
3cb0: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
3cc0: 20 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72         pX = pTer
3cd0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
3ce0: 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
3cf0: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
3d00: 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69  yOk(pX, pScan->i
3d10: 64 78 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20  dxaff) ){.      
3d20: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
3d30: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
3d40: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
3d50: 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65    assert(pX->pLe
3d60: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ft);.           
3d70: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
3d80: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
3d90: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20  ollSeq(pParse,. 
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e   pX->pLeft, pX->
3de0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
3df0: 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
3e00: 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50  ==0 ) pColl = pP
3e10: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
3e20: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
3e30: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
3e40: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
3e50: 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c  me, pScan->zColl
3e60: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
3e70: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
3e80: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
3e90: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
3ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
3eb0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3ec0: 6f 72 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20  or & WO_EQ)!=0. 
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
3ee0: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
3ef0: 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d  r->pRight)->op==
3f00: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
3f10: 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54         && pX->iT
3f20: 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71  able==pScan->aEq
3f30: 75 69 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20  uiv[0].         
3f40: 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75      && pX->iColu
3f50: 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69  mn==pScan->aEqui
3f60: 76 5b 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20  v[1].           
3f70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3f80: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
3f90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3fa0: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d        pScan->k =
3fb0: 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20   k+1;.          
3fc0: 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a    return pTerm;.
3fd0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3fe0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3ff0: 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d      pScan->pWC =
4000: 20 70 53 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75   pScan->pWC->pOu
4010: 74 65 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30  ter;.      k = 0
4020: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61  ;.    }.    pSca
4030: 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e  n->pWC = pScan->
4040: 70 4f 72 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d  pOrigWC;.    k =
4050: 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69   0;.    pScan->i
4060: 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a  Equiv += 2;.  }.
4070: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
4080: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
4090: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73  a WHERE clause s
40a0: 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20  canner object.  
40b0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
40c0: 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   to the.** first
40d0: 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20   match.  Return 
40e0: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
40f0: 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a  e no matches..**
4100: 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20  .** The scanner 
4110: 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e  will be searchin
4120: 67 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  g the WHERE clau
4130: 73 65 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c  se pWC.  It will
4140: 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72   look.** for ter
4150: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ms of the form "
4160: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77  X <op> <expr>" w
4170: 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e  here X is column
4180: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
4190: 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54 68 65 20  e.** iCur.  The 
41a0: 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65  <op> must be one
41b0: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
41c0: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 6f  s described by o
41d0: 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pMask..**.** If 
41e0: 74 68 65 20 73 65 61 72 63 68 20 69 73 20 66 6f  the search is fo
41f0: 72 20 58 20 61 6e 64 20 74 68 65 20 57 48 45 52  r X and the WHER
4200: 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
4210: 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  s terms of the.*
4220: 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20  * form X=Y then 
4230: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
4240: 68 74 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74  ht also return t
4250: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
4260: 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70  .** "Y <op> <exp
4270: 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  r>".  The number
4280: 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72   of levels of tr
4290: 61 6e 73 69 74 69 76 69 74 79 20 69 73 20 6c 69  ansitivity is li
42a0: 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73  mited,.** but is
42b0: 20 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c   enough to handl
42c0: 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20  e most commonly 
42d0: 6f 63 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74  occurring SQL st
42e0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
42f0: 49 66 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20  If X is not the 
4300: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
4310: 4b 45 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20  KEY then X must 
4320: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
4330: 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78  th.** index pIdx
4340: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
4350: 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e  eTerm *whereScan
4360: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53 63 61  Init(.  WhereSca
4370: 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20  n *pScan,       
4380: 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63 61 6e  /* The WhereScan
4390: 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e   object being in
43a0: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57  itialized */.  W
43b0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
43c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
43d0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
43e0: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e   scanned */.  in
43f0: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
4400: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
4410: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
4420: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
4430: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
4440: 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  mn to scan for *
4450: 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20  /.  u32 opMask, 
4460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4470: 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63  perator(s) to sc
4480: 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  an for */.  Inde
4490: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
44a0: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
44b0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
44c0: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a  his index */.){.
44d0: 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d    int j;..  /* m
44e0: 65 6d 73 65 74 28 70 53 63 61 6e 2c 20 30 2c 20  emset(pScan, 0, 
44f0: 73 69 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b  sizeof(*pScan));
4500: 20 2a 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72   */.  pScan->pOr
4510: 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53  igWC = pWC;.  pS
4520: 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a  can->pWC = pWC;.
4530: 20 20 69 66 28 20 70 49 64 78 20 26 26 20 69 43    if( pIdx && iC
4540: 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
4550: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20  pScan->idxaff = 
4560: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
4570: 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  ol[iColumn].affi
4580: 6e 69 74 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  nity;.    for(j=
4590: 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  0; pIdx->aiColum
45a0: 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a  n[j]!=iColumn; j
45b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4e  ++){.      if( N
45c0: 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 4b  EVER(j>=pIdx->nK
45d0: 65 79 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 20  eyCol) ) return 
45e0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63  0;.    }.    pSc
45f0: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20  an->zCollName = 
4600: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b  pIdx->azColl[j];
4610: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53  .  }else{.    pS
4620: 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b  can->idxaff = 0;
4630: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  .    pScan->zCol
4640: 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  lName = 0;.  }. 
4650: 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d   pScan->opMask =
4660: 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e   opMask;.  pScan
4670: 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e  ->k = 0;.  pScan
4680: 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d 20 69 43  ->aEquiv[0] = iC
4690: 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71  ur;.  pScan->aEq
46a0: 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e  uiv[1] = iColumn
46b0: 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69  ;.  pScan->nEqui
46c0: 76 20 3d 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e  v = 2;.  pScan->
46d0: 69 45 71 75 69 76 20 3d 20 32 3b 0a 20 20 72 65  iEquiv = 2;.  re
46e0: 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65  turn whereScanNe
46f0: 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a  xt(pScan);.}../*
4700: 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61  .** Search for a
4710: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
4720: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
4730: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
4740: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a   <op> <expr>".**
4750: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 72 65   where X is a re
4760: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69  ference to the i
4770: 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  Column of table 
4780: 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73  iCur and <op> is
4790: 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57   one of.** the W
47a0: 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f  O_xx operator co
47b0: 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62 79  des specified by
47c0: 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65   the op paramete
47d0: 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  r..** Return a p
47e0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65  ointer to the te
47f0: 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  rm.  Return 0 if
4800: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
4810: 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74 75 72  * The term retur
4820: 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59 3d 3c  ned might by Y=<
4830: 65 78 70 72 3e 20 69 66 20 74 68 65 72 65 20 69  expr> if there i
4840: 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72  s another constr
4850: 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57  aint in.** the W
4860: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
4870: 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20   specifies that 
4880: 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68 20 63  X=Y.  Any such c
4890: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
48a0: 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64  be.** identified
48b0: 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55 49 56   by the WO_EQUIV
48c0: 20 62 69 74 20 69 6e 20 74 68 65 20 70 54 65 72   bit in the pTer
48d0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66 69 65  m->eOperator fie
48e0: 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45 71 75  ld.  The.** aEqu
48f0: 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64 73  iv[] array holds
4900: 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65   X and all its e
4910: 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69 74 68  quivalents, with
4920: 20 65 61 63 68 20 53 51 4c 20 76 61 72 69 61 62   each SQL variab
4930: 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20  le.** taking up 
4940: 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61 45 71  two slots in aEq
4950: 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69 72 73  uiv[].  The firs
4960: 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20 74 68  t slot is for th
4970: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a  e cursor number.
4980: 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  ** and the secon
4990: 64 20 69 73 20 66 6f 72 20 74 68 65 20 63 6f 6c  d is for the col
49a0: 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  umn number.  The
49b0: 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74 73 20  re are 22 slots 
49c0: 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73  in aEquiv[].** s
49d0: 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  o that means we 
49e0: 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70  can look for X p
49f0: 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f 74 68  lus up to 10 oth
4a00: 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61  er equivalent va
4a10: 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61  lues..** Hence a
4a20: 20 73 65 61 72 63 68 20 66 6f 72 20 58 20 77 69   search for X wi
4a30: 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e  ll return <expr>
4a40: 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41 31 3d   if X=A1 and A1=
4a50: 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20  A2 and A2=A3.** 
4a60: 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41  and ... and A9=A
4a70: 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72  10 and A10=<expr
4a80: 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  >..**.** If ther
4a90: 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74  e are multiple t
4aa0: 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
4ab0: 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
4ac0: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
4ad0: 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79  pr>".** then try
4ae0: 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74   for the one wit
4af0: 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65  h no dependencie
4b00: 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e  s on <expr> - in
4b10: 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77 68 65   other words whe
4b20: 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20  re.** <expr> is 
4b30: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
4b40: 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69  ssion of some ki
4b50: 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e  nd.  Only return
4b60: 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74   entries of.** t
4b70: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
4b80: 59 22 20 77 68 65 72 65 20 59 20 69 73 20 61 20  Y" where Y is a 
4b90: 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65  column in anothe
4ba0: 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65  r table if no te
4bb0: 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f  rms of.** the fo
4bc0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73  rm "X <op> <cons
4bd0: 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20  t-expr>" exist. 
4be0: 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69    If no terms wi
4bf0: 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48  th a constant RH
4c00: 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20  S.** exist, try 
4c10: 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d  to return a term
4c20: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75   that does not u
4c30: 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a  se WO_EQUIV..*/.
4c40: 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72 6d  static WhereTerm
4c50: 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68   *findTerm(.  Wh
4c60: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
4c70: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
4c80: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65   clause to be se
4c90: 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20  arched */.  int 
4ca0: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
4cb0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
4cc0: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69  er of LHS */.  i
4cd0: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
4ce0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
4cf0: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
4d00: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
4d10: 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d  dy,     /* RHS m
4d20: 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20  ust not overlap 
4d30: 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a  with this mask *
4d40: 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20  /.  u32 op,     
4d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
4d60: 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65  k of WO_xx value
4d70: 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65  s describing ope
4d80: 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78  rator */.  Index
4d90: 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
4da0: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
4db0: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
4dc0: 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e   index, if not N
4dd0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ULL */.){.  Wher
4de0: 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d  eTerm *pResult =
4df0: 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   0;.  WhereTerm 
4e00: 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20  *p;.  WhereScan 
4e10: 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65  scan;..  p = whe
4e20: 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
4e30: 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f  , pWC, iCur, iCo
4e40: 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b  lumn, op, pIdx);
4e50: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
4e60: 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
4e70: 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64  qRight & notRead
4e80: 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  y)==0 ){.      i
4e90: 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69 67 68  f( p->prereqRigh
4ea0: 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70 65  t==0 && (p->eOpe
4eb0: 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20  rator&WO_EQ)!=0 
4ec0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
4ed0: 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n p;.      }.   
4ee0: 20 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d     if( pResult==
4ef0: 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b  0 ) pResult = p;
4f00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77  .    }.    p = w
4f10: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63  hereScanNext(&sc
4f20: 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  an);.  }.  retur
4f30: 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a  n pResult;.}../*
4f40: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
4f50: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
4f60: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72  d exprAnalyze(Sr
4f70: 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61  cList*, WhereCla
4f80: 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  use*, int);../*.
4f90: 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c  ** Call exprAnal
4fa0: 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  yze on all terms
4fb0: 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
4fc0: 73 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  se.  .*/.static 
4fd0: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
4fe0: 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  All(.  SrcList *
4ff0: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
5000: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
5010: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
5020: 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 20 20  use *pWC        
5030: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
5040: 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79  ause to be analy
5050: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  zed */.){.  int 
5060: 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  i;.  for(i=pWC->
5070: 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  nTerm-1; i>=0; i
5080: 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61  --){.    exprAna
5090: 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70  lyze(pTabList, p
50a0: 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  WC, i);.  }.}..#
50b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
50c0: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
50d0: 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  TION./*.** Check
50e0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67   to see if the g
50f0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
5100: 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f  is a LIKE or GLO
5110: 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a  B operator that.
5120: 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69  ** can be optimi
5130: 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61  zed using inequa
5140: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
5150: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
5160: 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e  f it is.** so an
5170: 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  d false if not..
5180: 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66  **.** In order f
5190: 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  or the operator 
51a0: 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c  to be optimizibl
51b0: 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74 20  e, the RHS must 
51c0: 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c  be a string.** l
51d0: 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73  iteral that does
51e0: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
51f0: 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f  a wildcard.  .*/
5200: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69  .static int isLi
5210: 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73  keOrGlob(.  Pars
5220: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
5230: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
5240: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
5250: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
5260: 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
5270: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
5280: 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  ion */.  Expr **
5290: 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f  ppPrefix,  /* Po
52a0: 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49  inter to TK_STRI
52b0: 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  NG expression wi
52c0: 74 68 20 70 61 74 74 65 72 6e 20 70 72 65 66 69  th pattern prefi
52d0: 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43  x */.  int *pisC
52e0: 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65  omplete, /* True
52f0: 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c   if the only wil
5300: 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74 68  dcard is % in th
5310: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
5320: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61   */.  int *pnoCa
5330: 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  se      /* True 
5340: 69 66 20 75 70 70 65 72 63 61 73 65 20 69 73 20  if uppercase is 
5350: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f  equivalent to lo
5360: 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20  wercase */.){.  
5370: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
5380: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  0;         /* St
5390: 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c  ring on RHS of L
53a0: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
53b0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
53c0: 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20  *pLeft;      /* 
53d0: 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73  Right and left s
53e0: 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72  ize of LIKE oper
53f0: 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ator */.  ExprLi
5400: 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  st *pList;      
5410: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
5420: 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20  operands to the 
5430: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
5440: 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20  .  int c;       
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5460: 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20 69   One character i
5470: 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63  n z[] */.  int c
5480: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
5490: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
54a0: 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20  of non-wildcard 
54b0: 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72  prefix character
54c0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33  s */.  char wc[3
54d0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
54e0: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68    /* Wildcard ch
54f0: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71  aracters */.  sq
5500: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
5510: 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
5520: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
5530: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
5540: 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20  ue *pVal = 0;.  
5550: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
5560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
5570: 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a  code of pRight *
5580: 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  /..  if( !sqlite
5590: 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28  3IsLikeFunction(
55a0: 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61  db, pExpr, pnoCa
55b0: 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72  se, wc) ){.    r
55c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66  eturn 0;.  }.#if
55d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49  def SQLITE_EBCDI
55e0: 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65  C.  if( *pnoCase
55f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
5600: 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45  dif.  pList = pE
5610: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
5620: 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61  pLeft = pList->a
5630: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [1].pExpr;.  if(
5640: 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43   pLeft->op!=TK_C
5650: 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c  OLUMN .   || sql
5660: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
5670: 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f  (pLeft)!=SQLITE_
5680: 41 46 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20  AFF_TEXT .   || 
5690: 49 73 56 69 72 74 75 61 6c 28 70 4c 65 66 74 2d  IsVirtual(pLeft-
56a0: 3e 70 54 61 62 29 0a 20 20 29 7b 0a 20 20 20 20  >pTab).  ){.    
56b0: 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d  /* IMP: R-02065-
56c0: 34 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68  49465 The left-h
56d0: 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
56e0: 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65  LIKE or GLOB ope
56f0: 72 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a  rator must.    *
5700: 2a 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  * be the name of
5710: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
5720: 6d 6e 20 77 69 74 68 20 54 45 58 54 20 61 66 66  mn with TEXT aff
5730: 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65  inity. */.    re
5740: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73  turn 0;.  }.  as
5750: 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f  sert( pLeft->iCo
5760: 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a  lumn!=(-1) ); /*
5770: 20 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76   Because IPK nev
5780: 65 72 20 68 61 73 20 41 46 46 5f 54 45 58 54 20  er has AFF_TEXT 
5790: 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 70  */..  pRight = p
57a0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
57b0: 3b 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d  ;.  op = pRight-
57c0: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
57d0: 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20  K_VARIABLE ){.  
57e0: 20 20 56 64 62 65 20 2a 70 52 65 70 72 65 70 61    Vdbe *pReprepa
57f0: 72 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 52 65  re = pParse->pRe
5800: 70 72 65 70 61 72 65 3b 0a 20 20 20 20 69 6e 74  prepare;.    int
5810: 20 69 43 6f 6c 20 3d 20 70 52 69 67 68 74 2d 3e   iCol = pRight->
5820: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 56 61  iColumn;.    pVa
5830: 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  l = sqlite3VdbeG
5840: 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 70 52 65  etBoundValue(pRe
5850: 70 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53  prepare, iCol, S
5860: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b  QLITE_AFF_NONE);
5870: 0a 20 20 20 20 69 66 28 20 70 56 61 6c 20 26 26  .    if( pVal &&
5880: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
5890: 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54  ype(pVal)==SQLIT
58a0: 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20  E_TEXT ){.      
58b0: 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  z = (char *)sqli
58c0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
58d0: 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Val);.    }.    
58e0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
58f0: 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56  rmask(pParse->pV
5900: 64 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  dbe, iCol);.    
5910: 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e  assert( pRight->
5920: 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
5930: 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  || pRight->op==T
5940: 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
5950: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
5960: 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a  _STRING ){.    z
5970: 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f   = pRight->u.zTo
5980: 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ken;.  }.  if( z
5990: 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b   ){.    cnt = 0;
59a0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a  .    while( (c=z
59b0: 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d  [cnt])!=0 && c!=
59c0: 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31  wc[0] && c!=wc[1
59d0: 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b  ] && c!=wc[2] ){
59e0: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
59f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21    }.    if( cnt!
5a00: 3d 30 20 26 26 20 32 35 35 21 3d 28 75 38 29 7a  =0 && 255!=(u8)z
5a10: 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20 20 20  [cnt-1] ){.     
5a20: 20 45 78 70 72 20 2a 70 50 72 65 66 69 78 3b 0a   Expr *pPrefix;.
5a30: 20 20 20 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65        *pisComple
5a40: 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26  te = c==wc[0] &&
5a50: 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20   z[cnt+1]==0;.  
5a60: 20 20 20 20 70 50 72 65 66 69 78 20 3d 20 73 71      pPrefix = sq
5a70: 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
5a80: 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20 20 20  _STRING, z);.   
5a90: 20 20 20 69 66 28 20 70 50 72 65 66 69 78 20 29     if( pPrefix )
5aa0: 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b   pPrefix->u.zTok
5ab0: 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20 20 20  en[cnt] = 0;.   
5ac0: 20 20 20 2a 70 70 50 72 65 66 69 78 20 3d 20 70     *ppPrefix = p
5ad0: 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 69 66  Prefix;.      if
5ae0: 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ( op==TK_VARIABL
5af0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62  E ){.        Vdb
5b00: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
5b10: 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20 73 71  Vdbe;.        sq
5b20: 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
5b30: 61 73 6b 28 76 2c 20 70 52 69 67 68 74 2d 3e 69  ask(v, pRight->i
5b40: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
5b50: 20 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74   if( *pisComplet
5b60: 65 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a  e && pRight->u.z
5b70: 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20  Token[1] ){.    
5b80: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
5b90: 72 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20  rhs of the LIKE 
5ba0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
5bb0: 76 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68  variable, and th
5bc0: 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20  e current.      
5bd0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
5be0: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61  the variable mea
5bf0: 6e 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ns there is no n
5c00: 65 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  eed to invoke th
5c10: 65 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20  e LIKE.         
5c20: 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68   ** function, th
5c30: 65 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c  en no OP_Variabl
5c40: 65 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20  e will be added 
5c50: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
5c60: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69            ** Thi
5c70: 73 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d  s causes problem
5c80: 73 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  s for the sqlite
5c90: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
5ca0: 5f 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20  _name().        
5cb0: 20 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72    ** API. To wor
5cc0: 6b 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64  karound them, ad
5cd0: 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72  d a dummy OP_Var
5ce0: 69 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20 20  iable here..    
5cf0: 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20        */ .      
5d00: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
5d10: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
5d20: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
5d30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
5d40: 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
5d50: 70 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20 20  pRight, r1);.   
5d60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5d70: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73 71  beChangeP3(v, sq
5d80: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
5d90: 41 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20  Addr(v)-1, 0);. 
5da0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5db0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5dc0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
5dd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
5de0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
5df0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
5e00: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
5e10: 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74  ree(pVal);.  ret
5e20: 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65  urn (z!=0);.}.#e
5e30: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
5e40: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
5e50: 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64  ATION */...#ifnd
5e60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
5e70: 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
5e80: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
5e90: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
5ea0: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
5eb0: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20   form.**.**     
5ec0: 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48      column MATCH
5ed0: 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69   expr.**.** If i
5ee0: 74 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e  t is then return
5ef0: 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20   TRUE.  If not, 
5f00: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f  return FALSE..*/
5f10: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61  .static int isMa
5f20: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45  tchOfColumn(.  E
5f30: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
5f40: 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70  /* Test this exp
5f50: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
5f60: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
5f70: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ..  if( pExpr->o
5f80: 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p!=TK_FUNCTION )
5f90: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5fa0: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
5fb0: 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e  3StrICmp(pExpr->
5fc0: 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22  u.zToken,"match"
5fd0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
5fe0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
5ff0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
6000: 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  st;.  if( pList-
6010: 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20  >nExpr!=2 ){.   
6020: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6030: 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d   if( pList->a[1]
6040: 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b  .pExpr->op != TK
6050: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72  _COLUMN ){.    r
6060: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
6070: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
6080: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6090: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
60a0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ../*.** If the p
60b0: 42 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  Base expression 
60c0: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
60d0: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
60e0: 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69  ause of.** a joi
60f0: 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  n, then transfer
6100: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
6110: 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74   markings over t
6120: 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74  o derived..*/.st
6130: 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66  atic void transf
6140: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45  erJoinMarkings(E
6150: 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45  xpr *pDerived, E
6160: 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 69  xpr *pBase){.  i
6170: 66 28 20 70 44 65 72 69 76 65 64 20 29 7b 0a 20  f( pDerived ){. 
6180: 20 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c 61     pDerived->fla
6190: 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61  gs |= pBase->fla
61a0: 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  gs & EP_FromJoin
61b0: 3b 0a 20 20 20 20 70 44 65 72 69 76 65 64 2d 3e  ;.    pDerived->
61c0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
61d0: 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a  = pBase->iRightJ
61e0: 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 7d 0a  oinTable;.  }.}.
61f0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
6200: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
6210: 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64  IMIZATION) && !d
6220: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6230: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a  IT_SUBQUERY)./*.
6240: 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72  ** Analyze a ter
6250: 6d 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  m that consists 
6260: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f  of two or more O
6270: 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73  R-connected.** s
6280: 75 62 74 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a  ubterms.  So in:
6290: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57  .**.**     ... W
62a0: 48 45 52 45 20 20 28 61 3d 35 29 20 41 4e 44 20  HERE  (a=5) AND 
62b0: 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52 20 64  (b=7 OR c=9 OR d
62c0: 3d 31 33 29 20 41 4e 44 20 28 64 3d 31 33 29 0a  =13) AND (d=13).
62d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
62e0: 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e              ^^^^
62f0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
6300: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6310: 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 65 72  ine analyzes ter
6320: 6d 73 20 73 75 63 68 20 61 73 20 74 68 65 20 6d  ms such as the m
6330: 69 64 64 6c 65 20 74 65 72 6d 20 69 6e 20 74 68  iddle term in th
6340: 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e  e above example.
6350: 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72 54 65 72  .** A WhereOrTer
6360: 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6d 70  m object is comp
6370: 75 74 65 64 20 61 6e 64 20 61 74 74 61 63 68 65  uted and attache
6380: 64 20 74 6f 20 74 68 65 20 74 65 72 6d 20 75 6e  d to the term un
6390: 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c  der.** analysis,
63a0: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   regardless of t
63b0: 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68  he outcome of th
63c0: 65 20 61 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e  e analysis.  Hen
63d0: 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  ce:.**.**     Wh
63e0: 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 20  ereTerm.wtFlags 
63f0: 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46    |=  TERM_ORINF
6400: 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  O.**     WhereTe
6410: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20  rm.u.pOrInfo  = 
6420: 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61   a dynamically a
6430: 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 4f 72  llocated WhereOr
6440: 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a  Term object.**.*
6450: 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67  * The term being
6460: 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74 20 68   analyzed must h
6470: 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ave two or more 
6480: 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  of OR-connected 
6490: 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73  subterms..** A s
64a0: 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20 6d 69  ingle subterm mi
64b0: 67 68 74 20 62 65 20 61 20 73 65 74 20 6f 66 20  ght be a set of 
64c0: 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75  AND-connected su
64d0: 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45  b-subterms..** E
64e0: 78 61 6d 70 6c 65 73 20 6f 66 20 74 65 72 6d 73  xamples of terms
64f0: 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69 73 3a   under analysis:
6500: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29 20 20  .**.**     (A)  
6510: 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20     t1.x=t2.y OR 
6520: 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e  t1.x=t2.z OR t1.
6530: 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e  y=15 OR t1.z=t3.
6540: 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29 20 20  a+5.**     (B)  
6550: 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 65 78     x=expr1 OR ex
6560: 70 72 32 3d 78 20 4f 52 20 78 3d 65 78 70 72 33  pr2=x OR x=expr3
6570: 0a 2a 2a 20 20 20 20 20 28 43 29 20 20 20 20 20  .**     (C)     
6580: 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28 74 31  t1.x=t2.y OR (t1
6590: 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79  .x=t2.z AND t1.y
65a0: 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28 44 29 20  =15).**     (D) 
65b0: 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 28      x=expr1 OR (
65c0: 79 3e 31 31 20 41 4e 44 20 79 3c 32 32 20 41 4e  y>11 AND y<22 AN
65d0: 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f  D z LIKE '*hello
65e0: 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45 29 20 20  *').**     (E)  
65f0: 20 20 20 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e     (p.a=1 AND q.
6600: 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f  b=2 AND r.c=3) O
6610: 52 20 28 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79  R (p.x=4 AND q.y
6620: 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a  =5 AND r.z=6).**
6630: 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a  .** CASE 1:.**.*
6640: 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d  * If all subterm
6650: 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72  s are of the for
6660: 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72 20 73  m T.C=expr for s
6670: 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  ome single colum
6680: 6e 20 6f 66 20 43 20 61 6e 64 0a 2a 2a 20 61 20  n of C and.** a 
6690: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28  single table T (
66a0: 61 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d  as shown in exam
66b0: 70 6c 65 20 42 20 61 62 6f 76 65 29 20 74 68 65  ple B above) the
66c0: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76  n create a new v
66d0: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74  irtual.** term t
66e0: 68 61 74 20 69 73 20 61 6e 20 65 71 75 69 76 61  hat is an equiva
66f0: 6c 65 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69  lent IN expressi
6700: 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
6710: 72 64 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d  rds, if the term
6720: 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  .** being analyz
6730: 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed is:.**.**    
6740: 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20    x = expr1  OR 
6750: 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20   expr2 = x  OR  
6760: 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20  x = expr3.**.** 
6770: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
6780: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c  w virtual term l
6790: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
67a0: 20 20 20 20 20 78 20 49 4e 20 28 65 78 70 72 31       x IN (expr1
67b0: 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a  ,expr2,expr3).**
67c0: 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a  .** CASE 2:.**.*
67d0: 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d  * If all subterm
67e0: 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20  s are indexable 
67f0: 62 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  by a single tabl
6800: 65 20 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a  e T, then set.**
6810: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
6820: 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20  m.eOperator     
6830: 20 20 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f           =  WO_O
6840: 52 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  R.**     WhereTe
6850: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  rm.u.pOrInfo->in
6860: 64 65 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65  dexable  |=  the
6870: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
6880: 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a  or table T.**.**
6890: 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 22 69   A subterm is "i
68a0: 6e 64 65 78 61 62 6c 65 22 20 69 66 20 69 74 20  ndexable" if it 
68b0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  is of the form.*
68c0: 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70  * "T.C <op> <exp
68d0: 72 3e 22 20 77 68 65 72 65 20 43 20 69 73 20 61  r>" where C is a
68e0: 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ny column of tab
68f0: 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70  le T and .** <op
6900: 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c  > is one of "=",
6910: 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c   "<", "<=", ">",
6920: 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22   ">=", "IS NULL"
6930: 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20  , or "IN"..** A 
6940: 73 75 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20  subterm is also 
6950: 69 6e 64 65 78 61 62 6c 65 20 69 66 20 69 74 20  indexable if it 
6960: 69 73 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f  is an AND of two
6970: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73   or more.** subs
6980: 75 62 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74  ubterms at least
6990: 20 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73   one of which is
69a0: 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64   indexable.  Ind
69b0: 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73  exable AND .** s
69c0: 75 62 74 65 72 6d 73 20 68 61 76 65 20 74 68 65  ubterms have the
69d0: 69 72 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74  ir eOperator set
69e0: 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74   to WO_AND and t
69f0: 68 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41  hey have.** u.pA
6a00: 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20  ndInfo set to a 
6a10: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
6a20: 63 61 74 65 64 20 57 68 65 72 65 41 6e 64 54 65  cated WhereAndTe
6a30: 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  rm object..**.**
6a40: 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f   From another po
6a50: 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e  int of view, "in
6a60: 64 65 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74  dexable" means t
6a70: 68 61 74 20 74 68 65 20 73 75 62 74 65 72 6d 20  hat the subterm 
6a80: 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69  could.** potenti
6a90: 61 6c 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  ally be used wit
6aa0: 68 20 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e  h an index if an
6ab0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64   appropriate ind
6ac0: 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68  ex exists..** Th
6ad0: 69 73 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73  is analysis does
6ae0: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68   not consider wh
6af0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
6b00: 20 69 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74   index exists; t
6b10: 68 61 74 0a 2a 2a 20 69 73 20 64 65 63 69 64 65  hat.** is decide
6b20: 64 20 65 6c 73 65 77 68 65 72 65 2e 20 20 54 68  d elsewhere.  Th
6b30: 69 73 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  is analysis only
6b40: 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65   looks at whethe
6b50: 72 20 73 75 62 74 65 72 6d 73 0a 2a 2a 20 61 70  r subterms.** ap
6b60: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
6b70: 64 65 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a  dexing exist..**
6b80: 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73  .** All examples
6b90: 20 41 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f   A through E abo
6ba0: 76 65 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ve satisfy case 
6bb0: 32 2e 20 20 42 75 74 20 69 66 20 61 20 74 65 72  2.  But if a ter
6bc0: 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74 69 73  m.** also statis
6bd0: 66 69 65 73 20 63 61 73 65 20 31 20 28 73 75 63  fies case 1 (suc
6be0: 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f 77 20  h as B) we know 
6bf0: 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a  that the optimiz
6c00: 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79  er will.** alway
6c10: 73 20 70 72 65 66 65 72 20 63 61 73 65 20 31 2c  s prefer case 1,
6c20: 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65   so in that case
6c30: 20 77 65 20 70 72 65 74 65 6e 64 20 74 68 61 74   we pretend that
6c40: 20 63 61 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a   case 2 is not.*
6c50: 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a  * satisfied..**.
6c60: 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65 20 74  ** It might be t
6c70: 68 65 20 63 61 73 65 20 74 68 61 74 20 6d 75 6c  he case that mul
6c80: 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61 72 65  tiple tables are
6c90: 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f 72   indexable.  For
6ca0: 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29   example,.** (E)
6cb0: 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65 78 61   above is indexa
6cc0: 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c  ble on tables P,
6cd0: 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a   Q, and R..**.**
6ce0: 20 54 65 72 6d 73 20 74 68 61 74 20 73 61 74 69   Terms that sati
6cf0: 73 66 79 20 63 61 73 65 20 32 20 61 72 65 20 63  sfy case 2 are c
6d00: 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6c 6f  andidates for lo
6d10: 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a  okup by using.**
6d20: 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65   separate indice
6d30: 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 64 73  s to find rowids
6d40: 20 66 6f 72 20 65 61 63 68 20 73 75 62 74 65 72   for each subter
6d50: 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a  m and composing.
6d60: 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20  ** the union of 
6d70: 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 6e 67  all rowids using
6d80: 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74   a RowSet object
6d90: 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  .  This is simil
6da0: 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70  ar.** to "bitmap
6db0: 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f 74 68   indices" in oth
6dc0: 65 72 20 64 61 74 61 62 61 73 65 20 65 6e 67 69  er database engi
6dd0: 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52  nes..**.** OTHER
6de0: 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  WISE:.**.** If n
6df0: 65 69 74 68 65 72 20 63 61 73 65 20 31 20 6e 6f  either case 1 no
6e00: 72 20 63 61 73 65 20 32 20 61 70 70 6c 79 2c 20  r case 2 apply, 
6e10: 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20 65  then leave the e
6e20: 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 0a  Operator set to.
6e30: 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 74  ** zero.  This t
6e40: 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 75  erm is not usefu
6e50: 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f  l for search..*/
6e60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
6e70: 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a  rAnalyzeOrTerm(.
6e80: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
6ea0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
6eb0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
6ec0: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
6ed0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48   the complete WH
6ee0: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
6ef0: 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20  int idxTerm     
6f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
6f10: 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 72  ex of the OR-ter
6f20: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
6f30: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
6f40: 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43  fo *pWInfo = pWC
6f50: 2d 3e 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  ->pWInfo;       
6f60: 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
6f70: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
6f80: 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
6f90: 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
6fa0: 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  >pParse;        
6fb0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
6fc0: 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
6fd0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
6fe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6ff0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
7000: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ection */.  Wher
7010: 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26  eTerm *pTerm = &
7020: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
7030: 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20      /* The term 
7040: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
7050: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
7060: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20  = pTerm->pExpr; 
7070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7080: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  he expression of
7090: 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69   the term */.  i
70a0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70c0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
70d0: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65  ounters */.  Whe
70e0: 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b  reClause *pOrWc;
70f0: 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b 75         /* Breaku
7100: 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f 20  p of pTerm into 
7110: 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68  subterms */.  Wh
7120: 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
7130: 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75 62  ;       /* A Sub
7140: 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65  -term within the
7150: 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 72   pOrWc */.  Wher
7160: 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f  eOrInfo *pOrInfo
7170: 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f  ;     /* Additio
7180: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
7190: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
71a0: 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61  pTerm */.  Bitma
71b0: 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20  sk chngToIN;    
71c0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74       /* Tables t
71d0: 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66  hat might satisf
71e0: 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 69  y case 1 */.  Bi
71f0: 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b  tmask indexable;
7200: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
7210: 73 20 74 68 61 74 20 61 72 65 20 69 6e 64 65 78  s that are index
7220: 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e 67  able, satisfying
7230: 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a   case 2 */..  /*
7240: 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 20  .  ** Break the 
7250: 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 69  OR clause into i
7260: 74 73 20 73 65 70 61 72 61 74 65 20 73 75 62 74  ts separate subt
7270: 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74 65  erms.  The subte
7280: 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f  rms are.  ** sto
7290: 72 65 64 20 69 6e 20 61 20 57 68 65 72 65 43 6c  red in a WhereCl
72a0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 20 63  ause structure c
72b0: 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69 6e  ontaining within
72c0: 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66 6f   the WhereOrInfo
72d0: 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  .  ** object tha
72e0: 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f  t is attached to
72f0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52   the original OR
7300: 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 20   clause term..  
7310: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 54  */.  assert( (pT
7320: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
7330: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52  TERM_DYNAMIC|TER
7340: 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e  M_ORINFO|TERM_AN
7350: 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20  DINFO))==0 );.  
7360: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
7370: 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54  p==TK_OR );.  pT
7380: 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d  erm->u.pOrInfo =
7390: 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74   pOrInfo = sqlit
73a0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
73b0: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e  b, sizeof(*pOrIn
73c0: 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 49  fo));.  if( pOrI
73d0: 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  nfo==0 ) return;
73e0: 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  .  pTerm->wtFlag
73f0: 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  s |= TERM_ORINFO
7400: 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f 72  ;.  pOrWc = &pOr
7410: 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72  Info->wc;.  wher
7420: 65 43 6c 61 75 73 65 49 6e 69 74 28 70 4f 72 57  eClauseInit(pOrW
7430: 63 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 77 68  c, pWInfo);.  wh
7440: 65 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20  ereSplit(pOrWc, 
7450: 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20  pExpr, TK_OR);. 
7460: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
7470: 70 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20  pSrc, pOrWc);.  
7480: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
7490: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
74a0: 20 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e   assert( pOrWc->
74b0: 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f  nTerm>=2 );..  /
74c0: 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74  *.  ** Compute t
74d0: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
74e0: 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69   that might sati
74f0: 73 66 79 20 63 61 73 65 73 20 31 20 6f 72 20 32  sfy cases 1 or 2
7500: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62  ..  */.  indexab
7510: 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  le = ~(Bitmask)0
7520: 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e  ;.  chngToIN = ~
7530: 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f  (Bitmask)0;.  fo
7540: 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  r(i=pOrWc->nTerm
7550: 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57  -1, pOrTerm=pOrW
7560: 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e  c->a; i>=0 && in
7570: 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f  dexable; i--, pO
7580: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  rTerm++){.    if
7590: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  ( (pOrTerm->eOpe
75a0: 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c  rator & WO_SINGL
75b0: 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  E)==0 ){.      W
75c0: 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e  hereAndInfo *pAn
75d0: 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73  dInfo;.      ass
75e0: 65 72 74 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77  ert( (pOrTerm->w
75f0: 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 41  tFlags & (TERM_A
7600: 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e  NDINFO|TERM_ORIN
7610: 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  FO))==0 );.     
7620: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20   chngToIN = 0;. 
7630: 20 20 20 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20       pAndInfo = 
7640: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
7650: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
7660: 41 6e 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20  AndInfo));.     
7670: 20 69 66 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b   if( pAndInfo ){
7680: 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c  .        WhereCl
7690: 61 75 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20  ause *pAndWC;.  
76a0: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
76b0: 2a 70 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20  *pAndTerm;.     
76c0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
76d0: 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b    Bitmask b = 0;
76e0: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
76f0: 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70  ->u.pAndInfo = p
7700: 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AndInfo;.       
7710: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
7720: 73 20 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46  s |= TERM_ANDINF
7730: 4f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  O;.        pOrTe
7740: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
7750: 57 4f 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20  WO_AND;.        
7760: 70 41 6e 64 57 43 20 3d 20 26 70 41 6e 64 49 6e  pAndWC = &pAndIn
7770: 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20  fo->wc;.        
7780: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
7790: 70 41 6e 64 57 43 2c 20 70 57 43 2d 3e 70 57 49  pAndWC, pWC->pWI
77a0: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 77 68  nfo);.        wh
77b0: 65 72 65 53 70 6c 69 74 28 70 41 6e 64 57 43 2c  ereSplit(pAndWC,
77c0: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c   pOrTerm->pExpr,
77d0: 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 20 20   TK_AND);.      
77e0: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
77f0: 28 70 53 72 63 2c 20 70 41 6e 64 57 43 29 3b 0a  (pSrc, pAndWC);.
7800: 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 2d 3e          pAndWC->
7810: 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20  pOuter = pWC;.  
7820: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7830: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7840: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
7850: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
7860: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  d ){.          f
7870: 6f 72 28 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d  or(j=0, pAndTerm
7880: 3d 70 41 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41  =pAndWC->a; j<pA
7890: 6e 64 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b  ndWC->nTerm; j++
78a0: 2c 20 70 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20  , pAndTerm++){. 
78b0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
78c0: 74 28 20 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78  t( pAndTerm->pEx
78d0: 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pr );.          
78e0: 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28    if( allowedOp(
78f0: 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d  pAndTerm->pExpr-
7900: 3e 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >op) ){.        
7910: 20 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61        b |= getMa
7920: 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
7930: 6b 53 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e  kSet, pAndTerm->
7940: 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20  leftCursor);.   
7950: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7960: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
7970: 0a 20 20 20 20 20 20 20 20 69 6e 64 65 78 61 62  .        indexab
7980: 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d  le &= b;.      }
7990: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
79a0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
79b0: 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b  & TERM_COPIED ){
79c0: 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74  .      /* Skip t
79d0: 68 69 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77  his term for now
79e0: 2e 20 20 57 65 20 72 65 76 69 73 69 74 20 69 74  .  We revisit it
79f0: 20 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73   when we process
7a00: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f   the.      ** co
7a10: 72 72 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d  rresponding TERM
7a20: 5f 56 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f  _VIRTUAL term */
7a30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7a40: 20 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20    Bitmask b;.   
7a50: 20 20 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 26     b = getMask(&
7a60: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
7a70: 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  , pOrTerm->leftC
7a80: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66  ursor);.      if
7a90: 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61  ( pOrTerm->wtFla
7aa0: 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
7ab0: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65  L ){.        Whe
7ac0: 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d  reTerm *pOther =
7ad0: 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65   &pOrWc->a[pOrTe
7ae0: 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20  rm->iParent];.  
7af0: 20 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61        b |= getMa
7b00: 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
7b10: 6b 53 65 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65  kSet, pOther->le
7b20: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
7b30: 20 7d 0a 20 20 20 20 20 20 69 6e 64 65 78 61 62   }.      indexab
7b40: 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 69  le &= b;.      i
7b50: 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  f( (pOrTerm->eOp
7b60: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d  erator & WO_EQ)=
7b70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  =0 ){.        ch
7b80: 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20  ngToIN = 0;.    
7b90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7ba0: 20 63 68 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a   chngToIN &= b;.
7bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7bc0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63  }..  /*.  ** Rec
7bd0: 6f 72 64 20 74 68 65 20 73 65 74 20 6f 66 20 74  ord the set of t
7be0: 61 62 6c 65 73 20 74 68 61 74 20 73 61 74 69 73  ables that satis
7bf0: 66 79 20 63 61 73 65 20 32 2e 20 20 54 68 65 20  fy case 2.  The 
7c00: 73 65 74 20 6d 69 67 68 74 20 62 65 0a 20 20 2a  set might be.  *
7c10: 2a 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  * empty..  */.  
7c20: 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
7c30: 6c 65 20 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a  le = indexable;.
7c40: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
7c50: 6f 72 20 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d  or = indexable==
7c60: 30 20 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a  0 ? 0 : WO_OR;..
7c70: 20 20 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f    /*.  ** chngTo
7c80: 49 4e 20 68 6f 6c 64 73 20 61 20 73 65 74 20 6f  IN holds a set o
7c90: 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 2a 6d  f tables that *m
7ca0: 69 67 68 74 2a 20 73 61 74 69 73 66 79 20 63 61  ight* satisfy ca
7cb0: 73 65 20 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20  se 1.  But.  ** 
7cc0: 77 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f  we have to do so
7cd0: 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68  me additional ch
7ce0: 65 63 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66  ecking to see if
7cf0: 20 63 61 73 65 20 31 20 72 65 61 6c 6c 79 0a 20   case 1 really. 
7d00: 20 2a 2a 20 69 73 20 73 61 74 69 73 66 69 65 64   ** is satisfied
7d10: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67  ..  **.  ** chng
7d20: 54 6f 49 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65  ToIN will hold e
7d30: 69 74 68 65 72 20 30 2c 20 31 2c 20 6f 72 20 32  ither 0, 1, or 2
7d40: 20 62 69 74 73 2e 20 20 54 68 65 20 30 2d 62 69   bits.  The 0-bi
7d50: 74 20 63 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a  t case means.  *
7d60: 2a 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  * that there is 
7d70: 6e 6f 20 70 6f 73 73 69 62 69 6c 69 74 79 20 6f  no possibility o
7d80: 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74  f transforming t
7d90: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74  he OR clause int
7da0: 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65  o an.  ** IN ope
7db0: 72 61 74 6f 72 20 62 65 63 61 75 73 65 20 6f 6e  rator because on
7dc0: 65 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20  e or more terms 
7dd0: 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  in the OR clause
7de0: 20 63 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f   contain.  ** so
7df0: 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
7e00: 61 6e 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d  an == on a colum
7e10: 6e 20 69 6e 20 74 68 65 20 73 69 6e 67 6c 65 20  n in the single 
7e20: 74 61 62 6c 65 2e 20 20 54 68 65 20 31 2d 62 69  table.  The 1-bi
7e30: 74 0a 20 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e  t.  ** case mean
7e40: 73 20 74 68 61 74 20 65 76 65 72 79 20 74 65 72  s that every ter
7e50: 6d 20 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75  m of the OR clau
7e60: 73 65 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  se is of the for
7e70: 6d 0a 20 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f  m.  ** "table.co
7e80: 6c 75 6d 6e 3d 65 78 70 72 22 20 66 6f 72 20 73  lumn=expr" for s
7e90: 6f 6d 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  ome single table
7ea0: 2e 20 20 54 68 65 20 6f 6e 65 20 62 69 74 20 74  .  The one bit t
7eb0: 68 61 74 20 69 73 20 73 65 74 0a 20 20 2a 2a 20  hat is set.  ** 
7ec0: 77 69 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20  will correspond 
7ed0: 74 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61  to the common ta
7ee0: 62 6c 65 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e  ble.  We still n
7ef0: 65 65 64 20 74 6f 20 63 68 65 63 6b 20 74 6f 20  eed to check to 
7f00: 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 74  make.  ** sure t
7f10: 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69  he same column i
7f20: 73 20 75 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65  s used on all te
7f30: 72 6d 73 2e 20 20 54 68 65 20 32 2d 62 69 74 20  rms.  The 2-bit 
7f40: 63 61 73 65 20 69 73 20 77 68 65 6e 0a 20 20 2a  case is when.  *
7f50: 2a 20 74 68 65 20 61 6c 6c 20 74 65 72 6d 73 20  * the all terms 
7f60: 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  are of the form 
7f70: 22 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74  "table1.column=t
7f80: 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20  able2.column".  
7f90: 49 74 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  It.  ** might be
7fa0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 6f 72   possible to for
7fb0: 6d 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  m an IN operator
7fc0: 20 77 69 74 68 20 65 69 74 68 65 72 20 74 61 62   with either tab
7fd0: 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20  le1.column.  ** 
7fe0: 6f 72 20 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e  or table2.column
7ff0: 20 61 73 20 74 68 65 20 4c 48 53 20 69 66 20 65   as the LHS if e
8000: 69 74 68 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20  ither is common 
8010: 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  to every term of
8020: 0a 20 20 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61  .  ** the OR cla
8030: 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  use..  **.  ** N
8040: 6f 74 65 20 74 68 61 74 20 74 65 72 6d 73 20 6f  ote that terms o
8050: 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c  f the form "tabl
8060: 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e  e.column1=table.
8070: 63 6f 6c 75 6d 6e 32 22 20 28 74 68 65 0a 20 20  column2" (the.  
8080: 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e  ** same table on
8090: 20 62 6f 74 68 20 73 69 7a 65 73 20 6f 66 20 74   both sizes of t
80a0: 68 65 20 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65  he ==) cannot be
80b0: 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f   optimized..  */
80c0: 0a 20 20 69 66 28 20 63 68 6e 67 54 6f 49 4e 20  .  if( chngToIN 
80d0: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43  ){.    int okToC
80e0: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20  hngToIN = 0;    
80f0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
8100: 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e  conversion to IN
8110: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20   is valid */.   
8120: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d   int iColumn = -
8130: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  1;         /* Co
8140: 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68  lumn index on lh
8150: 73 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  s of IN operator
8160: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72   */.    int iCur
8170: 73 6f 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  sor = -1;       
8180: 20 20 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f    /* Table curso
8190: 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  r common to all 
81a0: 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74  terms */.    int
81b0: 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   j = 0;         
81c0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
81d0: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f  ounter */..    /
81e0: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74  * Search for a t
81f0: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  able and column 
8200: 74 68 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20  that appears on 
8210: 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a  one side or the.
8220: 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20      ** other of 
8230: 74 68 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20  the == operator 
8240: 69 6e 20 65 76 65 72 79 20 73 75 62 74 65 72 6d  in every subterm
8250: 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 61 6e  .  That table an
8260: 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20  d column.    ** 
8270: 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64  will be recorded
8280: 20 69 6e 20 69 43 75 72 73 6f 72 20 61 6e 64 20   in iCursor and 
8290: 69 43 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20  iColumn.  There 
82a0: 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 6e 79  might not be any
82b0: 0a 20 20 20 20 2a 2a 20 73 75 63 68 20 74 61 62  .    ** such tab
82c0: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20  le and column.  
82d0: 53 65 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  Set okToChngToIN
82e0: 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61   if an appropria
82f0: 74 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  te table.    ** 
8300: 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f  and column is fo
8310: 75 6e 64 20 62 75 74 20 6c 65 61 76 65 20 6f 6b  und but leave ok
8320: 54 6f 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65  ToChngToIN false
8330: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   if not found.. 
8340: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d     */.    for(j=
8350: 30 3b 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43  0; j<2 && !okToC
8360: 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20  hngToIN; j++){. 
8370: 20 20 20 20 20 70 4f 72 54 65 72 6d 20 3d 20 70       pOrTerm = p
8380: 4f 72 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66  OrWc->a;.      f
8390: 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  or(i=pOrWc->nTer
83a0: 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  m-1; i>=0; i--, 
83b0: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
83c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
83d0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
83e0: 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
83f0: 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61    pOrTerm->wtFla
8400: 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f  gs &= ~TERM_OR_O
8410: 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  K;.        if( p
8420: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
8430: 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  or==iCursor ){. 
8440: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
8450: 20 69 73 20 74 68 65 20 32 2d 62 69 74 20 63 61   is the 2-bit ca
8460: 73 65 20 61 6e 64 20 77 65 20 61 72 65 20 6f 6e  se and we are on
8470: 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72   the second iter
8480: 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20  ation and.      
8490: 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74      ** current t
84a0: 65 72 6d 20 69 73 20 66 72 6f 6d 20 74 68 65 20  erm is from the 
84b0: 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2e  first iteration.
84c0: 20 20 53 6f 20 73 6b 69 70 20 74 68 69 73 20 74    So skip this t
84d0: 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  erm. */.        
84e0: 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29    assert( j==1 )
84f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
8500: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
8510: 20 20 20 20 20 20 20 20 69 66 28 20 28 63 68 6e          if( (chn
8520: 67 54 6f 49 4e 20 26 20 67 65 74 4d 61 73 6b 28  gToIN & getMask(
8530: 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
8540: 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  t, pOrTerm->left
8550: 43 75 72 73 6f 72 29 29 3d 3d 30 20 29 7b 0a 20  Cursor))==0 ){. 
8560: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
8570: 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 6f 66   term must be of
8580: 20 74 68 65 20 66 6f 72 6d 20 74 31 2e 61 3d 3d   the form t1.a==
8590: 74 32 2e 62 20 77 68 65 72 65 20 74 32 20 69 73  t2.b where t2 is
85a0: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
85b0: 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 73 65    ** chngToIN se
85c0: 74 20 62 75 74 20 74 31 20 69 73 20 6e 6f 74 2e  t but t1 is not.
85d0: 20 20 54 68 69 73 20 74 65 72 6d 20 77 69 6c 6c    This term will
85e0: 20 62 65 20 65 69 74 68 65 72 20 70 72 65 63 65   be either prece
85f0: 65 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  eded.          *
8600: 2a 20 6f 72 20 66 6f 6c 6c 77 65 64 20 62 79 20  * or follwed by 
8610: 61 6e 20 69 6e 76 65 72 74 65 64 20 63 6f 70 79  an inverted copy
8620: 20 28 74 32 2e 62 3d 3d 74 31 2e 61 29 2e 20 20   (t2.b==t1.a).  
8630: 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 0a  Skip this term .
8640: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
8650: 20 75 73 65 20 69 74 73 20 69 6e 76 65 72 73 69   use its inversi
8660: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  on. */.         
8670: 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65   testcase( pOrTe
8680: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
8690: 52 4d 5f 43 4f 50 49 45 44 20 29 3b 0a 20 20 20  RM_COPIED );.   
86a0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
86b0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
86c0: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
86d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
86e0: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 77  sert( pOrTerm->w
86f0: 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43  tFlags & (TERM_C
8700: 4f 50 49 45 44 7c 54 45 52 4d 5f 56 49 52 54 55  OPIED|TERM_VIRTU
8710: 41 4c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  AL) );.         
8720: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8730: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 43 6f     }.        iCo
8740: 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  lumn = pOrTerm->
8750: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
8760: 20 20 20 20 20 20 69 43 75 72 73 6f 72 20 3d 20        iCursor = 
8770: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
8780: 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65  sor;.        bre
8790: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
87a0: 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
87b0: 20 20 20 20 20 2f 2a 20 4e 6f 20 63 61 6e 64 69       /* No candi
87c0: 64 61 74 65 20 74 61 62 6c 65 2b 63 6f 6c 75 6d  date table+colum
87d0: 6e 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 54 68  n was found.  Th
87e0: 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75  is can only occu
87f0: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  r.        ** on 
8800: 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61  the second itera
8810: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
8820: 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a  assert( j==1 );.
8830: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8840: 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 63 68 6e  IsPowerOfTwo(chn
8850: 67 54 6f 49 4e 29 20 29 3b 0a 20 20 20 20 20 20  gToIN) );.      
8860: 20 20 61 73 73 65 72 74 28 20 63 68 6e 67 54 6f    assert( chngTo
8870: 49 4e 3d 3d 67 65 74 4d 61 73 6b 28 26 70 57 49  IN==getMask(&pWI
8880: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69  nfo->sMaskSet, i
8890: 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20  Cursor) );.     
88a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
88b0: 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
88c0: 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20  ( j==1 );..     
88d0: 20 2f 2a 20 57 65 20 68 61 76 65 20 66 6f 75 6e   /* We have foun
88e0: 64 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 61  d a candidate ta
88f0: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20  ble and column. 
8900: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
8910: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74   that.      ** t
8920: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  able and column 
8930: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65  is common to eve
8940: 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 4f  ry term in the O
8950: 52 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  R clause */.    
8960: 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d    okToChngToIN =
8970: 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20   1;.      for(; 
8980: 69 3e 3d 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67  i>=0 && okToChng
8990: 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  ToIN; i--, pOrTe
89a0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  rm++){.        a
89b0: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
89c0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
89d0: 51 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Q );.        if(
89e0: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
89f0: 72 73 6f 72 21 3d 69 43 75 72 73 6f 72 20 29 7b  rsor!=iCursor ){
8a00: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 54 65  .          pOrTe
8a10: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e  rm->wtFlags &= ~
8a20: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20  TERM_OR_OK;.    
8a30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
8a40: 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  rTerm->u.leftCol
8a50: 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a  umn!=iColumn ){.
8a60: 20 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68            okToCh
8a70: 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20  ngToIN = 0;.    
8a80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8a90: 20 20 20 20 20 69 6e 74 20 61 66 66 4c 65 66 74       int affLeft
8aa0: 2c 20 61 66 66 52 69 67 68 74 3b 0a 20 20 20 20  , affRight;.    
8ab0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
8ac0: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
8ad0: 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e  is also a column
8ae0: 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e  , then the affin
8af0: 69 74 69 65 73 0a 20 20 20 20 20 20 20 20 20 20  ities.          
8b00: 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69 67 68 74  ** of both right
8b10: 20 61 6e 64 20 6c 65 66 74 20 73 69 64 65 73 20   and left sides 
8b20: 6d 75 73 74 20 62 65 20 73 75 63 68 20 74 68 61  must be such tha
8b30: 74 20 6e 6f 20 74 79 70 65 0a 20 20 20 20 20 20  t no type.      
8b40: 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f      ** conversio
8b50: 6e 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ns are required 
8b60: 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 20 28  on the right.  (
8b70: 54 69 63 6b 65 74 20 23 32 32 34 39 29 0a 20 20  Ticket #2249).  
8b80: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
8b90: 20 20 20 20 20 61 66 66 52 69 67 68 74 20 3d 20       affRight = 
8ba0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
8bb0: 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78  ity(pOrTerm->pEx
8bc0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
8bd0: 20 20 20 20 20 20 20 61 66 66 4c 65 66 74 20 3d         affLeft =
8be0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
8bf0: 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45  nity(pOrTerm->pE
8c00: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
8c10: 20 20 20 20 20 20 20 69 66 28 20 61 66 66 52 69         if( affRi
8c20: 67 68 74 21 3d 30 20 26 26 20 61 66 66 52 69 67  ght!=0 && affRig
8c30: 68 74 21 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20  ht!=affLeft ){. 
8c40: 20 20 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43             okToC
8c50: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20  hngToIN = 0;.   
8c60: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
8c70: 20 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72            pOrTer
8c80: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
8c90: 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  RM_OR_OK;.      
8ca0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
8cb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
8cc0: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
8cd0: 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49  int, okToChngToI
8ce0: 4e 20 69 73 20 74 72 75 65 20 69 66 20 6f 72 69  N is true if ori
8cf0: 67 69 6e 61 6c 20 70 54 65 72 6d 20 73 61 74 69  ginal pTerm sati
8d00: 73 66 69 65 73 0a 20 20 20 20 2a 2a 20 63 61 73  sfies.    ** cas
8d10: 65 20 31 2e 20 20 49 6e 20 74 68 61 74 20 63 61  e 1.  In that ca
8d20: 73 65 2c 20 63 6f 6e 73 74 72 75 63 74 20 61 20  se, construct a 
8d30: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
8d40: 20 74 68 61 74 20 69 73 20 0a 20 20 20 20 2a 2a   that is .    **
8d50: 20 70 54 65 72 6d 20 63 6f 6e 76 65 72 74 65 64   pTerm converted
8d60: 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72   into an IN oper
8d70: 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ator..    */.   
8d80: 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49   if( okToChngToI
8d90: 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N ){.      Expr 
8da0: 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20 20 20  *pDup;          
8db0: 20 20 2f 2a 20 41 20 74 72 61 6e 73 69 65 6e 74    /* A transient
8dc0: 20 64 75 70 6c 69 63 61 74 65 20 65 78 70 72 65   duplicate expre
8dd0: 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
8de0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
8df0: 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 52 48 53   0;   /* The RHS
8e00: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
8e10: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  tor */.      Exp
8e20: 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b 20 20 20  r *pLeft = 0;   
8e30: 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f      /* The LHS o
8e40: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
8e50: 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  r */.      Expr 
8e60: 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
8e70: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
8e80: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
8e90: 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f  ..      for(i=pO
8ea0: 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f  rWc->nTerm-1, pO
8eb0: 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20  rTerm=pOrWc->a; 
8ec0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  i>=0; i--, pOrTe
8ed0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
8ee0: 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46  f( (pOrTerm->wtF
8ef0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f  lags & TERM_OR_O
8f00: 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  K)==0 ) continue
8f10: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
8f20: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
8f30: 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
8f40: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8f50: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
8f60: 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a  sor==iCursor );.
8f70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8f80: 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  pOrTerm->u.leftC
8f90: 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29  olumn==iColumn )
8fa0: 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  ;.        pDup =
8fb0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
8fc0: 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  db, pOrTerm->pEx
8fd0: 70 72 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a  pr->pRight, 0);.
8fe0: 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20          pList = 
8ff0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
9000: 70 70 65 6e 64 28 70 57 49 6e 66 6f 2d 3e 70 50  ppend(pWInfo->pP
9010: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75  arse, pList, pDu
9020: 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66  p);.        pLef
9030: 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  t = pOrTerm->pEx
9040: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
9050: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
9060: 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20   pLeft!=0 );.   
9070: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
9080: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
9090: 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  ft, 0);.      pN
90a0: 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  ew = sqlite3PExp
90b0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c  r(pParse, TK_IN,
90c0: 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20   pDup, 0, 0);.  
90d0: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
90e0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
90f0: 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e  ew;.        tran
9100: 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73  sferJoinMarkings
9110: 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20  (pNew, pExpr);. 
9120: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
9130: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9140: 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65  pNew, EP_xIsSele
9150: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ct) );.        p
9160: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70  New->x.pList = p
9170: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64  List;.        id
9180: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
9190: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
91a0: 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  ew, TERM_VIRTUAL
91b0: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
91c0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
91d0: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20  ( idxNew==0 );. 
91e0: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
91f0: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
9200: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70  xNew);.        p
9210: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
9220: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20  dxTerm];.       
9230: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e   pWC->a[idxNew].
9240: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
9250: 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  m;.        pTerm
9260: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
9270: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9280: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
9290: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
92a0: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
92b0: 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
92c0: 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50 3b 20 20  tor = WO_NOOP;  
92d0: 2f 2a 20 63 61 73 65 20 31 20 74 72 75 6d 70 73  /* case 1 trumps
92e0: 20 63 61 73 65 20 32 20 2a 2f 0a 20 20 20 20 7d   case 2 */.    }
92f0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
9300: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52   !SQLITE_OMIT_OR
9310: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26  _OPTIMIZATION &&
9320: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55   !SQLITE_OMIT_SU
9330: 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  BQUERY */../*.**
9340: 20 54 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   The input to th
9350: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
9360: 20 57 68 65 72 65 54 65 72 6d 20 73 74 72 75 63   WhereTerm struc
9370: 74 75 72 65 20 77 69 74 68 20 6f 6e 6c 79 20 74  ture with only t
9380: 68 65 0a 2a 2a 20 22 70 45 78 70 72 22 20 66 69  he.** "pExpr" fi
9390: 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20 20  eld filled in.  
93a0: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
93b0: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 61 6e  routine is to an
93c0: 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75 62  alyze the.** sub
93d0: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70  expression and p
93e0: 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74 68 65 20  opulate all the 
93f0: 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20  other fields of 
9400: 74 68 65 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a  the WhereTerm.**
9410: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
9420: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
9430: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
9440: 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e 20  rm "<expr> <op> 
9450: 58 22 20 69 74 20 67 65 74 73 20 63 6f 6d 6d 75  X" it gets commu
9460: 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  ted.** to the st
9470: 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66 20 22  andard form of "
9480: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 0a  X <op> <expr>"..
9490: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
94a0: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
94b0: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59  e form "X <op> Y
94c0: 22 20 77 68 65 72 65 20 62 6f 74 68 20 58 20 61  " where both X a
94d0: 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63 6f 6c 75  nd Y are.** colu
94e0: 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72  mns, then the or
94f0: 69 67 69 6e 61 6c 20 65 78 70 72 65 73 73 69 6f  iginal expressio
9500: 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  n is unchanged a
9510: 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  nd a new virtual
9520: 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74 68 65 20  .** term of the 
9530: 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20 58 22 20  form "Y <op> X" 
9540: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
9550: 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64  WHERE clause and
9560: 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 73 65 70  .** analyzed sep
9570: 61 72 61 74 65 6c 79 2e 20 20 54 68 65 20 6f 72  arately.  The or
9580: 69 67 69 6e 61 6c 20 74 65 72 6d 20 69 73 20 6d  iginal term is m
9590: 61 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f  arked with TERM_
95a0: 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64 20 74 68  COPIED.** and th
95b0: 65 20 6e 65 77 20 74 65 72 6d 20 69 73 20 6d 61  e new term is ma
95c0: 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f 44  rked with TERM_D
95d0: 59 4e 41 4d 49 43 20 28 62 65 63 61 75 73 65 20  YNAMIC (because 
95e0: 69 74 27 73 20 70 45 78 70 72 0a 2a 2a 20 6e 65  it's pExpr.** ne
95f0: 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
9600: 77 69 74 68 20 74 68 65 20 57 68 65 72 65 43 6c  with the WhereCl
9610: 61 75 73 65 29 20 61 6e 64 20 54 45 52 4d 5f 56  ause) and TERM_V
9620: 49 52 54 55 41 4c 20 28 62 65 63 61 75 73 65 20  IRTUAL (because 
9630: 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f 6d 6d 75  it.** is a commu
9640: 74 65 64 20 63 6f 70 79 20 6f 66 20 61 20 70 72  ted copy of a pr
9650: 69 6f 72 20 74 65 72 6d 2e 29 20 20 54 68 65 20  ior term.)  The 
9660: 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 68 61  original term ha
9670: 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20 61 6e  s nChild=1.** an
9680: 64 20 74 68 65 20 63 6f 70 79 20 68 61 73 20 69  d the copy has i
9690: 64 78 50 61 72 65 6e 74 20 73 65 74 20 74 6f 20  dxParent set to 
96a0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
96b0: 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e 0a   original term..
96c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
96d0: 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72  xprAnalyze(.  Sr
96e0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
96f0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46          /* the F
9700: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
9710: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
9720: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
9730: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
9740: 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20  .  int idxTerm  
9750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9760: 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 65 72  Index of the ter
9770: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
9780: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
9790: 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43  fo *pWInfo = pWC
97a0: 2d 3e 70 57 49 6e 66 6f 3b 20 2f 2a 20 57 48 45  ->pWInfo; /* WHE
97b0: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
97c0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
97d0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
97e0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
97f0: 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74     /* The term t
9800: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
9810: 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
9820: 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 20 20  *pMaskSet;      
9830: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 74 61      /* Set of ta
9840: 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b 73 20  ble index masks 
9850: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
9860: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9870: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
9880: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e  ression to be an
9890: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d  alyzed */.  Bitm
98a0: 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20  ask prereqLeft; 
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
98c0: 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66  Prerequesites of
98d0: 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66   the pExpr->pLef
98e0: 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  t */.  Bitmask p
98f0: 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 20  rereqAll;       
9900: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65          /* Prere
9910: 71 75 65 73 69 74 65 73 20 6f 66 20 70 45 78 70  quesites of pExp
9920: 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65  r */.  Bitmask e
9930: 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b 20 20  xtraRight = 0;  
9940: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
9950: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e   dependencies on
9960: 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20   LEFT JOIN */.  
9970: 45 78 70 72 20 2a 70 53 74 72 31 20 3d 20 30 3b  Expr *pStr1 = 0;
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9990: 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f   /* RHS of LIKE/
99a0: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
99b0: 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74  .  int isComplet
99c0: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
99d0: 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49      /* RHS of LI
99e0: 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77 69 74  KE/GLOB ends wit
99f0: 68 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20  h wildcard */.  
9a00: 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20  int noCase = 0; 
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a20: 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20 64 69   /* LIKE/GLOB di
9a30: 73 74 69 6e 67 75 69 73 68 65 73 20 63 61 73 65  stinguishes case
9a40: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a60: 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65         /* Top-le
9a70: 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20 70  vel operator.  p
9a80: 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61  Expr->op */.  Pa
9a90: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
9aa0: 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 2f  Info->pParse;  /
9ab0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
9ac0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
9ad0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9ae0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
9af0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
9b00: 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  /..  if( db->mal
9b10: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
9b20: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
9b30: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
9b40: 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b  dxTerm];.  pMask
9b50: 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  Set = &pWInfo->s
9b60: 4d 61 73 6b 53 65 74 3b 0a 20 20 70 45 78 70 72  MaskSet;.  pExpr
9b70: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
9b80: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
9b90: 2d 3e 6f 70 21 3d 54 4b 5f 41 53 20 26 26 20 70  ->op!=TK_AS && p
9ba0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
9bb0: 4c 41 54 45 20 29 3b 0a 20 20 70 72 65 72 65 71  LATE );.  prereq
9bc0: 4c 65 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65  Left = exprTable
9bd0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
9be0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
9bf0: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
9c00: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
9c10: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9c20: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
9c30: 20 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72   );.    if( Expr
9c40: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
9c50: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
9c60: 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   ){.      pTerm-
9c70: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
9c80: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
9c90: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
9ca0: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  xpr->x.pSelect);
9cb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9cc0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
9cd0: 69 67 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54  ight = exprListT
9ce0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
9cf0: 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  et, pExpr->x.pLi
9d00: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  st);.    }.  }el
9d10: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53  se if( op==TK_IS
9d20: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65 72  NULL ){.    pTer
9d30: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
9d40: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
9d50: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
9d60: 67 68 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55  ght = exprTableU
9d70: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
9d80: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
9d90: 20 7d 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d   }.  prereqAll =
9da0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
9db0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29  pMaskSet, pExpr)
9dc0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
9dd0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
9de0: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
9df0: 20 20 20 42 69 74 6d 61 73 6b 20 78 20 3d 20 67     Bitmask x = g
9e00: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
9e10: 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f   pExpr->iRightJo
9e20: 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 72  inTable);.    pr
9e30: 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20  ereqAll |= x;.  
9e40: 20 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 78    extraRight = x
9e50: 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73  -1;  /* ON claus
9e60: 65 20 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20  e terms may not 
9e70: 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
9e80: 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20 20  index.          
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
9ea0: 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66  on left table of
9eb0: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54   a LEFT JOIN.  T
9ec0: 69 63 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a 20  icket #3015 */. 
9ed0: 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72   }.  pTerm->prer
9ee0: 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c  eqAll = prereqAl
9ef0: 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74  l;.  pTerm->left
9f00: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70  Cursor = -1;.  p
9f10: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
9f20: 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70  -1;.  pTerm->eOp
9f30: 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66  erator = 0;.  if
9f40: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20  ( allowedOp(op) 
9f50: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65  ){.    Expr *pLe
9f60: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
9f70: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70  SkipCollate(pExp
9f80: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 45  r->pLeft);.    E
9f90: 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 73 71  xpr *pRight = sq
9fa0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
9fb0: 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67  late(pExpr->pRig
9fc0: 68 74 29 3b 0a 20 20 20 20 75 31 36 20 6f 70 4d  ht);.    u16 opM
9fd0: 61 73 6b 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72  ask = (pTerm->pr
9fe0: 65 72 65 71 52 69 67 68 74 20 26 20 70 72 65 72  ereqRight & prer
9ff0: 65 71 4c 65 66 74 29 3d 3d 30 20 3f 20 57 4f 5f  eqLeft)==0 ? WO_
a000: 41 4c 4c 20 3a 20 57 4f 5f 45 51 55 49 56 3b 0a  ALL : WO_EQUIV;.
a010: 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f      if( pLeft->o
a020: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
a030: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66        pTerm->lef
a040: 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d  tCursor = pLeft-
a050: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
a060: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
a070: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
a080: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  umn;.      pTerm
a090: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70  ->eOperator = op
a0a0: 65 72 61 74 6f 72 4d 61 73 6b 28 6f 70 29 20 26  eratorMask(op) &
a0b0: 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20   opMask;.    }. 
a0c0: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 26 26     if( pRight &&
a0d0: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
a0e0: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
a0f0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b  WhereTerm *pNew;
a100: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75  .      Expr *pDu
a110: 70 3b 0a 20 20 20 20 20 20 75 31 36 20 65 45 78  p;.      u16 eEx
a120: 74 72 61 4f 70 20 3d 20 30 3b 20 20 20 20 20 20  traOp = 0;      
a130: 20 20 2f 2a 20 45 78 74 72 61 20 62 69 74 73 20    /* Extra bits 
a140: 66 6f 72 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61  for pNew->eOpera
a150: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  tor */.      if(
a160: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
a170: 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  or>=0 ){.       
a180: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
a190: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
a1a0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
a1b0: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
a1c0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
a1d0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
a1e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
a1f0: 65 6c 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b  elete(db, pDup);
a200: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
a210: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
a220: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
a230: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
a240: 70 57 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f  pWC, pDup, TERM_
a250: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
a260: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69  AMIC);.        i
a270: 66 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72  f( idxNew==0 ) r
a280: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70  eturn;.        p
a290: 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  New = &pWC->a[id
a2a0: 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 70  xNew];.        p
a2b0: 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  New->iParent = i
a2c0: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  dxTerm;.        
a2d0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
a2e0: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
a2f0: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
a300: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65  = 1;.        pTe
a310: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
a320: 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20  ERM_COPIED;.    
a330: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
a340: 70 3d 3d 54 4b 5f 45 51 0a 20 20 20 20 20 20 20  p==TK_EQ.       
a350: 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
a360: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
a370: 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20  FromJoin).      
a380: 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
a390: 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
a3a0: 4c 49 54 45 5f 54 72 61 6e 73 69 74 69 76 65 29  LITE_Transitive)
a3b0: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
a3c0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
a3d0: 65 72 61 74 6f 72 20 7c 3d 20 57 4f 5f 45 51 55  erator |= WO_EQU
a3e0: 49 56 3b 0a 20 20 20 20 20 20 20 20 20 20 65 45  IV;.          eE
a3f0: 78 74 72 61 4f 70 20 3d 20 57 4f 5f 45 51 55 49  xtraOp = WO_EQUI
a400: 56 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  V;.        }.   
a410: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a420: 20 20 70 44 75 70 20 3d 20 70 45 78 70 72 3b 0a    pDup = pExpr;.
a430: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70          pNew = p
a440: 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
a450: 20 20 20 20 65 78 70 72 43 6f 6d 6d 75 74 65 28      exprCommute(
a460: 70 50 61 72 73 65 2c 20 70 44 75 70 29 3b 0a 20  pParse, pDup);. 
a470: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
a480: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
a490: 61 74 65 28 70 44 75 70 2d 3e 70 4c 65 66 74 29  ate(pDup->pLeft)
a4a0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65  ;.      pNew->le
a4b0: 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74  ftCursor = pLeft
a4c0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
a4d0: 70 4e 65 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  pNew->u.leftColu
a4e0: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
a4f0: 75 6d 6e 3b 0a 20 20 20 20 20 20 74 65 73 74 63  umn;.      testc
a500: 61 73 65 28 20 28 70 72 65 72 65 71 4c 65 66 74  ase( (prereqLeft
a510: 20 7c 20 65 78 74 72 61 52 69 67 68 74 29 20 21   | extraRight) !
a520: 3d 20 70 72 65 72 65 71 4c 65 66 74 20 29 3b 0a  = prereqLeft );.
a530: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
a540: 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71  eqRight = prereq
a550: 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68  Left | extraRigh
a560: 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  t;.      pNew->p
a570: 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65  rereqAll = prere
a580: 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77  qAll;.      pNew
a590: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 28 6f  ->eOperator = (o
a5a0: 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 44 75 70  peratorMask(pDup
a5b0: 2d 3e 6f 70 29 20 2b 20 65 45 78 74 72 61 4f 70  ->op) + eExtraOp
a5c0: 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20  ) & opMask;.    
a5d0: 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  }.  }..#ifndef S
a5e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
a5f0: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  EN_OPTIMIZATION.
a600: 20 20 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69    /* If a term i
a610: 73 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70  s the BETWEEN op
a620: 65 72 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74  erator, create t
a630: 77 6f 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74  wo new virtual t
a640: 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64  erms.  ** that d
a650: 65 66 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20  efine the range 
a660: 74 68 61 74 20 74 68 65 20 42 45 54 57 45 45 4e  that the BETWEEN
a670: 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f   implements.  Fo
a680: 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  r example:.  **.
a690: 20 20 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57    **      a BETW
a6a0: 45 45 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a  EEN b AND c.  **
a6b0: 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74  .  ** is convert
a6c0: 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20  ed into:.  **.  
a6d0: 2a 2a 20 20 20 20 20 20 28 61 20 42 45 54 57 45  **      (a BETWE
a6e0: 45 4e 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20  EN b AND c) AND 
a6f0: 28 61 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63  (a>=b) AND (a<=c
a700: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
a710: 74 77 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72  two new terms ar
a720: 65 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65  e added onto the
a730: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72   end of the Wher
a740: 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a  eClause object..
a750: 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72    ** The new ter
a760: 6d 73 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22  ms are "dynamic"
a770: 20 61 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65   and are childre
a780: 6e 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  n of the origina
a790: 6c 20 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74  l BETWEEN.  ** t
a7a0: 65 72 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73  erm.  That means
a7b0: 20 74 68 61 74 20 69 66 20 74 68 65 20 42 45 54   that if the BET
a7c0: 57 45 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64  WEEN term is cod
a7d0: 65 64 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e  ed, the children
a7e0: 20 61 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65   are.  ** skippe
a7f0: 64 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63  d.  Or, if the c
a800: 68 69 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69  hildren are sati
a810: 73 66 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65  sfied by an inde
a820: 78 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  x, the original.
a830: 20 20 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72    ** BETWEEN ter
a840: 6d 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20  m is skipped..  
a850: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45  */.  else if( pE
a860: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57  xpr->op==TK_BETW
a870: 45 45 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d  EEN && pWC->op==
a880: 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78  TK_AND ){.    Ex
a890: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
a8a0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
a8b0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
a8c0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f  tatic const u8 o
a8d0: 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54  ps[] = {TK_GE, T
a8e0: 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72  K_LE};.    asser
a8f0: 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20  t( pList!=0 );. 
a900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
a910: 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20  ->nExpr==2 );.  
a920: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
a930: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
a940: 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20   *pNewExpr;.    
a950: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
a960: 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73      pNewExpr = s
a970: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
a980: 73 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20  se, ops[i], .   
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a9b0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
a9c0: 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20  pr->pLeft, 0),. 
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a9f0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
aa00: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
aa10: 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  , 0), 0);.      
aa20: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
aa30: 69 6e 67 73 28 70 4e 65 77 45 78 70 72 2c 20 70  ings(pNewExpr, p
aa40: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 64 78  Expr);.      idx
aa50: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
aa60: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
aa70: 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54  wExpr, TERM_VIRT
aa80: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
aa90: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
aaa0: 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a  e( idxNew==0 );.
aab0: 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a        exprAnalyz
aac0: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
aad0: 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72  New);.      pTer
aae0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
aaf0: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d  erm];.      pWC-
ab00: 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65  >a[idxNew].iPare
ab10: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
ab20: 20 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e    }.    pTerm->n
ab30: 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23  Child = 2;.  }.#
ab40: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
ab50: 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54  OMIT_BETWEEN_OPT
ab60: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
ab70: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
ab80: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
ab90: 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69  ZATION) && !defi
aba0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
abb0: 53 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41  SUBQUERY).  /* A
abc0: 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68  nalyze a term th
abd0: 61 74 20 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f  at is composed o
abe0: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75  f two or more su
abf0: 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64  bterms connected
ac00: 20 62 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f   by.  ** an OR o
ac10: 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20  perator..  */.  
ac20: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
ac30: 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20  op==TK_OR ){.   
ac40: 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e 6f 70   assert( pWC->op
ac50: 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20  ==TK_AND );.    
ac60: 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72  exprAnalyzeOrTer
ac70: 6d 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  m(pSrc, pWC, idx
ac80: 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d  Term);.    pTerm
ac90: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
aca0: 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  rm];.  }.#endif 
acb0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  /* SQLITE_OMIT_O
acc0: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  R_OPTIMIZATION *
acd0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
ace0: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
acf0: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64  MIZATION.  /* Ad
ad00: 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  d constraints to
ad10: 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72   reduce the sear
ad20: 63 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49  ch space on a LI
ad30: 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20  KE or GLOB.  ** 
ad40: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20  operator..  **. 
ad50: 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65   ** A like patte
ad60: 72 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rn of the form "
ad70: 78 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20 69  x LIKE 'abc%'" i
ad80: 73 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63  s changed into c
ad90: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a  onstraints.  **.
ada0: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e    **          x>
adb0: 3d 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61 62  ='abc' AND x<'ab
adc0: 64 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61  d' AND x LIKE 'a
add0: 62 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  bc%'.  **.  ** T
ade0: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
adf0: 72 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 20  r of the prefix 
ae00: 22 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65  "abc" is increme
ae10: 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65  nted to form the
ae20: 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f  .  ** terminatio
ae30: 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64  n condition "abd
ae40: 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  "..  */.  if( pW
ae50: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20  C->op==TK_AND . 
ae60: 20 20 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f    && isLikeOrGlo
ae70: 62 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  b(pParse, pExpr,
ae80: 20 26 70 53 74 72 31 2c 20 26 69 73 43 6f 6d 70   &pStr1, &isComp
ae90: 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20  lete, &noCase). 
aea0: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c   ){.    Expr *pL
aeb0: 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 48  eft;       /* LH
aec0: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f  S of LIKE/GLOB o
aed0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45  perator */.    E
aee0: 78 70 72 20 2a 70 53 74 72 32 3b 20 20 20 20 20  xpr *pStr2;     
aef0: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53 74    /* Copy of pSt
af00: 72 31 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b 45  r1 - RHS of LIKE
af10: 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a  /GLOB operator *
af20: 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  /.    Expr *pNew
af30: 45 78 70 72 31 3b 0a 20 20 20 20 45 78 70 72 20  Expr1;.    Expr 
af40: 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20  *pNewExpr2;.    
af50: 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20 20 20  int idxNew1;.   
af60: 20 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20 20   int idxNew2;.  
af70: 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6c 53 65 71    Token sCollSeq
af80: 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f  Name;  /* Name o
af90: 66 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  f collating sequ
afa0: 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65  ence */..    pLe
afb0: 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ft = pExpr->x.pL
afc0: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
afd0: 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c  .    pStr2 = sql
afe0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
aff0: 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69  pStr1, 0);.    i
b000: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
b010: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38  iled ){.      u8
b020: 20 63 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f   c, *pC;       /
b030: 2a 20 4c 61 73 74 20 63 68 61 72 61 63 74 65 72  * Last character
b040: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
b050: 74 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20  t wildcard */.  
b060: 20 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70      pC = (u8*)&p
b070: 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73  Str2->u.zToken[s
b080: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
b090: 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d  Str2->u.zToken)-
b0a0: 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70  1];.      c = *p
b0b0: 43 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43  C;.      if( noC
b0c0: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ase ){.        /
b0d0: 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74  * The point is t
b0e0: 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
b0f0: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62  last character b
b100: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a  efore the first.
b110: 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63          ** wildc
b120: 61 72 64 2e 20 20 42 75 74 20 69 66 20 77 65 20  ard.  But if we 
b130: 69 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74  increment '@', t
b140: 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74  hat will push it
b150: 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
b160: 20 20 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20    ** alphabetic 
b170: 72 61 6e 67 65 20 77 68 65 72 65 20 63 61 73 65  range where case
b180: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c   conversions wil
b190: 6c 20 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20  l mess up the . 
b1a0: 20 20 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61         ** inequa
b1b0: 6c 69 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20  lity.  To avoid 
b1c0: 74 68 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  this, make sure 
b1d0: 74 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20  to also run the 
b1e0: 66 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  full.        ** 
b1f0: 4c 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64  LIKE on all cand
b200: 69 64 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  idate expression
b210: 73 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68  s by clearing th
b220: 65 20 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61  e isComplete fla
b230: 67 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  g.        */.   
b240: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d       if( c=='A'-
b250: 31 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d  1 ) isComplete =
b260: 20 30 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   0;.        c = 
b270: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
b280: 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a  wer[c];.      }.
b290: 20 20 20 20 20 20 2a 70 43 20 3d 20 63 20 2b 20        *pC = c + 
b2a0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 6f  1;.    }.    sCo
b2b0: 6c 6c 53 65 71 4e 61 6d 65 2e 7a 20 3d 20 6e 6f  llSeqName.z = no
b2c0: 43 61 73 65 20 3f 20 22 4e 4f 43 41 53 45 22 20  Case ? "NOCASE" 
b2d0: 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  : "BINARY";.    
b2e0: 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e 6e 20 3d  sCollSeqName.n =
b2f0: 20 36 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72   6;.    pNewExpr
b300: 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  1 = sqlite3ExprD
b310: 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29  up(db, pLeft, 0)
b320: 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31 20  ;.    pNewExpr1 
b330: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
b340: 50 61 72 73 65 2c 20 54 4b 5f 47 45 2c 20 0a 20  Parse, TK_GE, . 
b350: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b360: 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54  3ExprAddCollateT
b370: 6f 6b 65 6e 28 70 50 61 72 73 65 2c 70 4e 65 77  oken(pParse,pNew
b380: 45 78 70 72 31 2c 26 73 43 6f 6c 6c 53 65 71 4e  Expr1,&sCollSeqN
b390: 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ame),.          
b3a0: 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20   pStr1, 0);.    
b3b0: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
b3c0: 69 6e 67 73 28 70 4e 65 77 45 78 70 72 31 2c 20  ings(pNewExpr1, 
b3d0: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 64 78 4e  pExpr);.    idxN
b3e0: 65 77 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73  ew1 = whereClaus
b3f0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
b400: 77 45 78 70 72 31 2c 20 54 45 52 4d 5f 56 49 52  wExpr1, TERM_VIR
b410: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
b420: 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  C);.    testcase
b430: 28 20 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a  ( idxNew1==0 );.
b440: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
b450: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
b460: 77 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70  w1);.    pNewExp
b470: 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
b480: 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30  Dup(db, pLeft, 0
b490: 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32  );.    pNewExpr2
b4a0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
b4b0: 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20  pParse, TK_LT,. 
b4c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b4d0: 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54  3ExprAddCollateT
b4e0: 6f 6b 65 6e 28 70 50 61 72 73 65 2c 70 4e 65 77  oken(pParse,pNew
b4f0: 45 78 70 72 32 2c 26 73 43 6f 6c 6c 53 65 71 4e  Expr2,&sCollSeqN
b500: 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ame),.          
b510: 20 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20   pStr2, 0);.    
b520: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
b530: 69 6e 67 73 28 70 4e 65 77 45 78 70 72 32 2c 20  ings(pNewExpr2, 
b540: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 64 78 4e  pExpr);.    idxN
b550: 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73  ew2 = whereClaus
b560: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
b570: 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52  wExpr2, TERM_VIR
b580: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
b590: 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  C);.    testcase
b5a0: 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a  ( idxNew2==0 );.
b5b0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
b5c0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
b5d0: 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  w2);.    pTerm =
b5e0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
b5f0: 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d  ];.    if( isCom
b600: 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70  plete ){.      p
b610: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69  WC->a[idxNew1].i
b620: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
b630: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
b640: 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20  dxNew2].iParent 
b650: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
b660: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
b670: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   2;.    }.  }.#e
b680: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
b690: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
b6a0: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
b6b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
b6c0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
b6d0: 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61  Add a WO_MATCH a
b6e0: 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f  uxiliary term to
b6f0: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
b700: 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  set if the.  ** 
b710: 63 75 72 72 65 6e 74 20 65 78 70 72 65 73 73 69  current expressi
b720: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
b730: 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48  m:  column MATCH
b740: 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73   expr..  ** This
b750: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
b760: 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65 73  used by the xBes
b770: 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f  tIndex methods o
b780: 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74  f.  ** virtual t
b790: 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69  ables.  The nati
b7a0: 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  ve query optimiz
b7b0: 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65  er does not atte
b7c0: 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61  mpt.  ** to do a
b7d0: 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54  nything with MAT
b7e0: 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  CH functions..  
b7f0: 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68  */.  if( isMatch
b800: 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20  OfColumn(pExpr) 
b810: 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  ){.    int idxNe
b820: 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  w;.    Expr *pRi
b830: 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20  ght, *pLeft;.   
b840: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77   WhereTerm *pNew
b850: 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73  Term;.    Bitmas
b860: 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20  k prereqColumn, 
b870: 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20  prereqExpr;..   
b880: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
b890: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
b8a0: 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20  Expr;.    pLeft 
b8b0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
b8c0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
b8d0: 20 20 70 72 65 72 65 71 45 78 70 72 20 3d 20 65    prereqExpr = e
b8e0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
b8f0: 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b  askSet, pRight);
b900: 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d  .    prereqColum
b910: 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  n = exprTableUsa
b920: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65  ge(pMaskSet, pLe
b930: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72  ft);.    if( (pr
b940: 65 72 65 71 45 78 70 72 20 26 20 70 72 65 72 65  ereqExpr & prere
b950: 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20  qColumn)==0 ){. 
b960: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
b970: 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45  xpr;.      pNewE
b980: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
b990: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41  pr(pParse, TK_MA
b9a0: 54 43 48 2c 20 0a 20 20 20 20 20 20 20 20 20 20  TCH, .          
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9c0: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78      0, sqlite3Ex
b9d0: 70 72 44 75 70 28 64 62 2c 20 70 52 69 67 68 74  prDup(db, pRight
b9e0: 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  , 0), 0);.      
b9f0: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
ba00: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
ba10: 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56  pNewExpr, TERM_V
ba20: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
ba30: 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MIC);.      test
ba40: 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20  case( idxNew==0 
ba50: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  );.      pNewTer
ba60: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
ba70: 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
ba80: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
ba90: 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20   = prereqExpr;. 
baa0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c       pNewTerm->l
bab0: 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
bac0: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
bad0: 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66   pNewTerm->u.lef
bae0: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
baf0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
bb00: 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61  pNewTerm->eOpera
bb10: 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a  tor = WO_MATCH;.
bb20: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
bb30: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
bb40: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  m;.      pTerm =
bb50: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
bb60: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
bb70: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
bb80: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
bb90: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
bba0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
bbb0: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
bbc0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
bbd0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
bbe0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
bbf0: 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
bc00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
bc10: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
bc20: 41 54 34 0a 20 20 2f 2a 20 57 68 65 6e 20 73 71  AT4.  /* When sq
bc30: 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f  lite_stat3 histo
bc40: 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61  gram data is ava
bc50: 69 6c 61 62 6c 65 20 61 6e 20 6f 70 65 72 61 74  ilable an operat
bc60: 6f 72 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66  or of the.  ** f
bc70: 6f 72 6d 20 22 78 20 49 53 20 4e 4f 54 20 4e 55  orm "x IS NOT NU
bc80: 4c 4c 22 20 63 61 6e 20 73 6f 6d 65 74 69 6d 65  LL" can sometime
bc90: 73 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 6d  s be evaluated m
bca0: 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79 0a  ore efficiently.
bcb0: 20 20 2a 2a 20 61 73 20 22 78 3e 4e 55 4c 4c 22    ** as "x>NULL"
bcc0: 20 69 66 20 78 20 69 73 20 6e 6f 74 20 61 6e 20   if x is not an 
bcd0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
bce0: 4b 45 59 2e 20 20 53 6f 20 63 6f 6e 73 74 72 75  KEY.  So constru
bcf0: 63 74 20 61 0a 20 20 2a 2a 20 76 69 72 74 75 61  ct a.  ** virtua
bd00: 6c 20 74 65 72 6d 20 6f 66 20 74 68 61 74 20 66  l term of that f
bd10: 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  orm..  **.  ** N
bd20: 6f 74 65 20 74 68 61 74 20 74 68 65 20 76 69 72  ote that the vir
bd30: 74 75 61 6c 20 74 65 72 6d 20 6d 75 73 74 20 62  tual term must b
bd40: 65 20 74 61 67 67 65 64 20 77 69 74 68 20 54 45  e tagged with TE
bd50: 52 4d 5f 56 4e 55 4c 4c 2e 20 20 54 68 69 73 0a  RM_VNULL.  This.
bd60: 20 20 2a 2a 20 54 45 52 4d 5f 56 4e 55 4c 4c 20    ** TERM_VNULL 
bd70: 74 61 67 20 77 69 6c 6c 20 73 75 70 70 72 65 73  tag will suppres
bd80: 73 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63  s the not-null c
bd90: 68 65 63 6b 20 61 74 20 74 68 65 20 62 65 67 69  heck at the begi
bda0: 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74 68  nning.  ** of th
bdb0: 65 20 6c 6f 6f 70 2e 20 20 57 69 74 68 6f 75 74  e loop.  Without
bdc0: 20 74 68 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20   the TERM_VNULL 
bdd0: 66 6c 61 67 2c 20 74 68 65 20 6e 6f 74 2d 6e 75  flag, the not-nu
bde0: 6c 6c 20 63 68 65 63 6b 20 61 74 0a 20 20 2a 2a  ll check at.  **
bdf0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
be00: 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 70 72 65 76  e loop will prev
be10: 65 6e 74 20 61 6e 79 20 72 65 73 75 6c 74 73 20  ent any results 
be20: 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 74 75 72  from being retur
be30: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
be40: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f  pExpr->op==TK_NO
be50: 54 4e 55 4c 4c 0a 20 20 20 26 26 20 70 45 78 70  TNULL.   && pExp
be60: 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  r->pLeft->op==TK
be70: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45  _COLUMN.   && pE
be80: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c  xpr->pLeft->iCol
be90: 75 6d 6e 3e 3d 30 0a 20 20 20 26 26 20 4f 70 74  umn>=0.   && Opt
bea0: 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
beb0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74  (db, SQLITE_Stat
bec0: 33 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72  3).  ){.    Expr
bed0: 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20   *pNewExpr;.    
bee0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
bef0: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
bf00: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
bf10: 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54  WhereTerm *pNewT
bf20: 65 72 6d 3b 0a 0a 20 20 20 20 70 4e 65 77 45 78  erm;..    pNewEx
bf30: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
bf40: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 54 2c  r(pParse, TK_GT,
bf50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
bf70: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
bf80: 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20  pLeft, 0),.     
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 45         sqlite3PE
bfb0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e  xpr(pParse, TK_N
bfc0: 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 2c 20 30  ULL, 0, 0, 0), 0
bfd0: 29 3b 0a 0a 20 20 20 20 69 64 78 4e 65 77 20 3d  );..    idxNew =
bfe0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
bff0: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
c000: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c020: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
c030: 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 56  M_DYNAMIC|TERM_V
c040: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20 69  NULL);.    if( i
c050: 64 78 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70  dxNew ){.      p
c060: 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e  NewTerm = &pWC->
c070: 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20  a[idxNew];.     
c080: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
c090: 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20  qRight = 0;.    
c0a0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74    pNewTerm->left
c0b0: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
c0c0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
c0d0: 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  ewTerm->u.leftCo
c0e0: 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43  lumn = pLeft->iC
c0f0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65  olumn;.      pNe
c100: 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  wTerm->eOperator
c110: 20 3d 20 57 4f 5f 47 54 3b 0a 20 20 20 20 20 20   = WO_GT;.      
c120: 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e  pNewTerm->iParen
c130: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
c140: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
c150: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
c160: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
c170: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72   = 1;.      pTer
c180: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
c190: 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20  RM_COPIED;.     
c1a0: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
c1b0: 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72  qAll = pTerm->pr
c1c0: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ereqAll;.    }. 
c1d0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
c1e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
c1f0: 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 20 20  _OR_STAT4 */..  
c200: 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c  /* Prevent ON cl
c210: 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 61 20  ause terms of a 
c220: 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62  LEFT JOIN from b
c230: 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64 72 69  eing used to dri
c240: 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78  ve.  ** an index
c250: 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 74   for tables to t
c260: 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a  he left of the j
c270: 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72  oin..  */.  pTer
c280: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 7c  m->prereqRight |
c290: 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a  = extraRight;.}.
c2a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
c2b0: 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 70 4c  tion searches pL
c2c0: 69 73 74 20 66 6f 72 20 61 20 65 6e 74 72 79 20  ist for a entry 
c2d0: 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65  that matches the
c2e0: 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a   iCol-th column.
c2f0: 2a 2a 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78  ** of index pIdx
c300: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20  ..**.** If such 
c310: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
c320: 20 66 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65   found, its inde
c330: 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20  x in pList->a[] 
c340: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a  is returned. If.
c350: 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e  ** no expression
c360: 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73   is found, -1 is
c370: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
c380: 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64  atic int findInd
c390: 65 78 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a  exCol(.  Parse *
c3a0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
c3b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
c3c0: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  e context */.  E
c3d0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c3f0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * Expression lis
c400: 74 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  t to search */. 
c410: 20 69 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20   int iBase,     
c420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c430: 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74   /* Cursor for t
c440: 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
c450: 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49  with pIdx */.  I
c460: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
c470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c480: 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68  * Index to match
c490: 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20   column of */.  
c4a0: 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20  int iCol        
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4c0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  /* Column of ind
c4d0: 65 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29  ex to match */.)
c4e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  {.  int i;.  con
c4f0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
c500: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43   pIdx->azColl[iC
c510: 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ol];..  for(i=0;
c520: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
c530: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
c540: 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  *p = sqlite3Expr
c550: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73  SkipCollate(pLis
c560: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
c570: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
c580: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26  K_COLUMN.     &&
c590: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64   p->iColumn==pId
c5a0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c  x->aiColumn[iCol
c5b0: 5d 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 54 61  ].     && p->iTa
c5c0: 62 6c 65 3d 3d 69 42 61 73 65 0a 20 20 20 20 29  ble==iBase.    )
c5d0: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
c5e0: 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
c5f0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
c600: 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  se, pList->a[i].
c610: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
c620: 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20  ( ALWAYS(pColl) 
c630: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
c640: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
c650: 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
c660: 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20       return i;. 
c670: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
c680: 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ..  return -1;.}
c690: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
c6a0: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
c6b0: 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c  NCT expression-l
c6c0: 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ist passed as th
c6d0: 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
c6e0: 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74  .** is redundant
c6f0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e  ..**.** A DISTIN
c700: 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e  CT list is redun
c710: 64 61 6e 74 20 69 66 20 74 68 65 20 64 61 74 61  dant if the data
c720: 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 73 6f  base contains so
c730: 6d 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20  me subset of.** 
c740: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65  columns that are
c750: 20 75 6e 69 71 75 65 20 61 6e 64 20 6e 6f 6e 2d   unique and non-
c760: 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  null..*/.static 
c770: 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52 65  int isDistinctRe
c780: 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73 65  dundant(.  Parse
c790: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
c7a0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
c7b0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
c7c0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
c7d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52         /* The FR
c7e0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
c7f0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
c800: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c810: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
c820: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73    ExprList *pDis
c830: 74 69 6e 63 74 20 20 20 20 20 20 20 2f 2a 20 54  tinct       /* T
c840: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74 68  he result set th
c850: 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 44  at needs to be D
c860: 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20  ISTINCT */.){.  
c870: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
c880: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
c890: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
c8b0: 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f   int iBase;..  /
c8c0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f  * If there is mo
c8d0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c  re than one tabl
c8e0: 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 20  e or sub-select 
c8f0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
c900: 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  se of.  ** this 
c910: 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20 77  query, then it w
c920: 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  ill not be possi
c930: 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74  ble to show that
c940: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a 20   the DISTINCT . 
c950: 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72 65   ** clause is re
c960: 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  dundant. */.  if
c970: 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
c980: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
c990: 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c 69    iBase = pTabLi
c9a0: 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
c9b0: 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c  ;.  pTab = pTabL
c9c0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  ist->a[0].pTab;.
c9d0: 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  /* If any of 
c9e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
c9f0: 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e  is an IPK column
ca00: 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65 2c   on table iBase,
ca10: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20 20   then return .  
ca20: 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54  ** true. Note: T
ca30: 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69  he (p->iTable==i
ca40: 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74 68  Base) part of th
ca50: 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20 66  is test may be f
ca60: 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a  alse if the.  **
ca70: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
ca80: 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
ca90: 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  sub-query..  */.
caa0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69    for(i=0; i<pDi
cab0: 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69  stinct->nExpr; i
cac0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
cad0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
cae0: 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74 69  ipCollate(pDisti
caf0: 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  nct->a[i].pExpr)
cb00: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ;.    if( p->op=
cb10: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d  =TK_COLUMN && p-
cb20: 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20 26  >iTable==iBase &
cb30: 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  & p->iColumn<0 )
cb40: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
cb50: 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
cb60: 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e  h all indices on
cb70: 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65 63   the table, chec
cb80: 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65 65  king each to see
cb90: 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a   if it makes.  *
cba0: 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71  * the DISTINCT q
cbb0: 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64 61  ualifier redunda
cbc0: 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20 69  nt. It does so i
cbd0: 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  f:.  **.  **   1
cbe0: 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 69  . The index is i
cbf0: 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e  tself UNIQUE, an
cc00: 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e  d.  **.  **   2.
cc10: 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75   All of the colu
cc20: 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
cc30: 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72 74   are either part
cc40: 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e 63   of the pDistinc
cc50: 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73 74  t.  **      list
cc60: 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57 48  , or else the WH
cc70: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
cc80: 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68  ins a term of th
cc90: 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a  e form "col=X",.
cca0: 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65 20    **      where 
ccb0: 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  X is a constant 
ccc0: 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61  value. The colla
ccd0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 6f  tion sequences o
cce0: 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20  f the.  **      
ccf0: 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20 73  comparison and s
cd00: 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72 65  elect-list expre
cd10: 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63  ssions must matc
cd20: 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20 69  h those of the i
cd30: 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
cd40: 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73    3. All of thos
cd50: 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  e index columns 
cd60: 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57 48  for which the WH
cd70: 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20  ERE clause does 
cd80: 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f  not.  **      co
cd90: 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20  ntain a "col=X" 
cda0: 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63 74  term are subject
cdb0: 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63   to a NOT NULL c
cdc0: 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a  onstraint..  */.
cdd0: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
cde0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
cdf0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
ce00: 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  {.    if( pIdx->
ce10: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
ce20: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
ce30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
ce40: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nKeyCol; i++){
ce50: 0a 20 20 20 20 20 20 69 31 36 20 69 43 6f 6c 20  .      i16 iCol 
ce60: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
ce70: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  [i];.      if( 0
ce80: 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  ==findTerm(pWC, 
ce90: 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42  iBase, iCol, ~(B
cea0: 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c  itmask)0, WO_EQ,
ceb0: 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20   pIdx) ){.      
cec0: 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 20 3d 20    int iIdxCol = 
ced0: 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61  findIndexCol(pPa
cee0: 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20  rse, pDistinct, 
cef0: 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3b  iBase, pIdx, i);
cf00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 49 64  .        if( iId
cf10: 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61 62 2d 3e  xCol<0 || pTab->
cf20: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
cf30: 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ll==0 ){.       
cf40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
cf50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
cf60: 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64  }.    if( i==pId
cf70: 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20  x->nKeyCol ){.  
cf80: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65      /* This inde
cf90: 78 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  x implies that t
cfa0: 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
cfb0: 69 66 69 65 72 20 69 73 20 72 65 64 75 6e 64 61  ifier is redunda
cfc0: 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  nt. */.      ret
cfd0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
cfe0: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
cff0: 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  ../*.** Estimate
d000: 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f   the logarithm o
d010: 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75  f the input valu
d020: 65 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a  e to base 2..*/.
d030: 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65 73  static LogEst es
d040: 74 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b 0a  tLog(LogEst N){.
d050: 20 20 4c 6f 67 45 73 74 20 78 20 3d 20 73 71 6c    LogEst x = sql
d060: 69 74 65 33 4c 6f 67 45 73 74 28 4e 29 3b 0a 20  ite3LogEst(N);. 
d070: 20 72 65 74 75 72 6e 20 78 3e 33 33 20 3f 20 78   return x>33 ? x
d080: 20 2d 20 33 33 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a   - 33 : 0;.}../*
d090: 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73  .** Two routines
d0a0: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68   for printing th
d0b0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  e content of an 
d0c0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
d0d0: 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  fo.** structure.
d0e0: 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69    Used for testi
d0f0: 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
d100: 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68   only.  If neith
d110: 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53  er.** SQLITE_TES
d120: 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55  T or SQLITE_DEBU
d130: 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74  G are defined, t
d140: 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e  hen these routin
d150: 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73  es.** are no-ops
d160: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
d170: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
d180: 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64  RTUALTABLE) && d
d190: 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43  efined(WHERETRAC
d1a0: 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61 74 69  E_ENABLED).stati
d1b0: 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58  c void TRACE_IDX
d1c0: 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f  _INPUTS(sqlite3_
d1d0: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
d1e0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
d1f0: 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
d200: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  e ) return;.  fo
d210: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
d220: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
d230: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
d240: 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61  rintf("  constra
d250: 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20  int[%d]: col=%d 
d260: 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20  termid=%d op=%d 
d270: 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20  usabled=%d\n",. 
d280: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
d290: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
d2a0: 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ].iColumn,.     
d2b0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
d2c0: 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c  [i].iTermOffset,
d2d0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
d2e0: 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20  traint[i].op,.  
d2f0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
d300: 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a  int[i].usable);.
d310: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
d320: 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b  <p->nOrderBy; i+
d330: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
d340: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72  ebugPrintf("  or
d350: 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25  derby[%d]: col=%
d360: 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20  d desc=%d\n",.  
d370: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
d380: 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43  ->aOrderBy[i].iC
d390: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d  olumn,.       p-
d3a0: 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73  >aOrderBy[i].des
d3b0: 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  c);.  }.}.static
d3c0: 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f   void TRACE_IDX_
d3d0: 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f  OUTPUTS(sqlite3_
d3e0: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
d3f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
d400: 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
d410: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  e ) return;.  fo
d420: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
d430: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
d440: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
d450: 72 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25  rintf("  usage[%
d460: 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f  d]: argvIdx=%d o
d470: 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  mit=%d\n",.     
d480: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
d490: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
d4a0: 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20  i].argvIndex,.  
d4b0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
d4c0: 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74  intUsage[i].omit
d4d0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
d4e0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69  DebugPrintf("  i
d4f0: 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e  dxNum=%d\n", p->
d500: 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74  idxNum);.  sqlit
d510: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
d520: 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70   idxStr=%s\n", p
d530: 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c  ->idxStr);.  sql
d540: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
d550: 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  "  orderByConsum
d560: 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64  ed=%d\n", p->ord
d570: 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20  erByConsumed);. 
d580: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d590: 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64  ntf("  estimated
d5a0: 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65  Cost=%g\n", p->e
d5b0: 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20  stimatedCost);. 
d5c0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d5d0: 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64  ntf("  estimated
d5e0: 52 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d  Rows=%lld\n", p-
d5f0: 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b  >estimatedRows);
d600: 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
d610: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
d620: 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41  S(A).#define TRA
d630: 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41  CE_IDX_OUTPUTS(A
d640: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ).#endif..#ifnde
d650: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
d660: 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
d670: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
d680: 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
d690: 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69  use term pTerm i
d6a0: 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72  s of a form wher
d6b0: 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65  e it.** could be
d6c0: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
d6d0: 64 65 78 20 74 6f 20 61 63 63 65 73 73 20 70 53  dex to access pS
d6e0: 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20  rc, assuming an 
d6f0: 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69  appropriate.** i
d700: 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f  ndex existed..*/
d710: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d  .static int term
d720: 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20  CanDriveIndex(. 
d730: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
d740: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
d750: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
d760: 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f  term to check */
d770: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
d780: 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20  t_item *pSrc,   
d790: 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72    /* Table we ar
d7a0: 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65  e trying to acce
d7b0: 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ss */.  Bitmask 
d7c0: 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20 20 20  notReady        
d7d0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
d7e0: 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20   in outer loops 
d7f0: 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29  of the join */.)
d800: 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20  {.  char aff;.  
d810: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
d820: 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75  ursor!=pSrc->iCu
d830: 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rsor ) return 0;
d840: 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  .  if( (pTerm->e
d850: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
d860: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
d870: 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70  .  if( (pTerm->p
d880: 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74  rereqRight & not
d890: 52 65 61 64 79 29 21 3d 30 20 29 20 72 65 74 75  Ready)!=0 ) retu
d8a0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54 65 72  rn 0;.  if( pTer
d8b0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3c  m->u.leftColumn<
d8c0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
d8d0: 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  aff = pSrc->pTab
d8e0: 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e  ->aCol[pTerm->u.
d8f0: 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  leftColumn].affi
d900: 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71 6c  nity;.  if( !sql
d910: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
d920: 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  yOk(pTerm->pExpr
d930: 2c 20 61 66 66 29 20 29 20 72 65 74 75 72 6e 20  , aff) ) return 
d940: 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  0;.  return 1;.}
d950: 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65  .#endif...#ifnde
d960: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
d970: 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
d980: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
d990: 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74  e to construct t
d9a0: 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
d9b0: 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  for an automatic
d9c0: 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f   index.** and to
d9d0: 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65 72   set up the Wher
d9e0: 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c  eLevel object pL
d9f0: 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68 65  evel so that the
da00: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
da10: 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66 20  ** makes use of 
da20: 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
da30: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
da40: 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75 74  oid constructAut
da50: 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50  omaticIndex(.  P
da60: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
da70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
da80: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
da90: 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
daa0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
dab0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
dac0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
dad0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
dae0: 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
daf0: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
db00: 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74 20  to get the next 
db10: 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61  index */.  Bitma
db20: 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
db30: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
db40: 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61  f cursors that a
db50: 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
db60: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
db70: 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20 20   *pLevel        
db80: 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 69    /* Write new i
db90: 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ndex here */.){.
dba0: 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20    int nKeyCol;  
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dbc0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
dbd0: 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72  ns in the constr
dbe0: 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20  ucted index */. 
dbf0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
dc00: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
dc10: 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
dc20: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
dc30: 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
dc40: 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20   *pWCEnd;       
dc50: 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43     /* End of pWC
dc60: 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65 78  ->a[] */.  Index
dc70: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
dc80: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
dc90: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
dca0: 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
dcb0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcd0: 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74 61   /* Prepared sta
dce0: 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
dcf0: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
dd00: 6e 74 20 61 64 64 72 49 6e 69 74 3b 20 20 20 20  nt addrInit;    
dd10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
dd20: 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e 69  dress of the ini
dd30: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61  tialization bypa
dd40: 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62  ss jump */.  Tab
dd50: 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20  le *pTable;     
dd60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
dd70: 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65  table being inde
dd80: 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  xed */.  int add
dd90: 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
dda0: 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
ddb0: 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f  he index fill lo
ddc0: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  op */.  int regR
ddd0: 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20  ecord;          
dde0: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
ddf0: 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78  holding an index
de00: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
de10: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
de20: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
de30: 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  mn counter */.  
de40: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
de50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
de60: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
de70: 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20   int mxBitCol;  
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de90: 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69  Maximum column i
dea0: 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  n pSrc->colUsed 
deb0: 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  */.  CollSeq *pC
dec0: 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
ded0: 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
dee0: 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63  quence to on a c
def0: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65  olumn */.  Where
df00: 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
df10: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f         /* The Lo
df20: 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  op object */.  c
df30: 68 61 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20 20  har *zNotUsed;  
df40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
df50: 74 72 61 20 73 70 61 63 65 20 6f 6e 20 74 68 65  tra space on the
df60: 20 65 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f 0a   end of pIdx */.
df70: 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c    Bitmask idxCol
df80: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
df90: 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d   Bitmap of colum
dfa0: 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65  ns used for inde
dfb0: 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73  xing */.  Bitmas
dfc0: 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20  k extraCols;    
dfd0: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20        /* Bitmap 
dfe0: 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
dff0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65  lumns */.  u8 se
e000: 6e 74 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20  ntWarning = 0;  
e010: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
e020: 66 20 61 20 77 61 72 6e 6e 69 6e 67 20 68 61 73  f a warnning has
e030: 20 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a   been issued */.
e040: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
e050: 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72  ode to skip over
e060: 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e   the creation an
e070: 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  d initialization
e080: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61   of the.  ** tra
e090: 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20  nsient index on 
e0a0: 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  2nd and subseque
e0b0: 6e 74 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66  nt iterations of
e0c0: 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20   the loop. */.  
e0d0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
e0e0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
e0f0: 30 20 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20  0 );.  addrInit 
e100: 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
e110: 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a  e(pParse);..  /*
e120: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
e130: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61  r of columns tha
e140: 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20  t will be added 
e150: 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  to the index.  *
e160: 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61  * and used to ma
e170: 74 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65  tch WHERE clause
e180: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
e190: 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20    nKeyCol = 0;. 
e1a0: 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e   pTable = pSrc->
e1b0: 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d  pTab;.  pWCEnd =
e1c0: 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54   &pWC->a[pWC->nT
e1d0: 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20  erm];.  pLoop = 
e1e0: 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
e1f0: 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20    idxCols = 0;. 
e200: 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
e210: 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
e220: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
e230: 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
e240: 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
e250: 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20  , notReady) ){. 
e260: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
e270: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
e280: 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  umn;.      Bitma
e290: 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e  sk cMask = iCol>
e2a0: 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42  =BMS ? MASKBIT(B
e2b0: 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28  MS-1) : MASKBIT(
e2c0: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73  iCol);.      tes
e2d0: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
e2e0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
e2f0: 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20  se( iCol==BMS-1 
e300: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 65  );.      if( !se
e310: 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20  ntWarning ){.   
e320: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
e330: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f  (SQLITE_WARNING_
e340: 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20  AUTOINDEX,.     
e350: 20 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69         "automati
e360: 63 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73  c index on %s(%s
e370: 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  )", pTable->zNam
e380: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e,.            p
e390: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  Table->aCol[iCol
e3a0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
e3b0: 20 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20    sentWarning = 
e3c0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
e3d0: 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20   if( (idxCols & 
e3e0: 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  cMask)==0 ){.   
e3f0: 20 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f       if( whereLo
e400: 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d  opResize(pParse-
e410: 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79  >db, pLoop, nKey
e420: 43 6f 6c 2b 31 29 20 29 20 72 65 74 75 72 6e 3b  Col+1) ) return;
e430: 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
e440: 61 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b  aLTerm[nKeyCol++
e450: 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
e460: 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d     idxCols |= cM
e470: 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
e480: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
e490: 20 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b 0a 20 20   nKeyCol>0 );.  
e4a0: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
e4b0: 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  Eq = pLoop->nLTe
e4c0: 72 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20  rm = nKeyCol;.  
e4d0: 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
e4e0: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
e4f0: 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   | WHERE_IDX_ONL
e500: 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45  Y | WHERE_INDEXE
e510: 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D.              
e520: 20 20 20 20 20 20 20 7c 20 57 48 45 52 45 5f 41         | WHERE_A
e530: 55 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a  UTO_INDEX;..  /*
e540: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
e550: 72 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20  r of additional 
e560: 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74  columns needed t
e570: 6f 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20  o create a.  ** 
e580: 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20  covering index. 
e590: 20 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64   A "covering ind
e5a0: 65 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ex" is an index 
e5b0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c  that contains al
e5c0: 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74  l.  ** columns t
e5d0: 68 61 74 20 61 72 65 20 6e 65 65 64 65 64 20 62  hat are needed b
e5e0: 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 57 69  y the query.  Wi
e5f0: 74 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  th a covering in
e600: 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72  dex, the.  ** or
e610: 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76  iginal table nev
e620: 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61  er needs to be a
e630: 63 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61  ccessed.  Automa
e640: 74 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74  tic indices must
e650: 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72  .  ** be a cover
e660: 69 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75 73  ing index becaus
e670: 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c  e the index will
e680: 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 20   not be updated 
e690: 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  if the.  ** orig
e6a0: 69 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67  inal table chang
e6b0: 65 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  es and the index
e6c0: 20 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f   and table canno
e6d0: 74 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20  t both be used. 
e6e0: 20 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f   ** if they go o
e6f0: 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f  ut of sync..  */
e700: 0a 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70  .  extraCols = p
e710: 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28  Src->colUsed & (
e720: 7e 69 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42  ~idxCols | MASKB
e730: 49 54 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78  IT(BMS-1));.  mx
e740: 42 69 74 43 6f 6c 20 3d 20 28 70 54 61 62 6c 65  BitCol = (pTable
e750: 2d 3e 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29  ->nCol >= BMS-1)
e760: 20 3f 20 42 4d 53 2d 31 20 3a 20 70 54 61 62 6c   ? BMS-1 : pTabl
e770: 65 2d 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73 74 63  e->nCol;.  testc
e780: 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ase( pTable->nCo
e790: 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65  l==BMS-1 );.  te
e7a0: 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e  stcase( pTable->
e7b0: 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20  nCol==BMS-2 );. 
e7c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69   for(i=0; i<mxBi
e7d0: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
e7e0: 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20  if( extraCols & 
e7f0: 4d 41 53 4b 42 49 54 28 69 29 20 29 20 6e 4b 65  MASKBIT(i) ) nKe
e800: 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  yCol++;.  }.  if
e810: 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  ( pSrc->colUsed 
e820: 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  & MASKBIT(BMS-1)
e830: 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c 20   ){.    nKeyCol 
e840: 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  += pTable->nCol 
e850: 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 20  - BMS + 1;.  }. 
e860: 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
e870: 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
e880: 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f  EQ | WHERE_IDX_O
e890: 4e 4c 59 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74  NLY;..  /* Const
e8a0: 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f  ruct the Index o
e8b0: 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69 62  bject to describ
e8c0: 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a  e this index */.
e8d0: 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33    pIdx = sqlite3
e8e0: 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a  AllocateIndexObj
e8f0: 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ect(pParse->db, 
e900: 6e 4b 65 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a  nKeyCol+1, 0, &z
e910: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
e920: 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e  pIdx==0 ) return
e930: 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ;.  pLoop->u.btr
e940: 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  ee.pIndex = pIdx
e950: 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  ;.  pIdx->zName 
e960: 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a  = "auto-index";.
e970: 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d    pIdx->pTable =
e980: 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30   pTable;.  n = 0
e990: 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b  ;.  idxCols = 0;
e9a0: 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
e9b0: 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
e9c0: 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
e9d0: 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
e9e0: 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
e9f0: 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b  rc, notReady) ){
ea00: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
ea10: 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
ea20: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74  olumn;.      Bit
ea30: 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f  mask cMask = iCo
ea40: 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54  l>=BMS ? MASKBIT
ea50: 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49  (BMS-1) : MASKBI
ea60: 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74  T(iCol);.      t
ea70: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
ea80: 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  MS-1 );.      te
ea90: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
eaa0: 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  S );.      if( (
eab0: 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29  idxCols & cMask)
eac0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ==0 ){.        E
ead0: 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
eae0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
eaf0: 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b  idxCols |= cMask
eb00: 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
eb10: 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54  aiColumn[n] = pT
eb20: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
eb30: 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  n;.        pColl
eb40: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
eb50: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
eb60: 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74  Parse, pX->pLeft
eb70: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
eb80: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
eb90: 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59 53 28  oll[n] = ALWAYS(
eba0: 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e  pColl) ? pColl->
ebb0: 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52 59 22  zName : "BINARY"
ebc0: 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  ;.        n++;. 
ebd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ebe0: 0a 20 20 61 73 73 65 72 74 28 20 28 75 33 32 29  .  assert( (u32)
ebf0: 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  n==pLoop->u.btre
ec00: 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41  e.nEq );..  /* A
ec10: 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  dd additional co
ec20: 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
ec30: 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74  make the automat
ec40: 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20  ic index into.  
ec50: 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  ** a covering in
ec60: 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  dex */.  for(i=0
ec70: 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b  ; i<mxBitCol; i+
ec80: 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72  +){.    if( extr
ec90: 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28  aCols & MASKBIT(
eca0: 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  i) ){.      pIdx
ecb0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
ecc0: 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  i;.      pIdx->a
ecd0: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41  zColl[n] = "BINA
ece0: 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a  RY";.      n++;.
ecf0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
ed00: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
ed10: 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29  MASKBIT(BMS-1) )
ed20: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d  {.    for(i=BMS-
ed30: 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f  1; i<pTable->nCo
ed40: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
ed50: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
ed60: 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78   = i;.      pIdx
ed70: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42  ->azColl[n] = "B
ed80: 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b  INARY";.      n+
ed90: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  +;.    }.  }.  a
eda0: 73 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f  ssert( n==nKeyCo
edb0: 6c 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43  l );.  pIdx->aiC
edc0: 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 2d 31 3b 0a 20  olumn[n] = -1;. 
edd0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
ede0: 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 0a 20 20   = "BINARY";..  
edf0: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75  /* Create the au
ee00: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f  tomatic index */
ee10: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65  .  assert( pLeve
ee20: 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b  l->iIdxCur>=0 );
ee30: 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  .  pLevel->iIdxC
ee40: 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
ee50: 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  b++;.  sqlite3Vd
ee60: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
ee70: 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c  penAutoindex, pL
ee80: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e  evel->iIdxCur, n
ee90: 4b 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c  KeyCol+1);.  sql
eea0: 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
eeb0: 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
eec0: 78 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  x);.  VdbeCommen
eed0: 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20  t((v, "for %s", 
eee0: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b  pTable->zName));
eef0: 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20  ..  /* Fill the 
ef00: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
ef10: 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  with content */.
ef20: 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
ef30: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
ef40: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76   OP_Rewind, pLev
ef50: 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20  el->iTabCur);.  
ef60: 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
ef70: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
ef80: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
ef90: 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
efa0: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70  (pParse, pIdx, p
efb0: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20  Level->iTabCur, 
efc0: 72 65 67 52 65 63 6f 72 64 2c 20 30 2c 20 30 29  regRecord, 0, 0)
efd0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
efe0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
eff0: 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69  nsert, pLevel->i
f000: 49 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72  IdxCur, regRecor
f010: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
f020: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
f030: 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
f040: 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  T);.  sqlite3Vdb
f050: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
f060: 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  xt, pLevel->iTab
f070: 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b  Cur, addrTop+1);
f080: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
f090: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
f0a0: 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f  _STMTSTATUS_AUTO
f0b0: 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65  INDEX);.  sqlite
f0c0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
f0d0: 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c   addrTop);.  sql
f0e0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
f0f0: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
f100: 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a  cord);.  .  /* J
f110: 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b  ump here when sk
f120: 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
f130: 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  alization */.  s
f140: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
f150: 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b  re(v, addrInit);
f160: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
f170: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
f180: 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66  IC_INDEX */..#if
f190: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f1a0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
f1b0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
f1c0: 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c   populate an sql
f1d0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
f1e0: 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73  structure. It is
f1f0: 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
f200: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
f210: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
f220: 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20  lly release the 
f230: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20  structure.** by 
f240: 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e  passing the poin
f250: 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
f260: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
f270: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
f280: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
f290: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61  e3_index_info *a
f2a0: 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
f2b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
f2c0: 65 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  e,.  WhereClause
f2d0: 20 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20   *pWC,.  struct 
f2e0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
f2f0: 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc,.  ExprList *
f300: 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e  pOrderBy.){.  in
f310: 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54  t i, j;.  int nT
f320: 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71  erm;.  struct sq
f330: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
f340: 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
f350: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
f360: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
f370: 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
f380: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
f390: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
f3a0: 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
f3b0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
f3c0: 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  rm;.  int nOrder
f3d0: 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  By;.  sqlite3_in
f3e0: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
f3f0: 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  fo;..  /* Count 
f400: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
f410: 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61  ssible WHERE cla
f420: 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
f430: 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74  referring.  ** t
f440: 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  o this virtual t
f450: 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
f460: 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70  nTerm=0, pTerm=p
f470: 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
f480: 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
f490: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
f4a0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
f4b0: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
f4c0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
f4d0: 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
f4e0: 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  Two(pTerm->eOper
f4f0: 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56  ator & ~WO_EQUIV
f500: 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
f510: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
f520: 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
f530: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
f540: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
f550: 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
f560: 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
f570: 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55  rator & (WO_ISNU
f580: 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  LL) ) continue;.
f590: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
f5a0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
f5b0: 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
f5c0: 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d      nTerm++;.  }
f5d0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52  ..  /* If the OR
f5e0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f  DER BY clause co
f5f0: 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75  ntains only colu
f600: 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65  mns in the curre
f610: 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c  nt .  ** virtual
f620: 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f   table then allo
f630: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
f640: 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74  he aOrderBy part
f650: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c   of.  ** the sql
f660: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
f670: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a  structure..  */.
f680: 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    nOrderBy = 0;.
f690: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
f6a0: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f  {.    int n = pO
f6b0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
f6c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
f6d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
f6e0: 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
f6f0: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
f700: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
f710: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
f720: 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
f730: 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
f740: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
f750: 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20     if( i==n){.  
f760: 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e      nOrderBy = n
f770: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
f780: 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  * Allocate the s
f790: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
f7a0: 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f  o structure.  */
f7b0: 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71  .  pIdxInfo = sq
f7c0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
f7d0: 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  o(pParse->db, si
f7e0: 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a  zeof(*pIdxInfo).
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f800: 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69             + (si
f810: 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20  zeof(*pIdxCons) 
f820: 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65  + sizeof(*pUsage
f830: 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  ))*nTerm.       
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49      + sizeof(*pI
f860: 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65  dxOrderBy)*nOrde
f870: 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64  rBy );.  if( pId
f880: 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
f890: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f8a0: 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20  pParse, "out of 
f8b0: 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65  memory");.    re
f8c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
f8d0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
f8e0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
f8f0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
f900: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f  nfo structure co
f910: 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79  ntains.  ** many
f920: 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65   fields that are
f930: 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74   declared "const
f940: 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65  " to prevent xBe
f950: 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a  stIndex from.  *
f960: 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e  * changing them.
f970: 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
f980: 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69  some funky casti
f990: 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20  ng in order to. 
f9a0: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   ** initialize t
f9b0: 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a  hose fields..  *
f9c0: 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28  /.  pIdxCons = (
f9d0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
f9e0: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
f9f0: 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20  )&pIdxInfo[1];. 
fa00: 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28   pIdxOrderBy = (
fa10: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
fa20: 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70  ndex_orderby*)&p
fa30: 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a  IdxCons[nTerm];.
fa40: 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75    pUsage = (stru
fa50: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
fa60: 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
fa70: 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b  e*)&pIdxOrderBy[
fa80: 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69  nOrderBy];.  *(i
fa90: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
faa0: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65  Constraint = nTe
fab0: 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49  rm;.  *(int*)&pI
fac0: 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
fad0: 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a   = nOrderBy;.  *
fae0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
faf0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
fb00: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
fb10: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
fb20: 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74  Cons;.  *(struct
fb30: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
fb40: 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e  rderby**)&pIdxIn
fb50: 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70  fo->aOrderBy = p
fb60: 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28  IdxOrderBy;.  *(
fb70: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
fb80: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
fb90: 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66  usage**)&pIdxInf
fba0: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
fbb0: 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20  age =.          
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbf0: 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b           pUsage;
fc00: 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70  ..  for(i=j=0, p
fc10: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
fc20: 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
fc30: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38  pTerm++){.    u8
fc40: 20 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54 65   op;.    if( pTe
fc50: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21  rm->leftCursor !
fc60: 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  = pSrc->iCursor 
fc70: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
fc80: 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f  assert( IsPowerO
fc90: 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65  fTwo(pTerm->eOpe
fca0: 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49  rator & ~WO_EQUI
fcb0: 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  V) );.    testca
fcc0: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
fcd0: 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a  ator & WO_IN );.
fce0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
fcf0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
fd00: 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
fd10: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
fd20: 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e  erator & (WO_ISN
fd30: 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ULL) ) continue;
fd40: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
fd50: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
fd60: 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NULL ) continue;
fd70: 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
fd80: 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d  .iColumn = pTerm
fd90: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
fda0: 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
fdb0: 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b  iTermOffset = i;
fdc0: 0a 20 20 20 20 6f 70 20 3d 20 28 75 38 29 70 54  .    op = (u8)pT
fdd0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
fde0: 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28   WO_ALL;.    if(
fdf0: 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20   op==WO_IN ) op 
fe00: 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20 70 49 64  = WO_EQ;.    pId
fe10: 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70  xCons[j].op = op
fe20: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72  ;.    /* The dir
fe30: 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69  ect assignment i
fe40: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  n the previous l
fe50: 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ine is possible 
fe60: 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20  only because.   
fe70: 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20   ** the WO_ and 
fe80: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
fe90: 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61  STRAINT_ codes a
fea0: 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54  re identical.  T
feb0: 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  he.    ** follow
fec0: 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69  ing asserts veri
fed0: 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  fy this fact. */
fee0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
fef0: 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  EQ==SQLITE_INDEX
ff00: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29  _CONSTRAINT_EQ )
ff10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
ff20: 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LT==SQLITE_INDE
ff30: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20  X_CONSTRAINT_LT 
ff40: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
ff50: 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LE==SQLITE_IND
ff60: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45  EX_CONSTRAINT_LE
ff70: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ff80: 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GT==SQLITE_IN
ff90: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
ffa0: 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
ffb0: 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49   WO_GE==SQLITE_I
ffc0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
ffd0: 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GE );.    assert
ffe0: 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49  ( WO_MATCH==SQLI
fff0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
10000 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20  INT_MATCH );.   
10010 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
10020 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
10030 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57  IN|WO_EQ|WO_LT|W
10040 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
10050 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20  |WO_MATCH) );.  
10060 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72    j++;.  }.  for
10070 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
10080 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
10090 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72   *pExpr = pOrder
100a0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
100b0 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
100c0 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  i].iColumn = pEx
100d0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
100e0 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e   pIdxOrderBy[i].
100f0 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d  desc = pOrderBy-
10100 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
10110 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
10120 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  IdxInfo;.}../*.*
10130 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65  * The table obje
10140 63 74 20 72 65 66 65 72 65 6e 63 65 20 70 61 73  ct reference pas
10150 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
10160 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
10170 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  is function.** m
10180 75 73 74 20 72 65 70 72 65 73 65 6e 74 20 61 20  ust represent a 
10190 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54  virtual table. T
101a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76  his function inv
101b0 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74 49 6e  okes the xBestIn
101c0 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20  dex().** method 
101d0 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
101e0 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 71  able with the sq
101f0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
10200 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
10210 63 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20  comes in as the 
10220 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  3rd argument to 
10230 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
10240 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
10250 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20   occurs, pParse 
10260 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
10270 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  h an error messa
10280 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d  ge and a.** non-
10290 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65  zero value is re
102a0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
102b0 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
102c0 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
102d0 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  ** part of the s
102e0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
102f0 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c  o structure is l
10300 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a  eft populated..*
10310 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
10320 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20  not an error is 
10330 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20  returned, it is 
10340 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
10350 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c  ty of the.** cal
10360 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
10370 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72  y free p->idxStr
10380 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65   if p->needToFre
10390 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65  eIdxStr indicate
103a0 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69  s.** that this i
103b0 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  s required..*/.s
103c0 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65  tatic int vtabBe
103d0 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  stIndex(Parse *p
103e0 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
103f0 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
10400 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71  x_info *p){.  sq
10410 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
10420 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  b = sqlite3GetVT
10430 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
10440 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20   pTab)->pVtab;. 
10450 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
10460 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49  ;..  TRACE_IDX_I
10470 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d  NPUTS(p);.  rc =
10480 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d   pVtab->pModule-
10490 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74 61  >xBestIndex(pVta
104a0 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49  b, p);.  TRACE_I
104b0 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a  DX_OUTPUTS(p);..
104c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
104d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
104e0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
104f0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
10500 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
10510 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 1;.    }else
10520 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72   if( !pVtab->zEr
10530 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71  rMsg ){.      sq
10540 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
10550 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69  arse, "%s", sqli
10560 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a  te3ErrStr(rc));.
10570 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10580 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10590 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70  (pParse, "%s", p
105a0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
105b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
105c0 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
105d0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61  zErrMsg);.  pVta
105e0 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
105f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
10600 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
10610 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  +){.    if( !p->
10620 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75  aConstraint[i].u
10630 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e  sable && p->aCon
10640 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
10650 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20  argvIndex>0 ){. 
10660 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10670 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
10680 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25          "table %
10690 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72 65  s: xBestIndex re
106a0 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69  turned an invali
106b0 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a  d plan", pTab->z
106c0 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
106d0 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ..  return pPars
106e0 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64 69  e->nErr;.}.#endi
106f0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
10700 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
10710 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 0a 23 69 66  LTABLE) */...#if
10720 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
10730 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
10740 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
10750 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
10760 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79  a particular key
10770 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20   among all keys 
10780 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20  in an.** index. 
10790 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
107a0 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66  ts in aStat as f
107b0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
107c0 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45   aStat[0]      E
107d0 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  st. number of ro
107e0 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61  ws less than pVa
107f0 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d  l.**    aStat[1]
10800 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65        Est. numbe
10810 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20  r of rows equal 
10820 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65  to pVal.**.** Re
10830 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
10840 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74  n success..*/.st
10850 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4b  atic void whereK
10860 65 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65  eyStats(.  Parse
10870 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
10880 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
10890 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
108a0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
108b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
108c0 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69  * Index to consi
108d0 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f  der domain of */
108e0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
108f0 64 20 2a 70 52 65 63 2c 20 20 20 20 20 20 20 2f  d *pRec,       /
10900 2a 20 56 65 63 74 6f 72 20 6f 66 20 76 61 6c 75  * Vector of valu
10910 65 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a  es to consider *
10920 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c  /.  int roundUp,
10930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10940 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74  /* Round up if t
10950 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e  rue.  Round down
10960 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74   if false */.  t
10970 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20  Rowcnt *aStat   
10980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
10990 54 3a 20 73 74 61 74 73 20 77 72 69 74 74 65 6e  T: stats written
109a0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
109b0 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70  dexSample *aSamp
109c0 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70  le = pIdx->aSamp
109d0 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20  le;.  int iCol; 
109e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109f0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 65    /* Index of re
10a00 71 75 69 72 65 64 20 73 74 61 74 73 20 69 6e 20  quired stats in 
10a10 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20  anEq[] etc. */. 
10a20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20   int iMin = 0;  
10a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10a40 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20  Smallest sample 
10a50 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64 20 2a  not yet tested *
10a60 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 49 64 78  /.  int i = pIdx
10a70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 20 20 20 20 20  ->nSample;      
10a80 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70  /* Smallest samp
10a90 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6f  le larger than o
10aa0 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20  r equal to pRec 
10ab0 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20  */.  int iTest; 
10ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ad0 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20   /* Next sample 
10ae0 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74  to test */.  int
10af0 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20   res;           
10b00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
10b10 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  lt of comparison
10b20 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23   operation */..#
10b30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
10b40 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  BUG.  UNUSED_PAR
10b50 41 4d 45 54 45 52 28 20 70 50 61 72 73 65 20 29  AMETER( pParse )
10b60 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
10b70 74 28 20 70 52 65 63 21 3d 30 20 29 3b 0a 20 20  t( pRec!=0 );.  
10b80 69 43 6f 6c 20 3d 20 70 52 65 63 2d 3e 6e 46 69  iCol = pRec->nFi
10b90 65 6c 64 20 2d 20 31 3b 0a 20 20 61 73 73 65 72  eld - 1;.  asser
10ba0 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  t( pIdx->nSample
10bb0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
10bc0 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20 26  pRec->nField>0 &
10bd0 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 53 61  & iCol<pIdx->nSa
10be0 6d 70 6c 65 43 6f 6c 20 29 3b 0a 20 20 64 6f 7b  mpleCol );.  do{
10bf0 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28 69 4d  .    iTest = (iM
10c00 69 6e 2b 69 29 2f 32 3b 0a 20 20 20 20 72 65 73  in+i)/2;.    res
10c10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
10c20 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
10c30 70 6c 65 5b 69 54 65 73 74 5d 2e 6e 2c 20 61 53  ple[iTest].n, aS
10c40 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 70 2c 20  ample[iTest].p, 
10c50 70 52 65 63 29 3b 0a 20 20 20 20 69 66 28 20 72  pRec);.    if( r
10c60 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 4d  es<0 ){.      iM
10c70 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20  in = iTest+1;.  
10c80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
10c90 20 3d 20 69 54 65 73 74 3b 0a 20 20 20 20 7d 0a   = iTest;.    }.
10ca0 20 20 7d 77 68 69 6c 65 28 20 72 65 73 20 26 26    }while( res &&
10cb0 20 69 4d 69 6e 3c 69 20 29 3b 0a 0a 23 69 66 64   iMin<i );..#ifd
10cc0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
10cd0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
10ce0 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  ng assert statem
10cf0 65 6e 74 73 20 63 68 65 63 6b 20 74 68 61 74 20  ents check that 
10d00 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63  the binary searc
10d10 68 20 63 6f 64 65 0a 20 20 2a 2a 20 61 62 6f 76  h code.  ** abov
10d20 65 20 66 6f 75 6e 64 20 74 68 65 20 72 69 67 68  e found the righ
10d30 74 20 61 6e 73 77 65 72 2e 20 54 68 69 73 20 62  t answer. This b
10d40 6c 6f 63 6b 20 73 65 72 76 65 73 20 6e 6f 20 70  lock serves no p
10d50 75 72 70 6f 73 65 20 6f 74 68 65 72 0a 20 20 2a  urpose other.  *
10d60 2a 20 74 68 61 6e 20 74 6f 20 69 6e 76 6f 6b 65  * than to invoke
10d70 20 74 68 65 20 61 73 73 65 72 74 73 2e 20 20 2a   the asserts.  *
10d80 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29  /.  if( res==0 )
10d90 7b 0a 20 20 20 20 2f 2a 20 49 66 20 28 72 65 73  {.    /* If (res
10da0 3d 3d 30 29 20 69 73 20 74 72 75 65 2c 20 74 68  ==0) is true, th
10db0 65 6e 20 73 61 6d 70 6c 65 20 24 69 20 6d 75 73  en sample $i mus
10dc0 74 20 62 65 20 65 71 75 61 6c 20 74 6f 20 70 52  t be equal to pR
10dd0 65 63 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ec */.    assert
10de0 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ( i<pIdx->nSampl
10df0 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
10e00 20 30 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 52   0==sqlite3VdbeR
10e10 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
10e20 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
10e30 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 0a 20  le[i].p, pRec). 
10e40 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
10e50 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
10e60 6c 65 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  led );.  }else{.
10e70 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
10e80 2c 20 70 52 65 63 20 6d 75 73 74 20 62 65 20 73  , pRec must be s
10e90 6d 61 6c 6c 65 72 20 74 68 61 6e 20 73 61 6d 70  maller than samp
10ea0 6c 65 20 24 69 20 61 6e 64 20 6c 61 72 67 65 72  le $i and larger
10eb0 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 73 61 6d   than.    ** sam
10ec0 70 6c 65 20 28 24 69 2d 31 29 2e 20 20 2a 2f 0a  ple ($i-1).  */.
10ed0 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70      assert( i==p
10ee0 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20  Idx->nSample .  
10ef0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
10f00 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
10f10 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c  re(aSample[i].n,
10f20 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70   aSample[i].p, p
10f30 52 65 63 29 3e 30 0a 20 20 20 20 20 20 20 20 20  Rec)>0.         
10f40 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
10f50 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
10f60 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30 0a     assert( i==0.
10f70 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
10f80 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
10f90 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31  pare(aSample[i-1
10fa0 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31  ].n, aSample[i-1
10fb0 5d 2e 70 2c 20 70 52 65 63 29 3c 30 0a 20 20 20  ].p, pRec)<0.   
10fc0 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
10fd0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
10fe0 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  d );.  }.#endif 
10ff0 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
11000 44 45 42 55 47 20 2a 2f 0a 0a 20 20 2f 2a 20 41  DEBUG */..  /* A
11010 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 53  t this point, aS
11020 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20  ample[i] is the 
11030 66 69 72 73 74 20 73 61 6d 70 6c 65 20 74 68 61  first sample tha
11040 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
11050 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20  n.  ** or equal 
11060 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69 66 20  to pVal.  Or if 
11070 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
11080 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c  , then all sampl
11090 65 73 20 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a  es are less.  **
110a0 20 74 68 61 6e 20 70 56 61 6c 2e 20 20 49 66 20   than pVal.  If 
110b0 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c  aSample[i]==pVal
110c0 2c 20 74 68 65 6e 20 72 65 73 3d 3d 30 2e 0a 20  , then res==0.. 
110d0 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d 30   */.  if( res==0
110e0 20 29 7b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d   ){.    aStat[0]
110f0 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   = aSample[i].an
11100 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53  Lt[iCol];.    aS
11110 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65  tat[1] = aSample
11120 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a  [i].anEq[iCol];.
11130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f    }else{.    tRo
11140 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70  wcnt iLower, iUp
11150 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69  per, iGap;.    i
11160 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( i==0 ){.     
11170 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20   iLower = 0;.   
11180 20 20 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d     iUpper = aSam
11190 70 6c 65 5b 30 5d 2e 61 6e 4c 74 5b 69 43 6f 6c  ple[0].anLt[iCol
111a0 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
111b0 20 20 20 20 69 55 70 70 65 72 20 3d 20 69 3e 3d      iUpper = i>=
111c0 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20  pIdx->nSample ? 
111d0 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 5b 30  pIdx->aiRowEst[0
111e0 5d 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  ] : aSample[i].a
111f0 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  nLt[iCol];.     
11200 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c   iLower = aSampl
11210 65 5b 69 2d 31 5d 2e 61 6e 45 71 5b 69 43 6f 6c  e[i-1].anEq[iCol
11220 5d 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d  ] + aSample[i-1]
11230 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20  .anLt[iCol];.   
11240 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20   }.    aStat[1] 
11250 3d 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  = (pIdx->nKeyCol
11260 3e 69 43 6f 6c 20 3f 20 70 49 64 78 2d 3e 61 41  >iCol ? pIdx->aA
11270 76 67 45 71 5b 69 43 6f 6c 5d 20 3a 20 31 29 3b  vgEq[iCol] : 1);
11280 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e  .    if( iLower>
11290 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20  =iUpper ){.     
112a0 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d   iGap = 0;.    }
112b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70  else{.      iGap
112c0 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77   = iUpper - iLow
112d0 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  er;.    }.    if
112e0 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20  ( roundUp ){.   
112f0 20 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a     iGap = (iGap*
11300 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  2)/3;.    }else{
11310 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47  .      iGap = iG
11320 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ap/3;.    }.    
11330 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65  aStat[0] = iLowe
11340 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 7d 0a  r + iGap;.  }.}.
11350 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11360 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
11370 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT4 */../*.**
11380 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
11390 73 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61  s used to estima
113a0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
113b0 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
113c0 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79  be visited.** by
113d0 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64   scanning an ind
113e0 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f  ex for a range o
113f0 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61  f values. The ra
11400 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20  nge may have an 
11410 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20  upper.** bound, 
11420 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f  a lower bound, o
11430 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52  r both. The WHER
11440 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  E clause terms t
11450 68 61 74 20 73 65 74 20 74 68 65 20 75 70 70 65  hat set the uppe
11460 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62  r.** and lower b
11470 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72 65 73  ounds are repres
11480 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20  ented by pLower 
11490 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65  and pUpper respe
114a0 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20  ctively. For.** 
114b0 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
114c0 67 20 74 68 61 74 20 69 6e 64 65 78 20 70 20 69  g that index p i
114d0 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a  s on t1(a):.**.*
114e0 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
114f0 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20  WHERE a > ? AND 
11500 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20  a < ? ....**    
11510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11520 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f  |_____|   |_____
11530 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
11540 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
11550 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
11560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
11570 6f 77 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a  ower    pUpper.*
11580 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f  *.** If either o
11590 66 20 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c  f the upper or l
115a0 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f  ower bound is no
115b0 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  t present, then 
115c0 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69  NULL is passed i
115d0 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68  n.** place of th
115e0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
115f0 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a  WhereTerm..**.**
11600 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 28 70   The value in (p
11610 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
11620 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73 20 74  .btree.nEq) is t
11630 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
11640 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  index.** column 
11650 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72  subject to the r
11660 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e  ange constraint.
11670 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c   Or, equivalentl
11680 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
11690 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  .** equality con
116a0 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a  straints optimiz
116b0 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73  ed by the propos
116c0 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46  ed index scan. F
116d0 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61  or example,.** a
116e0 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20  ssuming index p 
116f0 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20  is on t1(a, b), 
11700 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72  and the SQL quer
11710 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
11720 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
11730 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20  a = ? AND b > ? 
11740 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND b < ? ....**
11750 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20  .** then nEq is 
11760 73 65 74 20 74 6f 20 31 20 28 61 73 20 74 68 65  set to 1 (as the
11770 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74 65   range restricte
11780 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20  d column, b, is 
11790 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c  the second .** l
117a0 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
117b0 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f  of the index). O
117c0 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20  r, if the query 
117d0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
117e0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
117f0 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e  > ? AND a < ? ..
11800 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
11810 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a   is set to 0..**
11820 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
11830 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
11840 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20  , *pnOut is set 
11850 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4c 6f  to the sqlite3Lo
11860 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a  gEst() of the.**
11870 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
11880 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 73  that the index s
11890 63 61 6e 20 69 73 20 65 78 70 65 63 74 65 64 20  can is expected 
118a0 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f 75 74  to visit without
118b0 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67   .** considering
118c0 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74   the range const
118d0 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71 20 69  raints. If nEq i
118e0 73 20 30 2c 20 74 68 69 73 20 69 73 20 74 68 65  s 0, this is the
118f0 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 72   number of .** r
11900 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  ows in the index
11910 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  . Assuming no er
11920 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 6e 4f  ror occurs, *pnO
11930 75 74 20 69 73 20 61 64 6a 75 73 74 65 64 20 28  ut is adjusted (
11940 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f 20 61  reduced).** to a
11950 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 72  ccount for the r
11960 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74 73 20  ange contraints 
11970 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
11980 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65  r..** .** In the
11990 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69   absence of sqli
119a0 74 65 5f 73 74 61 74 34 20 41 4e 41 4c 59 5a 45  te_stat4 ANALYZE
119b0 20 64 61 74 61 2c 20 6f 72 20 69 66 20 73 75 63   data, or if suc
119c0 68 20 64 61 74 61 20 63 61 6e 6e 6f 74 20 62 65  h data cannot be
119d0 0a 2a 2a 20 75 73 65 64 2c 20 65 61 63 68 20 72  .** used, each r
119e0 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79 20  ange inequality 
119f0 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72  reduces the sear
11a00 63 68 20 73 70 61 63 65 20 62 79 20 61 20 66 61  ch space by a fa
11a10 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 48  ctor of 4. .** H
11a20 65 6e 63 65 20 61 20 70 61 69 72 20 6f 66 20 63  ence a pair of c
11a30 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20  onstraints (x>? 
11a40 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65 73  AND x<?) reduces
11a50 20 74 68 65 20 65 78 70 65 63 74 65 64 20 6e 75   the expected nu
11a60 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20  mber of.** rows 
11a70 76 69 73 69 74 65 64 20 62 79 20 61 20 66 61 63  visited by a fac
11a80 74 6f 72 20 6f 66 20 31 36 2e 0a 2a 2f 0a 73 74  tor of 16..*/.st
11a90 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61  atic int whereRa
11aa0 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61  ngeScanEst(.  Pa
11ab0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
11ac0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
11ad0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
11ae0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
11af0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
11b00 42 75 69 6c 64 65 72 2c 0a 20 20 57 68 65 72 65  Builder,.  Where
11b10 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20  Term *pLower,   
11b20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  /* Lower bound o
11b30 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
11b40 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62   "x>123" Might b
11b50 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
11b60 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20  eTerm *pUpper,  
11b70 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20   /* Upper bound 
11b80 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
11b90 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20  : "x<455" Might 
11ba0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
11bb0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20  reLoop *pLoop   
11bc0 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65 20    /* Modify the 
11bd0 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62 65 20  .nOut and maybe 
11be0 2e 72 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a  .rRun fields */.
11bf0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
11c00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
11c10 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  Out = pLoop->nOu
11c20 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77  t;.  LogEst nNew
11c30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
11c40 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
11c50 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20 2a  _STAT4.  Index *
11c60 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  p = pLoop->u.btr
11c70 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  ee.pIndex;.  int
11c80 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e   nEq = pLoop->u.
11c90 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66  btree.nEq;..  if
11ca0 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 0a 20  ( p->nSample>0. 
11cb0 20 20 26 26 20 6e 45 71 3d 3d 70 42 75 69 6c 64    && nEq==pBuild
11cc0 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 0a 20 20  er->nRecValid.  
11cd0 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70   && nEq<p->nSamp
11ce0 6c 65 43 6f 6c 0a 20 20 20 26 26 20 4f 70 74 69  leCol.   && Opti
11cf0 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
11d00 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49  pParse->db, SQLI
11d10 54 45 5f 53 74 61 74 33 29 20 0a 20 20 29 7b 0a  TE_Stat3) .  ){.
11d20 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f      UnpackedReco
11d30 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c  rd *pRec = pBuil
11d40 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20 74  der->pRec;.    t
11d50 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20  Rowcnt a[2];.   
11d60 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20 2f 2a   u8 aff;..    /*
11d70 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77 65 72   Variable iLower
11d80 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
11d90 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20  the estimate of 
11da0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
11db0 77 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68  ws in .    ** th
11dc0 65 20 69 6e 64 65 78 20 74 68 61 74 20 61 72 65  e index that are
11dd0 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c   less than the l
11de0 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  ower bound of th
11df0 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 54  e range query. T
11e00 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20  he.    ** lower 
11e10 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68 65 20  bound being the 
11e20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66  concatenation of
11e30 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68 65 72   $P and $L, wher
11e40 65 20 24 50 20 69 73 20 74 68 65 0a 20 20 20 20  e $P is the.    
11e50 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f  ** key-prefix fo
11e60 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71 20  rmed by the nEq 
11e70 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61  values matched a
11e80 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c  gainst the nEq l
11e90 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 2a 2a 20  eft-most.    ** 
11ea0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
11eb0 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73 20  ndex, and $L is 
11ec0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f  the value in pLo
11ed0 77 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  wer..    **.    
11ee0 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72  ** Or, if pLower
11ef0 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63   is NULL or $L c
11f00 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74  annot be extract
11f10 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65 63 61  ed from it (beca
11f20 75 73 65 20 69 74 0a 20 20 20 20 2a 2a 20 69 73  use it.    ** is
11f30 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76 61   not a simple va
11f40 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72 61  riable or litera
11f50 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c 6f  l value), the lo
11f60 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  wer bound of the
11f70 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 69 73  .    ** range is
11f80 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20 71 75   $P. Due to a qu
11f90 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79 20 77  irk in the way w
11fa0 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 77  hereKeyStats() w
11fb0 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20 20 2a  orks, even.    *
11fc0 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61 69 6c  * if $L is avail
11fd0 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79 53 74  able, whereKeySt
11fe0 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ats() is called 
11ff0 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20 61 6e  for both ($P) an
12000 64 20 0a 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c  d .    ** ($P:$L
12010 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67 65 72  ) and the larger
12020 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65 74 75   of the two retu
12030 72 6e 65 64 20 76 61 6c 75 65 73 20 75 73 65 64  rned values used
12040 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
12050 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70 65  Similarly, iUppe
12060 72 20 69 73 20 74 6f 20 62 65 20 73 65 74 20 74  r is to be set t
12070 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f  o the estimate o
12080 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
12090 72 6f 77 73 0a 20 20 20 20 2a 2a 20 6c 65 73 73  rows.    ** less
120a0 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20   than the upper 
120b0 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  bound of the ran
120c0 67 65 20 71 75 65 72 79 2e 20 57 68 65 72 65 20  ge query. Where 
120d0 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 0a  the upper bound.
120e0 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72      ** is either
120f0 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24 55 29   ($P) or ($P:$U)
12100 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20 69 66  . Again, even if
12110 20 24 55 20 69 73 20 61 76 61 69 6c 61 62 6c 65   $U is available
12120 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20  , both values.  
12130 20 20 2a 2a 20 6f 66 20 69 55 70 70 65 72 20 61    ** of iUpper a
12140 72 65 20 72 65 71 75 65 73 74 65 64 20 6f 66 20  re requested of 
12150 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20  whereKeyStats() 
12160 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65 72 20  and the smaller 
12170 75 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  used..    */.   
12180 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b   tRowcnt iLower;
12190 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70  .    tRowcnt iUp
121a0 70 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 6e 45  per;..    if( nE
121b0 71 3d 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b  q==p->nKeyCol ){
121c0 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
121d0 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
121e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
121f0 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c    aff = p->pTabl
12200 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c  e->aCol[p->aiCol
12210 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69 6e 69  umn[nEq]].affini
12220 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ty;.    }.    /*
12230 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65   Determine iLowe
12240 72 20 61 6e 64 20 69 55 70 70 65 72 20 75 73 69  r and iUpper usi
12250 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f  ng ($P) only. */
12260 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20  .    if( nEq==0 
12270 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20  ){.      iLower 
12280 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70 70 65  = 0;.      iUppe
12290 72 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b  r = p->aiRowEst[
122a0 30 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0];.    }else{. 
122b0 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68       /* Note: th
122c0 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65  is call could be
122d0 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79 20   optimized away 
122e0 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d 65  - since the same
122f0 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20 20   values must .  
12300 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e      ** have been
12310 20 72 65 71 75 65 73 74 65 64 20 77 68 65 6e 20   requested when 
12320 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50 20 69  testing key $P i
12330 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  n whereEqualScan
12340 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20 20  Est().  */.     
12350 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
12360 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20  Parse, p, pRec, 
12370 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 69 4c 6f  0, a);.      iLo
12380 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20  wer = a[0];.    
12390 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 20    iUpper = a[0] 
123a0 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20  + a[1];.    }.. 
123b0 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c     /* If possibl
123c0 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68  e, improve on th
123d0 65 20 69 4c 6f 77 65 72 20 65 73 74 69 6d 61 74  e iLower estimat
123e0 65 20 75 73 69 6e 67 20 28 24 50 3a 24 4c 29 2e  e using ($P:$L).
123f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 77   */.    if( pLow
12400 65 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  er ){.      int 
12410 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  bOk;            
12420 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
12430 69 66 20 76 61 6c 75 65 20 69 73 20 65 78 74 72  if value is extr
12440 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72  acted from pExpr
12450 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
12460 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e  pExpr = pLower->
12470 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
12480 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
12490 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  ower->eOperator 
124a0 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29  & (WO_GT|WO_GE))
124b0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  !=0 );.      rc 
124c0 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72  = sqlite3Stat4Pr
124d0 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72  obeSetValue(pPar
124e0 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45  se, p, &pRec, pE
124f0 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26  xpr, aff, nEq, &
12500 62 4f 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  bOk);.      if( 
12510 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
12520 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20   bOk ){.        
12530 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20  tRowcnt iNew;.  
12540 20 20 20 20 20 20 77 68 65 72 65 4b 65 79 53 74        whereKeySt
12550 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
12560 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20  Rec, 0, a);.    
12570 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20      iNew = a[0] 
12580 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65  + ((pLower->eOpe
12590 72 61 74 6f 72 20 26 20 57 4f 5f 47 54 29 20 3f  rator & WO_GT) ?
125a0 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20   a[1] : 0);.    
125b0 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c 6f      if( iNew>iLo
125c0 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20 69  wer ) iLower = i
125d0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75  New;.        nOu
125e0 74 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t--;.      }.   
125f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 6f   }..    /* If po
12600 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20  ssible, improve 
12610 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20 65 73  on the iUpper es
12620 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50  timate using ($P
12630 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 69 66 28  :$U). */.    if(
12640 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20   pUpper ){.     
12650 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20   int bOk;       
12660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12670 54 72 75 65 20 69 66 20 76 61 6c 75 65 20 69 73  True if value is
12680 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
12690 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 45  pExpr */.      E
126a0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70  xpr *pExpr = pUp
126b0 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  per->pExpr->pRig
126c0 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ht;.      assert
126d0 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72  ( (pUpper->eOper
126e0 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f  ator & (WO_LT|WO
126f0 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  _LE))!=0 );.    
12700 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
12710 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
12720 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
12730 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e  c, pExpr, aff, n
12740 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20  Eq, &bOk);.     
12750 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12760 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20  OK && bOk ){.   
12770 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65       tRowcnt iNe
12780 77 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  w;.        where
12790 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
127a0 20 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b   p, pRec, 1, a);
127b0 0a 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20  .        iNew = 
127c0 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72 2d  a[0] + ((pUpper-
127d0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
127e0 4c 45 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b  LE) ? a[1] : 0);
127f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65  .        if( iNe
12800 77 3c 69 55 70 70 65 72 20 29 20 69 55 70 70 65  w<iUpper ) iUppe
12810 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  r = iNew;.      
12820 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20    nOut--;.      
12830 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 42 75  }.    }..    pBu
12840 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52  ilder->pRec = pR
12850 65 63 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ec;.    if( rc==
12860 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12870 20 20 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c     if( iUpper>iL
12880 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ower ){.        
12890 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nNew = sqlite3Lo
128a0 67 45 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c  gEst(iUpper - iL
128b0 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ower);.      }el
128c0 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 4e 65 77  se{.        nNew
128d0 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61 73   = 10;        as
128e0 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65  sert( 10==sqlite
128f0 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20  3LogEst(2) );.  
12900 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
12910 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20 20 20  nNew<nOut ){.   
12920 20 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4e 65 77       nOut = nNew
12930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12940 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c  pLoop->nOut = (L
12950 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 20 20  ogEst)nOut;.    
12960 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
12970 30 2c 20 28 22 72 61 6e 67 65 20 73 63 61 6e 20  0, ("range scan 
12980 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20  regions: %u..%u 
12990 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   est=%d\n",.    
129a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129b0 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65 72       (u32)iLower
129c0 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c 20 6e  , (u32)iUpper, n
129d0 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 72 65 74  Out));.      ret
129e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
129f0 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
12a00 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
12a10 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55  R(pParse);.  UNU
12a20 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42  SED_PARAMETER(pB
12a30 75 69 6c 64 65 72 29 3b 0a 23 65 6e 64 69 66 0a  uilder);.#endif.
12a40 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72    assert( pLower
12a50 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 20 20   || pUpper );.  
12a60 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 45 61 63 68  /* TUNING:  Each
12a70 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
12a80 74 72 61 69 6e 74 20 72 65 64 75 63 65 73 20 74  traint reduces t
12a90 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
12aa0 34 2d 66 6f 6c 64 2e 0a 20 20 2a 2a 20 41 20 42  4-fold..  ** A B
12ab0 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c  ETWEEN operator,
12ac0 20 74 68 65 72 65 66 6f 72 65 2c 20 72 65 64 75   therefore, redu
12ad0 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73  ces the search s
12ae0 70 61 63 65 20 31 36 2d 66 6f 6c 64 20 2a 2f 0a  pace 16-fold */.
12af0 20 20 6e 4e 65 77 20 3d 20 6e 4f 75 74 3b 0a 20    nNew = nOut;. 
12b00 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20 28   if( pLower && (
12b10 70 4c 6f 77 65 72 2d 3e 77 74 46 6c 61 67 73 20  pLower->wtFlags 
12b20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
12b30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20   ){.    nNew -= 
12b40 32 30 3b 20 20 20 20 20 20 20 20 61 73 73 65 72  20;        asser
12b50 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 20==sqlite3Lo
12b60 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20 6e  gEst(4) );.    n
12b70 4f 75 74 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28  Out--;.  }.  if(
12b80 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20 6e   pUpper ){.    n
12b90 4e 65 77 20 2d 3d 20 32 30 3b 20 20 20 20 20 20  New -= 20;      
12ba0 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71    assert( 20==sq
12bb0 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29  lite3LogEst(4) )
12bc0 3b 0a 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20  ;.    nOut--;.  
12bd0 7d 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20  }.  if( nNew<10 
12be0 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69  ) nNew = 10;.  i
12bf0 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e  f( nNew<nOut ) n
12c00 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 70 4c  Out = nNew;.  pL
12c10 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67  oop->nOut = (Log
12c20 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65 74 75  Est)nOut;.  retu
12c30 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
12c40 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
12c50 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a  TAT3_OR_STAT4./*
12c60 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
12c70 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
12c80 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
12c90 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a  urned based on.*
12ca0 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f  * an equality co
12cb0 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45  nstraint x=VALUE
12cc0 20 61 6e 64 20 77 68 65 72 65 20 74 68 61 74 20   and where that 
12cd0 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a  VALUE occurs in.
12ce0 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d  ** the histogram
12cf0 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c   data.  This onl
12d00 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69  y works when x i
12d10 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a  s the left-most.
12d20 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20  ** column of an 
12d30 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65  index and sqlite
12d40 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d  _stat3 histogram
12d50 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62   data is availab
12d60 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69  le.** for that i
12d70 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70  ndex.  When pExp
12d80 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  r==NULL that mea
12d90 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  ns the constrain
12da0 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55  t is.** "x IS NU
12db0 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  LL" instead of "
12dc0 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20  x=VALUE"..**.** 
12dd0 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61  Write the estima
12de0 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e  ted row count in
12df0 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65  to *pnRow and re
12e00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
12e10 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f  .** If unable to
12e20 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74   make an estimat
12e30 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20  e, leave *pnRow 
12e40 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65  unchanged and re
12e50 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
12e60 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
12e70 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66  tine can fail if
12e80 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f   it is unable to
12e90 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e   load a collatin
12ea0 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65  g sequence.** re
12eb0 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e  quired for strin
12ec0 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72  g comparison, or
12ed0 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c   if unable to al
12ee0 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a  locate memory.**
12ef0 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65   for a UTF conve
12f00 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66  rsion required f
12f10 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  or comparison.  
12f20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f  The error is sto
12f30 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50  red.** in the pP
12f40 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
12f50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
12f60 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
12f70 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
12f80 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
12f90 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
12fa0 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
12fb0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
12fc0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
12fd0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
12fe0 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
12ff0 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20  on for VALUE in 
13000 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73  the x=VALUE cons
13010 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77  traint */.  tRow
13020 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20  cnt *pnRow      
13030 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65   /* Write the re
13040 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61  vised row estima
13050 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  te here */.){.  
13060 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c  Index *p = pBuil
13070 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72  der->pNew->u.btr
13080 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  ee.pIndex;.  int
13090 20 6e 45 71 20 3d 20 70 42 75 69 6c 64 65 72 2d   nEq = pBuilder-
130a0 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  >pNew->u.btree.n
130b0 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  Eq;.  UnpackedRe
130c0 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75  cord *pRec = pBu
130d0 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 75  ilder->pRec;.  u
130e0 38 20 61 66 66 3b 20 20 20 20 20 20 20 20 20 20  8 aff;          
130f0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
13100 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20  mn affinity */. 
13110 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
13120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
13130 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e  bfunction return
13140 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63   code */.  tRowc
13150 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20 20  nt a[2];        
13160 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74 69       /* Statisti
13170 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b  cs */.  int bOk;
13180 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e  ..  assert( nEq>
13190 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
131a0 6e 45 71 3c 3d 28 70 2d 3e 6e 4b 65 79 43 6f 6c  nEq<=(p->nKeyCol
131b0 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  +1) );.  assert(
131c0 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29   p->aSample!=0 )
131d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
131e0 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73  Sample>0 );.  as
131f0 73 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e  sert( pBuilder->
13200 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71 20 29 3b  nRecValid<nEq );
13210 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75 65 73  ..  /* If values
13220 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
13230 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69 65 6c 64  le for all field
13240 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74  s of the index t
13250 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20  o the left.  ** 
13260 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e 6f 20  of this one, no 
13270 65 73 74 69 6d 61 74 65 20 63 61 6e 20 62 65 20  estimate can be 
13280 6d 61 64 65 2e 20 52 65 74 75 72 6e 20 53 51 4c  made. Return SQL
13290 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f  ITE_NOTFOUND. */
132a0 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d  .  if( pBuilder-
132b0 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45 71 2d  >nRecValid<(nEq-
132c0 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
132d0 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
132e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
132f0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
13300 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20 63 61  ion only. The ca
13310 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53 74 61  ll to sqlite3Sta
13320 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
13330 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77 6f 75  ).  ** below wou
13340 6c 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ld return the sa
13350 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20  me value.  */.  
13360 69 66 28 20 6e 45 71 3e 70 2d 3e 6e 4b 65 79 43  if( nEq>p->nKeyC
13370 6f 6c 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f 77  ol ){.    *pnRow
13380 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
13390 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
133a0 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62  .  aff = p->pTab
133b0 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f  le->aCol[p->aiCo
133c0 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61 66 66  lumn[nEq-1]].aff
133d0 69 6e 69 74 79 3b 0a 20 20 72 63 20 3d 20 73 71  inity;.  rc = sq
133e0 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
133f0 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  etValue(pParse, 
13400 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c  p, &pRec, pExpr,
13410 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20 26 62 4f   aff, nEq-1, &bO
13420 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e  k);.  pBuilder->
13430 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 69  pRec = pRec;.  i
13440 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13450 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
13460 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74  if( bOk==0 ) ret
13470 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
13480 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d  UND;.  pBuilder-
13490 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 45 71  >nRecValid = nEq
134a0 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53 74 61  ;..  whereKeySta
134b0 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
134c0 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48 45  ec, 0, a);.  WHE
134d0 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 65  RETRACE(0x10,("e
134e0 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67  quality scan reg
134f0 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e  ions: %d\n", (in
13500 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52  t)a[1]));.  *pnR
13510 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20  ow = a[1];.  .  
13520 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
13530 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
13540 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
13550 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  AT4 */..#ifdef S
13560 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
13570 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
13580 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * Estimate the n
13590 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
135a0 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
135b0 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ned based on.** 
135c0 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  an IN constraint
135d0 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74   where the right
135e0 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
135f0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  e IN operator.**
13600 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61   is a list of va
13610 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a  lues.  Example:.
13620 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45  **.**        WHE
13630 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34  RE x IN (1,2,3,4
13640 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ).**.** Write th
13650 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20  e estimated row 
13660 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f  count into *pnRo
13670 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  w and return SQL
13680 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75  ITE_OK. .** If u
13690 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e  nable to make an
136a0 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65   estimate, leave
136b0 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65   *pnRow unchange
136c0 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  d and return.** 
136d0 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
136e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
136f0 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75   fail if it is u
13700 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20  nable to load a 
13710 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
13720 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66  ce.** required f
13730 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  or string compar
13740 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62  ison, or if unab
13750 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
13760 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55  emory.** for a U
13770 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65  TF conversion re
13780 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61  quired for compa
13790 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f  rison.  The erro
137a0 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  r is stored.** i
137b0 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
137c0 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
137d0 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61  c int whereInSca
137e0 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
137f0 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
13800 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
13810 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
13820 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
13830 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
13840 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  r,.  ExprList *p
13850 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  List,     /* The
13860 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74   value list on t
13870 68 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20  he RHS of "x IN 
13880 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20  (v1,v2,v3,...)" 
13890 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e  */.  tRowcnt *pn
138a0 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69  Row       /* Wri
138b0 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
138c0 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
138d0 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
138e0 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
138f0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
13900 65 78 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56 61  ex;.  int nRecVa
13910 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  lid = pBuilder->
13920 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74  nRecValid;.  int
13930 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13940 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
13950 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
13960 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73  */.  tRowcnt nEs
13970 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
13980 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66  Number of rows f
13990 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  or a single term
139a0 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52   */.  tRowcnt nR
139b0 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a  owEst = 0;    /*
139c0 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66   New estimate of
139d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
139e0 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ows */.  int i; 
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a00 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
13a10 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
13a20 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a  ->aSample!=0 );.
13a30 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
13a40 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c  QLITE_OK && i<pL
13a50 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
13a60 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 70 2d 3e  {.    nEst = p->
13a70 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20  aiRowEst[0];.   
13a80 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c   rc = whereEqual
13a90 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
13aa0 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d  pBuilder, pList-
13ab0 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45  >a[i].pExpr, &nE
13ac0 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74  st);.    nRowEst
13ad0 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 42   += nEst;.    pB
13ae0 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
13af0 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20  d = nRecValid;. 
13b00 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
13b10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
13b20 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d 3e  f( nRowEst > p->
13b30 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e 52  aiRowEst[0] ) nR
13b40 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77  owEst = p->aiRow
13b50 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e 52  Est[0];.    *pnR
13b60 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20  ow = nRowEst;.  
13b70 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
13b80 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d  0,("IN row estim
13b90 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e 22 2c 20  ate: est=%g\n", 
13ba0 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20  nRowEst));.  }. 
13bb0 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65   assert( pBuilde
13bc0 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52  r->nRecValid==nR
13bd0 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74  ecValid );.  ret
13be0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
13bf0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
13c00 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
13c10 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62   */../*.** Disab
13c20 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  le a term in the
13c30 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
13c40 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64  Except, do not d
13c50 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a  isable the term.
13c60 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c  ** if it control
13c70 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  s a LEFT OUTER J
13c80 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e  OIN and it did n
13c90 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20  ot originate in 
13ca0 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49  the ON.** or USI
13cb0 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61  NG clause of tha
13cc0 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f  t join..**.** Co
13cd0 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d 20  nsider the term 
13ce0 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65  t2.z='ok' in the
13cf0 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69   following queri
13d00 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  es:.**.**   (1) 
13d10 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
13d20 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
13d30 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52  N t1.a=t2.x WHER
13d40 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  E t2.z='ok'.**  
13d50 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (2)  SELECT * F
13d60 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
13d70 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
13d80 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a   AND t2.z='ok'.*
13d90 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54 20  *   (3)  SELECT 
13da0 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48  * FROM t1, t2 WH
13db0 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e  ERE t1.a=t2.x AN
13dc0 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a  D t2.z='ok'.**.*
13dd0 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20  * The t2.z='ok' 
13de0 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74  is disabled in t
13df0 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75 73  he in (2) becaus
13e00 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a  e it originates.
13e10 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61  ** in the ON cla
13e20 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69  use.  The term i
13e30 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33  s disabled in (3
13e40 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  ) because it is 
13e50 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61  not part.** of a
13e60 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
13e70 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74  .  In (1), the t
13e80 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62  erm is not disab
13e90 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62  led..**.** Disab
13ea0 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73  ling a term caus
13eb0 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20  es that term to 
13ec0 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69 6e  not be tested in
13ed0 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a   the inner loop.
13ee0 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ** of the join. 
13ef0 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e   Disabling is an
13f00 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
13f10 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73  When terms are s
13f20 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69  atisfied.** by i
13f30 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73 61 62  ndices, we disab
13f40 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65  le them to preve
13f50 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73  nt redundant tes
13f60 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a  ts in the inner.
13f70 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75  ** loop.  We wou
13f80 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65  ld get the corre
13f90 63 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f  ct results if no
13fa0 74 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20  thing were ever 
13fb0 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74  disabled,.** but
13fc0 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e   joins might run
13fd0 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72   a little slower
13fe0 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20  .  The trick is 
13ff0 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75  to disable as mu
14000 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20  ch.** as we can 
14010 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e  without disablin
14020 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20  g too much.  If 
14030 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  we disabled in (
14040 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20  1), we'd get.** 
14050 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72  the wrong answer
14060 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 38  .  See ticket #8
14070 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  13..*/.static vo
14080 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57  id disableTerm(W
14090 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
140a0 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  l, WhereTerm *pT
140b0 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72  erm){.  if( pTer
140c0 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54 65 72  m.      && (pTer
140d0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
140e0 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20  M_CODED)==0.    
140f0 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c    && (pLevel->iL
14100 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78  eftJoin==0 || Ex
14110 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
14120 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
14130 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20  romJoin)).      
14140 26 26 20 28 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  && (pLevel->notR
14150 65 61 64 79 20 26 20 70 54 65 72 6d 2d 3e 70 72  eady & pTerm->pr
14160 65 72 65 71 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b  ereqAll)==0.  ){
14170 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  .    pTerm->wtFl
14180 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
14190 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  D;.    if( pTerm
141a0 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a  ->iParent>=0 ){.
141b0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
141c0 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d  *pOther = &pTerm
141d0 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e  ->pWC->a[pTerm->
141e0 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20  iParent];.      
141f0 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e  if( (--pOther->n
14200 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20  Child)==0 ){.   
14210 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
14220 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29  (pLevel, pOther)
14230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14240 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64    }.}../*.** Cod
14250 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79  e an OP_Affinity
14260 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79   opcode to apply
14270 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69   the column affi
14280 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66  nity string zAff
14290 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67  .** to the n reg
142a0 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
142b0 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20  at base. .**.** 
142c0 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  As an optimizati
142d0 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  on, SQLITE_AFF_N
142e0 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68 69  ONE entries (whi
142f0 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61  ch are no-ops) a
14300 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69  t the.** beginni
14310 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41  ng and end of zA
14320 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20  ff are ignored. 
14330 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   If all entries 
14340 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53  in zAff are.** S
14350 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20  QLITE_AFF_NONE, 
14360 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74  then no code get
14370 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a  s generated..**.
14380 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14390 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f  makes its own co
143a0 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68  py of zAff so th
143b0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  at the caller is
143c0 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69   free.** to modi
143d0 66 79 20 7a 41 66 66 20 61 66 74 65 72 20 74 68  fy zAff after th
143e0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
143f0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
14400 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69  id codeApplyAffi
14410 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72  nity(Parse *pPar
14420 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e  se, int base, in
14430 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29  t n, char *zAff)
14440 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
14450 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
14460 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20  f( zAff==0 ){.  
14470 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
14480 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
14490 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed );.    return
144a0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
144b0 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  v!=0 );..  /* Ad
144c0 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20  just base and n 
144d0 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c  to skip over SQL
144e0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74  ITE_AFF_NONE ent
144f0 72 69 65 73 20 61 74 20 74 68 65 20 62 65 67 69  ries at the begi
14500 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65  nning.  ** and e
14510 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69  nd of the affini
14520 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a  ty string..  */.
14530 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
14540 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f  zAff[0]==SQLITE_
14550 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
14560 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b  n--;.    base++;
14570 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d  .    zAff++;.  }
14580 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26  .  while( n>1 &&
14590 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49   zAff[n-1]==SQLI
145a0 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
145b0 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f     n--;.  }..  /
145c0 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66  * Code the OP_Af
145d0 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66  finity opcode if
145e0 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69   there is anythi
145f0 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a  ng left to do. *
14600 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  /.  if( n>0 ){. 
14610 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14620 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp2(v, OP_Affin
14630 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20  ity, base, n);. 
14640 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
14650 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41  angeP4(v, -1, zA
14660 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ff, n);.    sqli
14670 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
14680 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
14690 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d  e, base, n);.  }
146a0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
146b0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73  ate code for a s
146c0 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74  ingle equality t
146d0 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
146e0 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75   clause.  An equ
146f0 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61  ality.** term ca
14700 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78  n be either X=ex
14710 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29  pr or X IN (...)
14720 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65  .   pTerm is the
14730 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20   term to be .** 
14740 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  coded..**.** The
14750 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66   current value f
14760 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  or the constrain
14770 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  t is left in reg
14780 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a  ister iReg..**.*
14790 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  * For a constrai
147a0 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  nt of the form X
147b0 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65  =expr, the expre
147c0 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74  ssion is evaluat
147d0 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65  ed and its.** re
147e0 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20  sult is left on 
147f0 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20  the stack.  For 
14800 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74  constraints of t
14810 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e  he form X IN (..
14820 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  .).** this routi
14830 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f  ne sets up a loo
14840 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72  p that will iter
14850 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c  ate over all val
14860 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61  ues of X..*/.sta
14870 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61  tic int codeEqua
14880 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73  lityTerm(.  Pars
14890 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
148a0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
148b0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
148c0 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20  eTerm *pTerm,   
148d0 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74  /* The term of t
148e0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
148f0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
14900 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
14910 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76 65  vel, /* The leve
14920 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  l of the FROM cl
14930 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b  ause we are work
14940 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ing on */.  int 
14950 69 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  iEq,            
14960 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
14970 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77 69  equality term wi
14980 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c 20  thin this level 
14990 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20  */.  int bRev,  
149a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
149b0 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72 64   for reverse-ord
149c0 65 72 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e 73  er IN operations
149d0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65   */.  int iTarge
149e0 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74  t         /* Att
149f0 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65  empt to leave re
14a00 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65  sults in this re
14a10 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45  gister */.){.  E
14a20 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
14a30 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a  >pExpr;.  Vdbe *
14a40 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
14a50 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20  e;.  int iReg;  
14a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a70 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
14a80 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a  ing results */..
14a90 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65    assert( iTarge
14aa0 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d  t>0 );.  if( pX-
14ab0 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20  >op==TK_EQ ){.  
14ac0 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
14ad0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
14ae0 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
14af0 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d  t, iTarget);.  }
14b00 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d  else if( pX->op=
14b10 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
14b20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74    iReg = iTarget
14b30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14b40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
14b50 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69  ll, 0, iReg);.#i
14b60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14b70 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c  T_SUBQUERY.  }el
14b80 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70  se{.    int eTyp
14b90 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b  e;.    int iTab;
14ba0 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f  .    struct InLo
14bb0 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68 65  op *pIn;.    Whe
14bc0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20  reLoop *pLoop = 
14bd0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
14be0 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
14bf0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
14c00 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
14c10 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70  0.      && pLoop
14c20 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
14c30 21 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f  !=0.      && pLo
14c40 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
14c50 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
14c60 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq].    ){.     
14c70 20 74 65 73 74 63 61 73 65 28 20 69 45 71 3d 3d   testcase( iEq==
14c80 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
14c90 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20  ase( bRev );.   
14ca0 20 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b     bRev = !bRev;
14cb0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
14cc0 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
14cd0 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69   );.    iReg = i
14ce0 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70  Target;.    eTyp
14cf0 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
14d00 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
14d10 58 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 65  X, 0);.    if( e
14d20 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type==IN_INDEX_I
14d30 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20  NDEX_DESC ){.   
14d40 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65     testcase( bRe
14d50 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20  v );.      bRev 
14d60 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20  = !bRev;.    }. 
14d70 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54     iTab = pX->iT
14d80 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  able;.    sqlite
14d90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62  3VdbeAddOp2(v, b
14da0 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
14db0 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
14dc0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
14dd0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
14de0 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
14df0 52 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f  R)==0 );.    pLo
14e00 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  op->wsFlags |= W
14e10 48 45 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20  HERE_IN_ABLE;.  
14e20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e    if( pLevel->u.
14e30 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20  in.nIn==0 ){.   
14e40 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e     pLevel->addrN
14e50 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
14e60 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
14e70 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
14e80 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20  u.in.nIn++;.    
14e90 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
14ea0 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71  Loop =.       sq
14eb0 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
14ec0 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
14ed0 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
14ee0 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  nLoop,.         
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f00 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76       sizeof(pLev
14f10 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
14f20 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69  [0])*pLevel->u.i
14f30 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20  n.nIn);.    pIn 
14f40 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  = pLevel->u.in.a
14f50 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20  InLoop;.    if( 
14f60 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  pIn ){.      pIn
14f70 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e   += pLevel->u.in
14f80 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20  .nIn - 1;.      
14f90 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62  pIn->iCur = iTab
14fa0 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
14fb0 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
14fc0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  D ){.        pIn
14fd0 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71  ->addrInTop = sq
14fe0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14ff0 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61  v, OP_Rowid, iTa
15000 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20  b, iReg);.      
15010 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
15020 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20  In->addrInTop = 
15030 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15040 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
15050 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a  iTab, 0, iReg);.
15060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
15070 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20  n->eEndLoopOp = 
15080 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 49 66  bRev ? OP_PrevIf
15090 4f 70 65 6e 20 3a 20 4f 50 5f 4e 65 78 74 49 66  Open : OP_NextIf
150a0 4f 70 65 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69  Open;.      sqli
150b0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
150c0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67   OP_IsNull, iReg
150d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
150e0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e      pLevel->u.in
150f0 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  .nIn = 0;.    }.
15100 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73  #endif.  }.  dis
15110 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
15120 20 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72   pTerm);.  retur
15130 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iReg;.}../*.**
15140 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
15150 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
15160 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20  e all == and IN 
15170 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20  constraints for 
15180 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 73 63 61 6e  an.** index scan
15190 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
151a0 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61  ple, consider ta
151b0 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65  ble t1(a,b,c,d,e
151c0 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69  ,f) with index i
151d0 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70  1(a,b,c)..** Sup
151e0 70 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63  pose the WHERE c
151f0 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20  lause is this:  
15200 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31  a==5 AND b IN (1
15210 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e  ,2,3) AND c>5 AN
15220 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e  D c<10.** The in
15230 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20  dex has as many 
15240 61 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74  as three equalit
15250 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62  y constraints, b
15260 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78  ut in this.** ex
15270 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64  ample, the third
15280 20 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e   "c" value is an
15290 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f   inequality.  So
152a0 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f   only two .** co
152b0 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f  nstraints are co
152c0 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ded.  This routi
152d0 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  ne will generate
152e0 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
152f0 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20  e.** a==5 and b 
15300 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65  IN (1,2,3).  The
15310 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20   current values 
15320 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c  for a and b will
15330 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   be stored.** in
15340 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67   consecutive reg
15350 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 69  isters and the i
15360 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73  ndex of the firs
15370 74 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65  t register is re
15380 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e  turned..**.** In
15390 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
153a0 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20  ve nEq==2.  But 
153b0 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  this subroutine 
153c0 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61  works for any va
153d0 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e  lue.** of nEq in
153e0 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e  cluding 0.  If n
153f0 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74  Eq==0, this rout
15400 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20  ine is nearly a 
15410 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e  no-op..** The on
15420 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73  ly thing it does
15430 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   is allocate the
15440 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65   pLevel->iMem me
15450 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a  mory cell and.**
15460 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66   compute the aff
15470 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a  inity string..**
15480 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 52 65  .** The nExtraRe
15490 67 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  g parameter is 0
154a0 20 6f 72 20 31 2e 20 20 49 74 20 69 73 20 30 20   or 1.  It is 0 
154b0 69 66 20 61 6c 6c 20 57 48 45 52 45 20 63 6c 61  if all WHERE cla
154c0 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  use constraints.
154d0 2a 2a 20 61 72 65 20 3d 3d 20 6f 72 20 49 4e 20  ** are == or IN 
154e0 61 6e 64 20 61 72 65 20 63 6f 76 65 72 65 64 20  and are covered 
154f0 62 79 20 74 68 65 20 6e 45 71 2e 20 20 6e 45 78  by the nEq.  nEx
15500 74 72 61 52 65 67 20 69 73 20 31 20 69 66 20 74  traReg is 1 if t
15510 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e  here is.** an in
15520 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
15530 69 6e 74 20 28 73 75 63 68 20 61 73 20 74 68 65  int (such as the
15540 20 22 63 3e 3d 35 20 41 4e 44 20 63 3c 31 30 22   "c>=5 AND c<10"
15550 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29   in the example)
15560 20 74 68 61 74 0a 2a 2a 20 6f 63 63 75 72 73 20   that.** occurs 
15570 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 71 75  after the nEq qu
15580 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
15590 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
155a0 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20  utine allocates 
155b0 61 20 72 61 6e 67 65 20 6f 66 20 6e 45 71 2b 6e  a range of nEq+n
155c0 45 78 74 72 61 52 65 67 20 6d 65 6d 6f 72 79 20  ExtraReg memory 
155d0 63 65 6c 6c 73 20 61 6e 64 20 72 65 74 75 72 6e  cells and return
155e0 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f  s.** the index o
155f0 66 20 74 68 65 20 66 69 72 73 74 20 6d 65 6d 6f  f the first memo
15600 72 79 20 63 65 6c 6c 20 69 6e 20 74 68 61 74 20  ry cell in that 
15610 72 61 6e 67 65 2e 20 54 68 65 20 63 6f 64 65 20  range. The code 
15620 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68  that.** calls th
15630 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
15640 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20  use that memory 
15650 72 61 6e 67 65 20 74 6f 20 73 74 6f 72 65 20 6b  range to store k
15660 65 79 73 20 66 6f 72 0a 2a 2a 20 73 74 61 72 74  eys for.** start
15670 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 69 6f 6e   and termination
15680 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 66 20 74   conditions of t
15690 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 20 6b 65 79 20  he loop..** key 
156a0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f  value of the loo
156b0 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f  p.  If one or mo
156c0 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  re IN operators 
156d0 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20  appear, then.** 
156e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c  this routine all
156f0 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69 74 69  ocates an additi
15700 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20  onal nEq memory 
15710 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e  cells for intern
15720 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a  al.** use..**.**
15730 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
15740 67 2c 20 2a 70 7a 41 66 66 20 69 73 20 73 65 74  g, *pzAff is set
15750 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
15760 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
15770 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68   a.** copy of th
15780 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74  e column affinit
15790 79 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20  y string of the 
157a0 69 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65 64 20  index allocated 
157b0 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
157c0 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65  DbMalloc(). Exce
157d0 70 74 2c 20 65 6e 74 72 69 65 73 20 69 6e 20 74  pt, entries in t
157e0 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73  he copy of the s
157f0 74 72 69 6e 67 20 61 73 73 6f 63 69 61 74 65 64  tring associated
15800 0a 2a 2a 20 77 69 74 68 20 65 71 75 61 6c 69 74  .** with equalit
15810 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68  y constraints th
15820 61 74 20 75 73 65 20 4e 4f 4e 45 20 61 66 66 69  at use NONE affi
15830 6e 69 74 79 20 61 72 65 20 73 65 74 20 74 6f 0a  nity are set to.
15840 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ** SQLITE_AFF_NO
15850 4e 45 2e 20 54 68 69 73 20 69 73 20 74 6f 20 64  NE. This is to d
15860 65 61 6c 20 77 69 74 68 20 53 51 4c 20 73 75 63  eal with SQL suc
15870 68 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h as the followi
15880 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  ng:.**.**   CREA
15890 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 54 45  TE TABLE t1(a TE
158a0 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  XT PRIMARY KEY, 
158b0 62 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  b);.**   SELECT 
158c0 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53 20 74  ... FROM t1 AS t
158d0 32 2c 20 74 31 20 57 48 45 52 45 20 74 31 2e 61  2, t1 WHERE t1.a
158e0 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49   = t2.b;.**.** I
158f0 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62  n the example ab
15900 6f 76 65 2c 20 74 68 65 20 69 6e 64 65 78 20 6f  ove, the index o
15910 6e 20 74 31 28 61 29 20 68 61 73 20 54 45 58 54  n t1(a) has TEXT
15920 20 61 66 66 69 6e 69 74 79 2e 20 42 75 74 20 73   affinity. But s
15930 69 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69 67 68  ince.** the righ
15940 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t hand side of t
15950 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  he equality cons
15960 74 72 61 69 6e 74 20 28 74 32 2e 62 29 20 68 61  traint (t2.b) ha
15970 73 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c  s NONE affinity,
15980 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f  .** no conversio
15990 6e 20 73 68 6f 75 6c 64 20 62 65 20 61 74 74 65  n should be atte
159a0 6d 70 74 65 64 20 62 65 66 6f 72 65 20 75 73 69  mpted before usi
159b0 6e 67 20 61 20 74 32 2e 62 20 76 61 6c 75 65 20  ng a t2.b value 
159c0 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20  as part of.** a 
159d0 6b 65 79 20 74 6f 20 73 65 61 72 63 68 20 74 68  key to search th
159e0 65 20 69 6e 64 65 78 2e 20 48 65 6e 63 65 20 74  e index. Hence t
159f0 68 65 20 66 69 72 73 74 20 62 79 74 65 20 69 6e  he first byte in
15a00 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 66   the returned af
15a10 66 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67  finity.** string
15a20 20 69 6e 20 74 68 69 73 20 65 78 61 6d 70 6c 65   in this example
15a30 20 77 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f   would be set to
15a40 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
15a50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15a60 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54  codeAllEqualityT
15a70 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70  erms(.  Parse *p
15a80 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
15a90 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
15aa0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
15ab0 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57   *pLevel,   /* W
15ac0 68 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70  hich nested loop
15ad0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20   of the FROM we 
15ae0 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  are coding */.  
15af0 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20  int bRev,       
15b00 20 20 20 20 20 20 2f 2a 20 52 65 76 65 72 73 65        /* Reverse
15b10 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e   the order of IN
15b20 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
15b30 69 6e 74 20 6e 45 78 74 72 61 52 65 67 2c 20 20  int nExtraReg,  
15b40 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15b50 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65  of extra registe
15b60 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
15b70 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41 66 66  /.  char **pzAff
15b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
15b90 3a 20 53 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  : Set to point t
15ba0 6f 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  o affinity strin
15bb0 67 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 45  g */.){.  u16 nE
15bc0 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
15bd0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
15be0 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
15bf0 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  N constraints to
15c00 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6e   code */.  u16 n
15c10 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20 20 20  Skip;           
15c20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
15c30 65 72 20 6f 66 20 6c 65 66 74 2d 6d 6f 73 74 20  er of left-most 
15c40 63 6f 6c 75 6d 6e 73 20 74 6f 20 73 6b 69 70 20  columns to skip 
15c50 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
15c60 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
15c70 20 20 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64     /* The vm und
15c80 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
15c90 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
15ca0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15cb0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
15cc0 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74  being used for t
15cd0 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68  his loop */.  Wh
15ce0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
15cf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
15d00 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69   single constrai
15d10 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65  nt term */.  Whe
15d20 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20  reLoop *pLoop;  
15d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15d40 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
15d50 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  ct */.  int j;  
15d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d70 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
15d80 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
15d90 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20  egBase;         
15da0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65           /* Base
15db0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
15dc0 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20  nt nReg;        
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15de0 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74  Number of regist
15df0 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ers to allocate 
15e00 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 3b  */.  char *zAff;
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73     /* Affinity s
15e30 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20  tring to return 
15e40 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f  */..  /* This mo
15e50 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  dule is only cal
15e60 6c 65 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61  led on query pla
15e70 6e 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 69  ns that use an i
15e80 6e 64 65 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70  ndex. */.  pLoop
15e90 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
15ea0 70 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c  p;.  assert( (pL
15eb0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
15ec0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
15ed0 45 29 3d 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d  E)==0 );.  nEq =
15ee0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
15ef0 6e 45 71 3b 0a 20 20 6e 53 6b 69 70 20 3d 20 70  nEq;.  nSkip = p
15f00 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53  Loop->u.btree.nS
15f10 6b 69 70 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c  kip;.  pIdx = pL
15f20 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
15f30 64 65 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dex;.  assert( p
15f40 49 64 78 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Idx!=0 );..  /* 
15f50 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
15f60 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  any memory cells
15f70 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68   we will need th
15f80 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d  en allocate them
15f90 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65  ..  */.  regBase
15fa0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
15fb0 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c  + 1;.  nReg = pL
15fc0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
15fd0 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20   + nExtraReg;.  
15fe0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
15ff0 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20  nReg;..  zAff = 
16000 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
16010 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69  pParse->db, sqli
16020 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
16030 53 74 72 28 76 2c 20 70 49 64 78 29 29 3b 0a 20  Str(v, pIdx));. 
16040 20 69 66 28 20 21 7a 41 66 66 20 29 7b 0a 20 20   if( !zAff ){.  
16050 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61    pParse->db->ma
16060 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
16070 20 20 7d 0a 0a 20 20 69 66 28 20 6e 53 6b 69 70    }..  if( nSkip
16080 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 64 78   ){.    int iIdx
16090 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  Cur = pLevel->iI
160a0 64 78 43 75 72 3b 0a 20 20 20 20 73 71 6c 69 74  dxCur;.    sqlit
160b0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
160c0 28 62 52 65 76 3f 4f 50 5f 4c 61 73 74 3a 4f 50  (bRev?OP_Last:OP
160d0 5f 52 65 77 69 6e 64 29 2c 20 69 49 64 78 43 75  _Rewind), iIdxCu
160e0 72 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  r);.    VdbeComm
160f0 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 73  ent((v, "begin s
16100 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c  kip-scan on %s",
16110 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a   pIdx->zName));.
16120 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 56      j = sqlite3V
16130 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
16140 47 6f 74 6f 29 3b 0a 20 20 20 20 70 4c 65 76 65  Goto);.    pLeve
16150 6c 2d 3e 61 64 64 72 53 6b 69 70 20 3d 20 73 71  l->addrSkip = sq
16160 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
16170 6e 74 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f 53  nt(v, (bRev?OP_S
16180 65 65 6b 4c 74 3a 4f 50 5f 53 65 65 6b 47 74 29  eekLt:OP_SeekGt)
16190 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 49                iI
161b0 64 78 43 75 72 2c 20 30 2c 20 72 65 67 42 61 73  dxCur, 0, regBas
161c0 65 2c 20 6e 53 6b 69 70 29 3b 0a 20 20 20 20 73  e, nSkip);.    s
161d0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
161e0 72 65 28 76 2c 20 6a 29 3b 0a 20 20 20 20 66 6f  re(v, j);.    fo
161f0 72 28 6a 3d 30 3b 20 6a 3c 6e 53 6b 69 70 3b 20  r(j=0; j<nSkip; 
16200 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  j++){.      sqli
16210 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16220 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78   OP_Column, iIdx
16230 43 75 72 2c 20 6a 2c 20 72 65 67 42 61 73 65 2b  Cur, j, regBase+
16240 6a 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  j);.      assert
16250 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
16260 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  [j]>=0 );.      
16270 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
16280 22 25 73 22 2c 20 70 49 64 78 2d 3e 70 54 61 62  "%s", pIdx->pTab
16290 6c 65 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61  le->aCol[pIdx->a
162a0 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d  iColumn[j]].zNam
162b0 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20  e));.    }.  }  
162c0 20 20 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74    ..  /* Evaluat
162d0 65 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63  e the equality c
162e0 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a  onstraints.  */.
162f0 20 20 61 73 73 65 72 74 28 20 7a 41 66 66 3d 3d    assert( zAff==
16300 30 20 7c 7c 20 28 69 6e 74 29 73 74 72 6c 65 6e  0 || (int)strlen
16310 28 7a 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20  (zAff)>=nEq );. 
16320 20 66 6f 72 28 6a 3d 6e 53 6b 69 70 3b 20 6a 3c   for(j=nSkip; j<
16330 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  nEq; j++){.    i
16340 6e 74 20 72 31 3b 0a 20 20 20 20 70 54 65 72 6d  nt r1;.    pTerm
16350 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
16360 5b 6a 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [j];.    assert(
16370 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
16380 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
16390 67 20 74 65 73 74 63 61 73 65 20 69 73 20 74 72  g testcase is tr
163a0 75 65 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77  ue for indices w
163b0 69 74 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f  ith redundant co
163c0 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45  lumns. .    ** E
163d0 78 3a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  x: CREATE INDEX 
163e0 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b  i1 ON t1(a,b,a);
163f0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
16400 31 20 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20  1 WHERE a=0 AND 
16410 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74  b=0; */.    test
16420 63 61 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74  case( (pTerm->wt
16430 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
16440 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  ED)!=0 );.    te
16450 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
16460 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
16470 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 72 31 20  RTUAL );.    r1 
16480 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65  = codeEqualityTe
16490 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
164a0 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65  , pLevel, j, bRe
164b0 76 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  v, regBase+j);. 
164c0 20 20 20 69 66 28 20 72 31 21 3d 72 65 67 42 61     if( r1!=regBa
164d0 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66  se+j ){.      if
164e0 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20  ( nReg==1 ){.   
164f0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
16500 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
16510 65 2c 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20  e, regBase);.   
16520 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72       regBase = r
16530 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
16540 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16550 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16560 53 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61  SCopy, r1, regBa
16570 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20  se+j);.      }. 
16580 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
16590 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
165a0 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  tor & WO_ISNULL 
165b0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
165c0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
165d0 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
165e0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
165f0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e  erator & (WO_ISN
16600 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29  ULL|WO_IN))==0 )
16610 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
16620 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45  ight = pTerm->pE
16630 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
16640 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
16650 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20  deIsNullJump(v, 
16660 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
16670 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  j, pLevel->addrB
16680 72 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  rk);.      if( z
16690 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
166a0 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
166b0 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
166c0 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49  , zAff[j])==SQLI
166d0 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
166e0 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d           zAff[j]
166f0 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
16700 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
16710 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
16720 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
16730 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68  nityChange(pRigh
16740 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20  t, zAff[j]) ){. 
16750 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d           zAff[j]
16760 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
16770 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
16780 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
16790 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b    *pzAff = zAff;
167a0 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73  .  return regBas
167b0 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  e;.}..#ifndef SQ
167c0 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
167d0 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  N./*.** This rou
167e0 74 69 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72  tine is a helper
167f0 20 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65   for explainInde
16800 78 52 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a  xRange() below.*
16810 2a 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20  *.** pStr holds 
16820 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65  the text of an e
16830 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77  xpression that w
16840 65 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75  e are building u
16850 70 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74  p one term.** at
16860 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72   a time.  This r
16870 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65  outine adds a ne
16880 77 20 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e  w term to the en
16890 64 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  d of the express
168a0 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72  ion..** Terms ar
168b0 65 20 73 65 70 61 72 61 74 65 64 20 62 79 20 41  e separated by A
168c0 4e 44 20 73 6f 20 61 64 64 20 74 68 65 20 22 41  ND so add the "A
168d0 4e 44 22 20 74 65 78 74 20 66 6f 72 20 73 65 63  ND" text for sec
168e0 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  ond and subseque
168f0 6e 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79  nt.** terms only
16900 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
16910 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
16920 72 6d 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a  rm(.  StrAccum *
16930 70 53 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  pStr,           
16940 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78    /* The text ex
16950 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62  pression being b
16960 75 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54  uilt */.  int iT
16970 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
16980 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
16990 66 20 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69  f this term.  Fi
169a0 72 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20  rst is zero */. 
169b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
169c0 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  lumn,        /* 
169d0 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
169e0 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  mn */.  const ch
169f0 61 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20  ar *zOp         
16a00 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
16a10 68 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29  he operator */.)
16a20 7b 0a 20 20 69 66 28 20 69 54 65 72 6d 20 29 20  {.  if( iTerm ) 
16a30 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
16a40 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e  ppend(pStr, " AN
16a50 44 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74  D ", 5);.  sqlit
16a60 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
16a70 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20  (pStr, zColumn, 
16a80 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74  -1);.  sqlite3St
16a90 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
16aa0 72 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71  r, zOp, 1);.  sq
16ab0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
16ac0 65 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c 20 31  end(pStr, "?", 1
16ad0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  );.}../*.** Argu
16ae0 6d 65 6e 74 20 70 4c 65 76 65 6c 20 64 65 73 63  ment pLevel desc
16af0 72 69 62 65 73 20 61 20 73 74 72 61 74 65 67 79  ribes a strategy
16b00 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 61   for scanning ta
16b10 62 6c 65 20 70 54 61 62 2e 20 54 68 69 73 20 0a  ble pTab. This .
16b20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
16b30 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
16b40 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
16b50 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64 65   containing a de
16b60 73 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20  scription.** of 
16b70 74 68 65 20 73 75 62 73 65 74 20 6f 66 20 74 61  the subset of ta
16b80 62 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e 65 64  ble rows scanned
16b90 20 62 79 20 74 68 65 20 73 74 72 61 74 65 67 79   by the strategy
16ba0 20 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20   in the form of 
16bb0 61 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73  an.** SQL expres
16bc0 73 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c  sion. Or, if all
16bd0 20 72 6f 77 73 20 61 72 65 20 73 63 61 6e 6e 65   rows are scanne
16be0 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  d, NULL is retur
16bf0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ned..**.** For e
16c00 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71  xample, if the q
16c10 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  uery:.**.**   SE
16c20 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
16c30 48 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32  HERE a=1 AND b>2
16c40 3b 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61  ;.**.** is run a
16c50 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 69  nd there is an i
16c60 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20  ndex on (a, b), 
16c70 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
16c80 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20  on returns a.** 
16c90 73 74 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74  string similar t
16ca0 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20  o:.**.**   "a=? 
16cb0 41 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54  AND b>?".**.** T
16cc0 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e  he returned poin
16cd0 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65  ter points to me
16ce0 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
16cf0 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  om sqlite3DbMall
16d00 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74  oc()..** It is t
16d10 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
16d20 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
16d30 74 6f 20 66 72 65 65 20 74 68 65 20 62 75 66 66  to free the buff
16d40 65 72 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a  er when it is.**
16d50 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69   no longer requi
16d60 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  red..*/.static c
16d70 68 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65  har *explainInde
16d80 78 52 61 6e 67 65 28 73 71 6c 69 74 65 33 20 2a  xRange(sqlite3 *
16d90 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
16da0 4c 6f 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54 61  Loop, Table *pTa
16db0 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  b){.  Index *pIn
16dc0 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  dex = pLoop->u.b
16dd0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 75  tree.pIndex;.  u
16de0 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  16 nEq = pLoop->
16df0 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 75  u.btree.nEq;.  u
16e00 31 36 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70  16 nSkip = pLoop
16e10 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3b  ->u.btree.nSkip;
16e20 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43  .  int i, j;.  C
16e30 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54  olumn *aCol = pT
16e40 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69 31 36 20  ab->aCol;.  i16 
16e50 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64  *aiColumn = pInd
16e60 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20  ex->aiColumn;.  
16e70 53 74 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a 20  StrAccum txt;.. 
16e80 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 28   if( nEq==0 && (
16e90 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
16ea0 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49   (WHERE_BTM_LIMI
16eb0 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  T|WHERE_TOP_LIMI
16ec0 54 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  T))==0 ){.    re
16ed0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
16ee0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
16ef0 74 28 26 74 78 74 2c 20 30 2c 20 30 2c 20 53 51  t(&txt, 0, 0, SQ
16f00 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29  LITE_MAX_LENGTH)
16f10 3b 0a 20 20 74 78 74 2e 64 62 20 3d 20 64 62 3b  ;.  txt.db = db;
16f20 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
16f30 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22  umAppend(&txt, "
16f40 20 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28 69   (", 2);.  for(i
16f50 3d 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b  =0; i<nEq; i++){
16f60 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28  .    char *z = (
16f70 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  i==pIndex->nKeyC
16f80 6f 6c 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a  ol ) ? "rowid" :
16f90 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69   aCol[aiColumn[i
16fa0 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  ]].zName;.    if
16fb0 28 20 69 3e 3d 6e 53 6b 69 70 20 29 7b 0a 20 20  ( i>=nSkip ){.  
16fc0 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e      explainAppen
16fd0 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a  dTerm(&txt, i, z
16fe0 2c 20 22 3d 22 29 3b 0a 20 20 20 20 7d 65 6c 73  , "=");.    }els
16ff0 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 20 29  e{.      if( i )
17000 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
17010 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20 41  Append(&txt, " A
17020 4e 44 20 22 2c 20 35 29 3b 0a 20 20 20 20 20 20  ND ", 5);.      
17030 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
17040 70 70 65 6e 64 28 26 74 78 74 2c 20 22 41 4e 59  ppend(&txt, "ANY
17050 28 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 73 71  (", 4);.      sq
17060 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
17070 65 6e 64 28 26 74 78 74 2c 20 7a 2c 20 2d 31 29  end(&txt, z, -1)
17080 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
17090 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74  trAccumAppend(&t
170a0 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 20  xt, ")", 1);.   
170b0 20 7d 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b   }.  }..  j = i;
170c0 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  .  if( pLoop->ws
170d0 46 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f  Flags&WHERE_BTM_
170e0 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61  LIMIT ){.    cha
170f0 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65  r *z = (j==pInde
17100 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 3f 20 22  x->nKeyCol ) ? "
17110 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69  rowid" : aCol[ai
17120 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65  Column[j]].zName
17130 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70  ;.    explainApp
17140 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2b  endTerm(&txt, i+
17150 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a  +, z, ">");.  }.
17160 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
17170 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c  lags&WHERE_TOP_L
17180 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72  IMIT ){.    char
17190 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78   *z = (j==pIndex
171a0 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 3f 20 22 72  ->nKeyCol ) ? "r
171b0 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43  owid" : aCol[aiC
171c0 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b  olumn[j]].zName;
171d0 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65  .    explainAppe
171e0 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20  ndTerm(&txt, i, 
171f0 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73  z, "<");.  }.  s
17200 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
17210 70 65 6e 64 28 26 74 78 74 2c 20 22 29 22 2c 20  pend(&txt, ")", 
17220 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  1);.  return sql
17230 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
17240 73 68 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a  sh(&txt);.}../*.
17250 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17260 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
17270 73 73 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f  ss currently pro
17280 63 65 73 73 69 6e 67 20 61 6e 20 45 58 50 4c 41  cessing an EXPLA
17290 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a  IN QUERY PLAN.**
172a0 20 63 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65   command. If the
172b0 20 71 75 65 72 79 20 62 65 69 6e 67 20 63 6f 6d   query being com
172c0 70 69 6c 65 64 20 69 73 20 61 6e 20 45 58 50 4c  piled is an EXPL
172d0 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2c 20  AIN QUERY PLAN, 
172e0 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f  a single.** reco
172f0 72 64 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  rd is added to t
17300 68 65 20 6f 75 74 70 75 74 20 74 6f 20 64 65 73  he output to des
17310 63 72 69 62 65 20 74 68 65 20 74 61 62 6c 65 20  cribe the table 
17320 73 63 61 6e 20 73 74 72 61 74 65 67 79 20 69 6e  scan strategy in
17330 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a   .** pLevel..*/.
17340 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
17350 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61  ainOneScan(.  Pa
17360 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
17370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17380 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
17390 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
173a0 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  bList,          
173b0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73      /* Table lis
173c0 74 20 74 68 69 73 20 6c 6f 6f 70 20 72 65 66 65  t this loop refe
173d0 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65  rs to */.  Where
173e0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20  Level *pLevel,  
173f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63             /* Sc
17400 61 6e 20 74 6f 20 77 72 69 74 65 20 4f 50 5f 45  an to write OP_E
17410 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f  xplain opcode fo
17420 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  r */.  int iLeve
17430 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
17440 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
17450 66 6f 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75  for "level" colu
17460 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a  mn of output */.
17470 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20    int iFrom,    
17480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17490 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22    /* Value for "
174a0 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  from" column of 
174b0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75 31 36 20  output */.  u16 
174c0 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20  wctrlFlags      
174d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
174e0 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 73  lags passed to s
174f0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
17500 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  () */.){.#ifndef
17510 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
17520 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
17530 61 69 6e 3d 3d 32 20 29 0a 23 65 6e 64 69 66 0a  ain==2 ).#endif.
17540 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53    {.    struct S
17550 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
17560 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
17570 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
17580 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
17590 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
175a0 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20      /* VM being 
175b0 63 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a 20  constructed */. 
175c0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
175d0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
175e0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
175f0 64 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  dle */.    char 
17600 2a 7a 4d 73 67 3b 20 20 20 20 20 20 20 20 20 20  *zMsg;          
17610 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
17620 20 74 6f 20 61 64 64 20 74 6f 20 45 51 50 20 6f   to add to EQP o
17630 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74  utput */.    int
17640 20 69 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69   iId = pParse->i
17650 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65  SelectId;  /* Se
17660 6c 65 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f  lect id (left-mo
17670 73 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e  st output column
17680 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53  ) */.    int isS
17690 65 61 72 63 68 3b 20 20 20 20 20 20 20 20 20 20  earch;          
176a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
176b0 6f 72 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c  or a SEARCH. Fal
176c0 73 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a  se for SCAN. */.
176d0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
176e0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
176f0 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f 6c    /* The control
17700 6c 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 6f  ling WhereLoop o
17710 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 75 33 32  bject */.    u32
17720 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20   flags;         
17730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
17740 61 67 73 20 74 68 61 74 20 64 65 73 63 72 69 62  ags that describ
17750 65 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 0a  e this loop */..
17760 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
17770 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
17780 66 6c 61 67 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77  flags = pLoop->w
17790 73 46 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20  sFlags;.    if( 
177a0 28 66 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c  (flags&WHERE_MUL
177b0 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c  TI_OR) || (wctrl
177c0 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54  Flags&WHERE_ONET
177d0 41 42 4c 45 5f 4f 4e 4c 59 29 20 29 20 72 65 74  ABLE_ONLY) ) ret
177e0 75 72 6e 3b 0a 0a 20 20 20 20 69 73 53 65 61 72  urn;..    isSear
177f0 63 68 20 3d 20 28 66 6c 61 67 73 26 28 57 48 45  ch = (flags&(WHE
17800 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45  RE_BTM_LIMIT|WHE
17810 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d  RE_TOP_LIMIT))!=
17820 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0.            ||
17830 20 28 28 66 6c 61 67 73 26 57 48 45 52 45 5f 56   ((flags&WHERE_V
17840 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
17850 26 26 20 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  && (pLoop->u.btr
17860 65 65 2e 6e 45 71 3e 30 29 29 0a 20 20 20 20 20  ee.nEq>0)).     
17870 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c         || (wctrl
17880 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f 52 44  Flags&(WHERE_ORD
17890 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f  ERBY_MIN|WHERE_O
178a0 52 44 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a 20  RDERBY_MAX));.. 
178b0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
178c0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
178d0 22 2c 20 69 73 53 65 61 72 63 68 3f 22 53 45 41  ", isSearch?"SEA
178e0 52 43 48 22 3a 22 53 43 41 4e 22 29 3b 0a 20 20  RCH":"SCAN");.  
178f0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
17900 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 4d  lect ){.      zM
17910 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
17920 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
17930 25 73 20 53 55 42 51 55 45 52 59 20 25 64 22 2c  %s SUBQUERY %d",
17940 20 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e 69 53 65   zMsg,pItem->iSe
17950 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 7d 65 6c  lectId);.    }el
17960 73 65 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d  se{.      zMsg =
17970 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
17980 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 54  (db, zMsg, "%s T
17990 41 42 4c 45 20 25 73 22 2c 20 7a 4d 73 67 2c 20  ABLE %s", zMsg, 
179a0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
179b0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49     }..    if( pI
179c0 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
179d0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
179e0 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
179f0 7a 4d 73 67 2c 20 22 25 73 20 41 53 20 25 73 22  zMsg, "%s AS %s"
17a00 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a  , zMsg, pItem->z
17a10 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20  Alias);.    }.  
17a20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28    if( (flags & (
17a30 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f  WHERE_IPK|WHERE_
17a40 56 49 52 54 55 41 4c 54 41 42 4c 45 29 29 3d 3d  VIRTUALTABLE))==
17a50 30 0a 20 20 20 20 20 26 26 20 41 4c 57 41 59 53  0.     && ALWAYS
17a60 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  (pLoop->u.btree.
17a70 70 49 6e 64 65 78 21 3d 30 29 0a 20 20 20 20 29  pIndex!=0).    )
17a80 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57  {.      char *zW
17a90 68 65 72 65 20 3d 20 65 78 70 6c 61 69 6e 49 6e  here = explainIn
17aa0 64 65 78 52 61 6e 67 65 28 64 62 2c 20 70 4c 6f  dexRange(db, pLo
17ab0 6f 70 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29  op, pItem->pTab)
17ac0 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  ;.      zMsg = s
17ad0 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
17ae0 62 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20  b, zMsg,.       
17af0 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20          ((flags 
17b00 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
17b10 45 58 29 20 3f 20 0a 20 20 20 20 20 20 20 20 20  EX) ? .         
17b20 20 20 20 20 20 20 20 20 20 20 22 25 73 20 55 53            "%s US
17b30 49 4e 47 20 41 55 54 4f 4d 41 54 49 43 20 25 73  ING AUTOMATIC %s
17b40 49 4e 44 45 58 25 2e 30 73 25 73 22 20 3a 0a 20  INDEX%.0s%s" :. 
17b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b60 20 20 22 25 73 20 55 53 49 4e 47 20 25 73 49 4e    "%s USING %sIN
17b70 44 45 58 20 25 73 25 73 22 29 2c 20 0a 20 20 20  DEX %s%s"), .   
17b80 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d 73 67              zMsg
17b90 2c 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52  , ((flags & WHER
17ba0 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 3f 20 22 43  E_IDX_ONLY) ? "C
17bb0 4f 56 45 52 49 4e 47 20 22 20 3a 20 22 22 29 2c  OVERING " : ""),
17bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17bd0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
17be0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 57  Index->zName, zW
17bf0 68 65 72 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  here);.      sql
17c00 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
17c10 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Where);.    }els
17c20 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57  e if( (flags & W
17c30 48 45 52 45 5f 49 50 4b 29 21 3d 30 20 26 26 20  HERE_IPK)!=0 && 
17c40 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  (flags & WHERE_C
17c50 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30 20 29 7b  ONSTRAINT)!=0 ){
17c60 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
17c70 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
17c80 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e  , zMsg, "%s USIN
17c90 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  G INTEGER PRIMAR
17ca0 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 0a  Y KEY", zMsg);..
17cb0 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 26        if( flags&
17cc0 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51  (WHERE_COLUMN_EQ
17cd0 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e  |WHERE_COLUMN_IN
17ce0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  ) ){.        zMs
17cf0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
17d00 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
17d10 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c 20 7a 4d  s (rowid=?)", zM
17d20 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sg);.      }else
17d30 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52   if( (flags&WHER
17d40 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d 57  E_BOTH_LIMIT)==W
17d50 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20  HERE_BOTH_LIMIT 
17d60 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
17d70 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
17d80 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
17d90 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20 72 6f 77  (rowid>? AND row
17da0 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id<?)", zMsg);. 
17db0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
17dc0 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c  lags&WHERE_BTM_L
17dd0 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20  IMIT ){.        
17de0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
17df0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
17e00 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 29 22 2c   "%s (rowid>?)",
17e10 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65   zMsg);.      }e
17e20 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 66  lse if( ALWAYS(f
17e30 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c  lags&WHERE_TOP_L
17e40 49 4d 49 54 29 20 29 7b 0a 20 20 20 20 20 20 20  IMIT) ){.       
17e50 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
17e60 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
17e70 2c 20 22 25 73 20 28 72 6f 77 69 64 3c 3f 29 22  , "%s (rowid<?)"
17e80 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
17e90 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
17ea0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
17eb0 41 4c 54 41 42 4c 45 0a 20 20 20 20 65 6c 73 65  ALTABLE.    else
17ec0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48   if( (flags & WH
17ed0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
17ee0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d  )!=0 ){.      zM
17ef0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
17f00 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
17f10 25 73 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  %s VIRTUAL TABLE
17f20 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 20 7a   INDEX %d:%s", z
17f30 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Msg,.           
17f40 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e         pLoop->u.
17f50 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 4c 6f  vtab.idxNum, pLo
17f60 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  op->u.vtab.idxSt
17f70 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  r);.    }.#endif
17f80 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
17f90 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
17fa0 7a 4d 73 67 2c 20 22 25 73 22 2c 20 7a 4d 73 67  zMsg, "%s", zMsg
17fb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
17fc0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
17fd0 78 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65  xplain, iId, iLe
17fe0 76 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67  vel, iFrom, zMsg
17ff0 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
18000 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
18010 69 6e 65 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63  ine explainOneSc
18020 61 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a  an(u,v,w,x,y,z).
18030 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
18040 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f  _OMIT_EXPLAIN */
18050 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
18060 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73  e code for the s
18070 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c 65 76  tart of the iLev
18080 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68  el-th loop in th
18090 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a  e WHERE clause.*
180a0 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
180b0 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70 57   described by pW
180c0 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Info..*/.static 
180d0 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c  Bitmask codeOneL
180e0 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68 65 72  oopStart(.  Wher
180f0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20  eInfo *pWInfo,  
18100 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66   /* Complete inf
18110 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
18120 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
18130 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
18140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69            /* Whi
18150 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e  ch level of pWIn
18160 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62  fo->a[] should b
18170 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 42 69 74  e coded */.  Bit
18180 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20  mask notReady   
18190 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62 6c 65    /* Which table
181a0 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  s are currently 
181b0 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a  available */.){.
181c0 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20    int j, k;     
181d0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
181e0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
181f0 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
18200 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75    /* The VDBE cu
18210 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62  rsor for the tab
18220 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  le */.  int addr
18230 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Nxt;         /* 
18240 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f  Where to jump to
18250 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74   continue with t
18260 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20  he next IN case 
18270 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61 62  */.  int omitTab
18280 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  le;       /* Tru
18290 65 20 69 66 20 77 65 20 75 73 65 20 74 68 65 20  e if we use the 
182a0 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20  index only */.  
182b0 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20  int bRev;       
182c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
182d0 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20  we need to scan 
182e0 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
182f0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
18300 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68   *pLevel;  /* Th
18310 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20 74 6f  e where level to
18320 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57   be coded */.  W
18330 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
18340 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
18350 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62 65 69 6e  Loop object bein
18360 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65  g coded */.  Whe
18370 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
18380 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69    /* Decompositi
18390 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  on of the entire
183a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
183b0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
183c0 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
183d0 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63 6c     /* A WHERE cl
183e0 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50  ause term */.  P
183f0 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
18400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18410 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
18420 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
18430 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
18440 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
18450 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
18460 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
18470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18480 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
18490 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f  ed stmt under co
184a0 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20  nstructions */. 
184b0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
184c0 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20  item *pTabItem; 
184d0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
184e0 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64  term being coded
184f0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72   */.  int addrBr
18500 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
18510 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
18520 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
18530 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
18540 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20   int addrCont;  
18550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18560 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
18570 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
18580 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  ext cycle */.  i
18590 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30  nt iRowidReg = 0
185a0 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ;        /* Rowi
185b0 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  d is stored in t
185c0 68 69 73 20 72 65 67 69 73 74 65 72 2c 20 69 66  his register, if
185d0 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69   not zero */.  i
185e0 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d  nt iReleaseReg =
185f0 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70   0;      /* Temp
18600 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65   register to fre
18610 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
18620 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20  ng */..  pParse 
18630 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
18640 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  v = pParse->
18650 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 26  pVdbe;.  pWC = &
18660 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 64  pWInfo->sWC;.  d
18670 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
18680 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
18690 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20  fo->a[iLevel];. 
186a0 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
186b0 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54 61 62 49  >pWLoop;.  pTabI
186c0 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70  tem = &pWInfo->p
186d0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
186e0 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75  l->iFrom];.  iCu
186f0 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
18700 75 72 73 6f 72 3b 0a 20 20 70 4c 65 76 65 6c 2d  ursor;.  pLevel-
18710 3e 6e 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74 52  >notReady = notR
18720 65 61 64 79 20 26 20 7e 67 65 74 4d 61 73 6b 28  eady & ~getMask(
18730 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
18740 74 2c 20 69 43 75 72 29 3b 0a 20 20 62 52 65 76  t, iCur);.  bRev
18750 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76 4d   = (pWInfo->revM
18760 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b 0a  ask>>iLevel)&1;.
18770 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70    omitTable = (p
18780 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
18790 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21  WHERE_IDX_ONLY)!
187a0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 26  =0 .           &
187b0 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
187c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f  Flags & WHERE_FO
187d0 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 20  RCE_TABLE)==0;. 
187e0 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
187f0 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48  nt((v, "Begin WH
18800 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c  ERE-loop%d: %s",
18810 69 4c 65 76 65 6c 2c 70 54 61 62 49 74 65 6d 2d  iLevel,pTabItem-
18820 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
18830 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62  .  /* Create lab
18840 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72 65  els for the "bre
18850 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75  ak" and "continu
18860 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a  e" instructions.
18870 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72    ** for the cur
18880 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70  rent loop.  Jump
18890 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62   to addrBrk to b
188a0 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f  reak out of a lo
188b0 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f  op..  ** Jump to
188c0 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65   cont to go imme
188d0 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e  diately to the n
188e0 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
188f0 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a   the.  ** loop..
18900 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74    **.  ** When t
18910 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70  here is an IN op
18920 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20  erator, we also 
18930 68 61 76 65 20 61 20 22 61 64 64 72 4e 78 74 22  have a "addrNxt"
18940 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a   label that.  **
18950 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e   means to contin
18960 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74  ue with the next
18970 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e   IN value combin
18980 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a  ation.  When.  *
18990 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49  * there are no I
189a0 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74  N operators in t
189b0 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  he constraints, 
189c0 74 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61  the "addrNxt" la
189d0 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  bel.  ** is the 
189e0 73 61 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b  same as "addrBrk
189f0 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72  "..  */.  addrBr
18a00 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
18a10 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Brk = pLevel->ad
18a20 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56  drNxt = sqlite3V
18a30 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
18a40 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c  .  addrCont = pL
18a50 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d  evel->addrCont =
18a60 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
18a70 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
18a80 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72  If this is the r
18a90 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20  ight table of a 
18aa0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c  LEFT OUTER JOIN,
18ab0 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20   allocate and.  
18ac0 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** initialize a 
18ad0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74  memory cell that
18ae0 20 72 65 63 6f 72 64 73 20 69 66 20 74 68 69 73   records if this
18af0 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61   table matches a
18b00 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74  ny.  ** row of t
18b10 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66  he left table of
18b20 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a   the join..  */.
18b30 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46    if( pLevel->iF
18b40 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74  rom>0 && (pTabIt
18b50 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  em[0].jointype &
18b60 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a   JT_LEFT)!=0 ){.
18b70 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66      pLevel->iLef
18b80 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65  tJoin = ++pParse
18b90 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
18ba0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18bb0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
18bc0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
18bd0 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  n);.    VdbeComm
18be0 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45  ent((v, "init LE
18bf0 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68  FT JOIN no-match
18c00 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20   flag"));.  }.. 
18c10 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
18c20 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
18c30 65 20 73 75 62 71 75 65 72 79 20 69 6d 70 6c 65  e subquery imple
18c40 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72  mented as a co-r
18c50 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20  outine */.  if( 
18c60 70 54 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72  pTabItem->viaCor
18c70 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e  outine ){.    in
18c80 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61  t regYield = pTa
18c90 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  bItem->regReturn
18ca0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
18cb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
18cc0 74 65 67 65 72 2c 20 70 54 61 62 49 74 65 6d 2d  teger, pTabItem-
18cd0 3e 61 64 64 72 46 69 6c 6c 53 75 62 2d 31 2c 20  >addrFillSub-1, 
18ce0 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 70  regYield);.    p
18cf0 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 20 73 71 6c  Level->p2 =  sql
18d00 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
18d10 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59  , OP_Yield, regY
18d20 69 65 6c 64 29 3b 0a 20 20 20 20 56 64 62 65 43  ield);.    VdbeC
18d30 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74  omment((v, "next
18d40 20 72 6f 77 20 6f 66 20 63 6f 2d 72 6f 75 74 69   row of co-routi
18d50 6e 65 20 25 73 22 2c 20 70 54 61 62 49 74 65 6d  ne %s", pTabItem
18d60 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
18d70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18d80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
18d90 20 72 65 67 59 69 65 6c 64 2b 31 2c 20 61 64 64   regYield+1, add
18da0 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65  rBrk);.    pLeve
18db0 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b  l->op = OP_Goto;
18dc0 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
18dd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
18de0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
18df0 20 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67    (pLoop->wsFlag
18e00 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
18e10 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
18e20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 54 68    /* Case 1:  Th
18e30 65 20 74 61 62 6c 65 20 69 73 20 61 20 76 69 72  e table is a vir
18e40 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65  tual-table.  Use
18e50 20 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64   the VFilter and
18e60 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20   VNext.    **   
18e70 20 20 20 20 20 20 20 74 6f 20 61 63 63 65 73 73         to access
18e80 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a   the data..    *
18e90 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20  /.    int iReg; 
18ea0 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f    /* P3 Value fo
18eb0 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a  r OP_VFilter */.
18ec0 20 20 20 20 69 6e 74 20 61 64 64 72 4e 6f 74 46      int addrNotF
18ed0 6f 75 6e 64 3b 0a 20 20 20 20 69 6e 74 20 6e 43  ound;.    int nC
18ee0 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 4c 6f 6f  onstraint = pLoo
18ef0 70 2d 3e 6e 4c 54 65 72 6d 3b 0a 0a 20 20 20 20  p->nLTerm;..    
18f00 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
18f10 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
18f20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
18f30 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
18f40 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  rse, nConstraint
18f50 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 4e 6f 74  +2);.    addrNot
18f60 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e  Found = pLevel->
18f70 61 64 64 72 42 72 6b 3b 0a 20 20 20 20 66 6f 72  addrBrk;.    for
18f80 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61  (j=0; j<nConstra
18f90 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  int; j++){.     
18fa0 20 69 6e 74 20 69 54 61 72 67 65 74 20 3d 20 69   int iTarget = i
18fb0 52 65 67 2b 6a 2b 32 3b 0a 20 20 20 20 20 20 70  Reg+j+2;.      p
18fc0 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  Term = pLoop->aL
18fd0 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  Term[j];.      i
18fe0 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f  f( pTerm==0 ) co
18ff0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
19000 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
19010 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20  or & WO_IN ){.  
19020 20 20 20 20 20 20 63 6f 64 65 45 71 75 61 6c 69        codeEquali
19030 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
19040 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c  Term, pLevel, j,
19050 20 62 52 65 76 2c 20 69 54 61 72 67 65 74 29 3b   bRev, iTarget);
19060 0a 20 20 20 20 20 20 20 20 61 64 64 72 4e 6f 74  .        addrNot
19070 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e  Found = pLevel->
19080 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 20 20 7d  addrNxt;.      }
19090 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
190a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
190b0 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78  arse, pTerm->pEx
190c0 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72  pr->pRight, iTar
190d0 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  get);.      }.  
190e0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
190f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19100 49 6e 74 65 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e  Integer, pLoop->
19110 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 69  u.vtab.idxNum, i
19120 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Reg);.    sqlite
19130 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19140 50 5f 49 6e 74 65 67 65 72 2c 20 6e 43 6f 6e 73  P_Integer, nCons
19150 74 72 61 69 6e 74 2c 20 69 52 65 67 2b 31 29 3b  traint, iReg+1);
19160 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19170 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69  AddOp4(v, OP_VFi
19180 6c 74 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72  lter, iCur, addr
19190 4e 6f 74 46 6f 75 6e 64 2c 20 69 52 65 67 2c 0a  NotFound, iReg,.
191a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191b0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76        pLoop->u.v
191c0 74 61 62 2e 69 64 78 53 74 72 2c 0a 20 20 20 20  tab.idxStr,.    
191d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191e0 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
191f0 6e 65 65 64 46 72 65 65 20 3f 20 50 34 5f 4d 50  needFree ? P4_MP
19200 52 49 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49  RINTF : P4_STATI
19210 43 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  C);.    pLoop->u
19220 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
19230 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   0;.    for(j=0;
19240 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26   j<nConstraint &
19250 26 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20  & j<16; j++){.  
19260 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
19270 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e  u.vtab.omitMask>
19280 3e 6a 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20  >j)&1 ){.       
19290 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
192a0 76 65 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  vel, pLoop->aLTe
192b0 72 6d 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  rm[j]);.      }.
192c0 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
192d0 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b  ->op = OP_VNext;
192e0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
192f0 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76  = iCur;.    pLev
19300 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33  el->p2 = sqlite3
19310 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
19320 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  v);.    sqlite3R
19330 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
19340 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43  pParse, iReg, nC
19350 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20  onstraint+2);.  
19360 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
19370 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
19380 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
19390 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
193a0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
193b0 0a 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77  .  if( (pLoop->w
193c0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
193d0 50 4b 29 21 3d 30 0a 20 20 20 26 26 20 28 70 4c  PK)!=0.   && (pL
193e0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  oop->wsFlags & (
193f0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c  WHERE_COLUMN_IN|
19400 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29  WHERE_COLUMN_EQ)
19410 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  )!=0.  ){.    /*
19420 20 43 61 73 65 20 32 3a 20 20 57 65 20 63 61 6e   Case 2:  We can
19430 20 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65   directly refere
19440 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nce a single row
19450 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
19460 20 20 20 20 20 20 20 20 20 20 65 71 75 61 6c 69            equali
19470 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
19480 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
19490 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a  field.  Or.    *
194a0 2a 20 20 20 20 20 20 20 20 20 20 77 65 20 72 65  *          we re
194b0 66 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65  ference multiple
194c0 20 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72   rows using a "r
194d0 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20  owid IN (...)". 
194e0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63     **          c
194f0 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f  onstruct..    */
19500 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
19510 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d  op->u.btree.nEq=
19520 3d 31 20 29 3b 0a 20 20 20 20 69 52 65 6c 65 61  =1 );.    iRelea
19530 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  seReg = sqlite3G
19540 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
19550 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70  );.    pTerm = p
19560 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b  Loop->aLTerm[0];
19570 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
19580 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  rm!=0 );.    ass
19590 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ert( pTerm->pExp
195a0 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  r!=0 );.    asse
195b0 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
195c0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
195d0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
195e0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
195f0 29 3b 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67  );.    iRowidReg
19600 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54   = codeEqualityT
19610 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
19620 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52  m, pLevel, 0, bR
19630 65 76 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29  ev, iReleaseReg)
19640 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
19650 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
19660 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19670 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
19680 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65  tBeInt, iRowidRe
19690 67 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  g, addrNxt);.   
196a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
196b0 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
196c0 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78  ts, iCur, addrNx
196d0 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  t, iRowidReg);. 
196e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
196f0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
19700 65 28 70 50 61 72 73 65 2c 20 69 52 6f 77 69 64  e(pParse, iRowid
19710 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  Reg, 1);.    sql
19720 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
19730 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
19740 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
19750 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
19760 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
19770 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
19780 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69  _Noop;.  }else i
19790 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
197a0 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21  gs & WHERE_IPK)!
197b0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
197c0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
197d0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
197e0 4e 47 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  NGE)!=0.  ){.   
197f0 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 57 65 20   /* Case 3:  We 
19800 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  have an inequali
19810 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
19820 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
19830 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  field..    */.  
19840 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f    int testOp = O
19850 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  P_Noop;.    int 
19860 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d  start;.    int m
19870 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a  emEndValue = 0;.
19880 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
19890 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20  Start, *pEnd;.. 
198a0 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
198b0 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 6a  able==0 );.    j
198c0 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
198d0 20 3d 20 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20   = pEnd = 0;.   
198e0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
198f0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
19900 4c 49 4d 49 54 20 29 20 70 53 74 61 72 74 20 3d  LIMIT ) pStart =
19910 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
19920 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  ++];.    if( pLo
19930 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
19940 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 20  ERE_TOP_LIMIT ) 
19950 70 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  pEnd = pLoop->aL
19960 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61  Term[j++];.    a
19970 73 73 65 72 74 28 20 70 53 74 61 72 74 21 3d 30  ssert( pStart!=0
19980 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20   || pEnd!=0 );. 
19990 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
199a0 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74       pTerm = pSt
199b0 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72  art;.      pStar
199c0 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  t = pEnd;.      
199d0 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pEnd = pTerm;.  
199e0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61    }.    if( pSta
199f0 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  rt ){.      Expr
19a00 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
19a10 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
19a20 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73  ion that defines
19a30 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64   the start bound
19a40 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31   */.      int r1
19a50 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20  , rTemp;        
19a60 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f 72  /* Registers for
19a70 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61   holding the sta
19a80 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a  rt boundary */..
19a90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
19aa0 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20  lowing constant 
19ab0 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73  maps TK_xx codes
19ac0 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64   into correspond
19ad0 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65  ing .      ** se
19ae0 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20  ek opcodes.  It 
19af0 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72  depends on a par
19b00 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67  ticular ordering
19b10 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20   of TK_xx.      
19b20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  */.      const u
19b30 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a  8 aMoveOp[] = {.
19b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
19b50 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47  _GT */  OP_SeekG
19b60 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,.           /*
19b70 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65   TK_LE */  OP_Se
19b80 65 6b 4c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  ekLe,.          
19b90 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50   /* TK_LT */  OP
19ba0 5f 53 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20 20  _SeekLt,.       
19bb0 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20      /* TK_GE */ 
19bc0 20 4f 50 5f 53 65 65 6b 47 65 0a 20 20 20 20 20   OP_SeekGe.     
19bd0 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   };.      assert
19be0 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31  ( TK_LE==TK_GT+1
19bf0 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65   );      /* Make
19c00 20 73 75 72 65 20 74 68 65 20 6f 72 64 65 72 69   sure the orderi
19c10 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ng.. */.      as
19c20 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f  sert( TK_LT==TK_
19c30 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+2 );      /* 
19c40 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78   ... of the TK_x
19c50 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20  x values... */. 
19c60 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
19c70 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20  GE==TK_GT+3 );  
19c80 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63      /*  ... is c
19c90 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20  orrecct. */..   
19ca0 20 20 20 61 73 73 65 72 74 28 20 28 70 53 74 61     assert( (pSta
19cb0 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
19cc0 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a  RM_VNULL)==0 );.
19cd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19ce0 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  pStart->wtFlags 
19cf0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
19d00 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53 74  ;.      pX = pSt
19d10 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  art->pExpr;.    
19d20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
19d30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
19d40 65 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43  e( pStart->leftC
19d50 75 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f  ursor!=iCur ); /
19d60 2a 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e  * transitive con
19d70 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
19d80 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
19d90 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
19da0 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26  e, pX->pRight, &
19db0 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  rTemp);.      sq
19dc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
19dd0 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f  v, aMoveOp[pX->o
19de0 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20  p-TK_GT], iCur, 
19df0 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20  addrBrk, r1);.  
19e00 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
19e10 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
19e20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
19e30 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
19e40 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b  (pParse, r1, 1);
19e50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
19e60 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
19e70 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20  rse, rTemp);.   
19e80 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
19e90 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a  Level, pStart);.
19ea0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19eb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19ec0 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f  p2(v, bRev ? OP_
19ed0 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64  Last : OP_Rewind
19ee0 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29  , iCur, addrBrk)
19ef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19f00 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78  pEnd ){.      Ex
19f10 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58  pr *pX;.      pX
19f20 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a   = pEnd->pExpr;.
19f30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
19f40 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
19f50 65 72 74 28 20 28 70 45 6e 64 2d 3e 77 74 46 6c  ert( (pEnd->wtFl
19f60 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
19f70 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  )==0 );.      te
19f80 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 6c 65  stcase( pEnd->le
19f90 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29  ftCursor!=iCur )
19fa0 3b 20 2f 2a 20 54 72 61 6e 73 69 74 69 76 65 20  ; /* Transitive 
19fb0 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
19fc0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
19fd0 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
19fe0 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
19ff0 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65       memEndValue
1a000 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1a010 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
1a020 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1a030 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d   pX->pRight, mem
1a040 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  EndValue);.     
1a050 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
1a060 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LT || pX->op==TK
1a070 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74  _GT ){.        t
1a080 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
1a090 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20  P_Le : OP_Ge;.  
1a0a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a0b0 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76     testOp = bRev
1a0c0 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74   ? OP_Lt : OP_Gt
1a0d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a0e0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1a0f0 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d  el, pEnd);.    }
1a100 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c  .    start = sql
1a110 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1a120 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76  ddr(v);.    pLev
1a130 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20  el->op = bRev ? 
1a140 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78  OP_Prev : OP_Nex
1a150 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  t;.    pLevel->p
1a160 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c  1 = iCur;.    pL
1a170 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74  evel->p2 = start
1a180 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
1a190 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20  evel->p5==0 );. 
1a1a0 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f     if( testOp!=O
1a1b0 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
1a1c0 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c  iRowidReg = iRel
1a1d0 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65  easeReg = sqlite
1a1e0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
1a1f0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
1a200 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a210 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20  OP_Rowid, iCur, 
1a220 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1a230 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1a240 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
1a250 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
1a260 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
1a270 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1a280 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56   testOp, memEndV
1a290 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69  alue, addrBrk, i
1a2a0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
1a2b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1a2c0 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41  geP5(v, SQLITE_A
1a2d0 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c  FF_NUMERIC | SQL
1a2e0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
1a2f0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1a300 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1a310 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
1a320 44 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  D ){.    /* Case
1a330 20 34 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67   4: A scan using
1a340 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a   an index..    *
1a350 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1a360 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1a370 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65  e may contain ze
1a380 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c  ro or more equal
1a390 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  ity .    **     
1a3a0 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20      terms ("==" 
1a3b0 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  or "IN" operator
1a3c0 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  s) that refer to
1a3d0 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20   the N.    **   
1a3e0 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20        left-most 
1a3f0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
1a400 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73  ndex. It may als
1a410 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a  o contain.    **
1a420 20 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c           inequal
1a430 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
1a440 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29  (>, <, >= or <=)
1a450 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a   on the indexed.
1a460 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
1a470 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64  olumn that immed
1a480 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74  iately follows t
1a490 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e  he N equalities.
1a4a0 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20   Only .    **   
1a4b0 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d        the right-
1a4c0 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  most column can 
1a4d0 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  be an inequality
1a4e0 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74   - the rest must
1a4f0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1a500 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64  use the "==" and
1a510 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e   "IN" operators.
1a520 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
1a530 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20   the .    **    
1a540 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e       index is on
1a550 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74   (x,y,z), then t
1a560 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61  he following cla
1a570 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20  uses are all .  
1a580 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74    **         opt
1a590 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20  imized:.    **. 
1a5a0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1a5b0 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20   x=5.    **     
1a5c0 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
1a5d0 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  =10.    **      
1a5e0 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c        x=5 AND y<
1a5f0 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
1a600 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35       x=5 AND y>5
1a610 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
1a620 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1a630 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31  AND y=5 AND z<=1
1a640 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  0.    **.    ** 
1a650 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30          The z<10
1a660 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c   term of the fol
1a670 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65  lowing cannot be
1a680 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20   used, only.    
1a690 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78  **         the x
1a6a0 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a  =5 term:.    **.
1a6b0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1a6c0 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20    x=5 AND z<10. 
1a6d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1a6e0 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65       N may be ze
1a6f0 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
1a700 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1a710 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20  raints..    **  
1a720 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20         If there 
1a730 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74  are no inequalit
1a740 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  y constraints, t
1a750 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20  hen N is at.    
1a760 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74  **         least
1a770 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   one..    **.   
1a780 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73   **         This
1a790 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73   case is also us
1a7a0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
1a7b0 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
1a7c0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
1a7d0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74   constraints but
1a7e0 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c   an index is sel
1a7f0 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e  ected anyway, in
1a800 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20   order.    **   
1a810 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74        to force t
1a820 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  he output order 
1a830 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e  to conform to an
1a840 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a   ORDER BY..    *
1a850 2f 20 20 0a 20 20 20 20 73 74 61 74 69 63 20 63  /  .    static c
1a860 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f 70  onst u8 aStartOp
1a870 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a  [] = {.      0,.
1a880 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f        0,.      O
1a890 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20  P_Rewind,       
1a8a0 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72      /* 2: (!star
1a8b0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  t_constraints &&
1a8c0 20 73 74 61 72 74 45 71 20 26 26 20 20 21 62 52   startEq &&  !bR
1a8d0 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1a8e0 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Last,           
1a8f0 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f    /* 3: (!start_
1a900 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
1a910 74 61 72 74 45 71 20 26 26 20 20 20 62 52 65 76  tartEq &&   bRev
1a920 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
1a930 65 6b 47 74 2c 20 20 20 20 20 20 20 20 20 20 20  ekGt,           
1a940 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 4: (start_con
1a950 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74  straints  && !st
1a960 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20  artEq && !bRev) 
1a970 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
1a980 4c 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Lt,           /*
1a990 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   5: (start_const
1a9a0 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
1a9b0 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f  tEq &&  bRev) */
1a9c0 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 65  .      OP_SeekGe
1a9d0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36  ,           /* 6
1a9e0 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
1a9f0 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45  ints  &&  startE
1aa00 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  q && !bRev) */. 
1aa10 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 65 20 20       OP_SeekLe  
1aa20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20            /* 7: 
1aa30 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1aa40 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
1aa50 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &&  bRev) */.   
1aa60 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
1aa70 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d  onst u8 aEndOp[]
1aa80 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f   = {.      OP_No
1aa90 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
1aaa0 2f 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73  /* 0: (!end_cons
1aab0 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20  traints) */.    
1aac0 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20    OP_IdxGE,     
1aad0 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e         /* 1: (en
1aae0 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
1aaf0 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
1ab00 20 4f 50 5f 49 64 78 4c 54 20 20 20 20 20 20 20   OP_IdxLT       
1ab10 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64        /* 2: (end
1ab20 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1ab30 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a  bRev) */.    };.
1ab40 20 20 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c      u16 nEq = pL
1ab50 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1ab60 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
1ab70 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d  of == or IN term
1ab80 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4d  s */.    int isM
1ab90 69 6e 51 75 65 72 79 20 3d 20 30 3b 20 20 20 20  inQuery = 0;    
1aba0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
1abb0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64   is an optimized
1abc0 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e   SELECT min(x)..
1abd0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42   */.    int regB
1abe0 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
1abf0 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
1ac00 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f  ister holding co
1ac10 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20  nstraint values 
1ac20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31 3b 20 20  */.    int r1;  
1ac30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac40 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69      /* Temp regi
1ac50 73 74 65 72 20 2a 2f 0a 20 20 20 20 57 68 65 72  ster */.    Wher
1ac60 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 53 74 61  eTerm *pRangeSta
1ac70 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71  rt = 0;  /* Ineq
1ac80 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1ac90 74 20 61 74 20 72 61 6e 67 65 20 73 74 61 72 74  t at range start
1aca0 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
1acb0 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30  m *pRangeEnd = 0
1acc0 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69  ;    /* Inequali
1acd0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74  ty constraint at
1ace0 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20   range end */.  
1acf0 20 20 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20    int startEq;  
1ad00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ad10 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20  * True if range 
1ad20 73 74 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e  start uses ==, >
1ad30 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69  = or <= */.    i
1ad40 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20  nt endEq;       
1ad50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ad60 72 75 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64  rue if range end
1ad70 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20   uses ==, >= or 
1ad80 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74  <= */.    int st
1ad90 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b  art_constraints;
1ada0 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
1adb0 6f 66 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73  of range is cons
1adc0 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69  trained */.    i
1add0 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  nt nConstraint; 
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1adf0 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61  umber of constra
1ae00 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  int terms */.   
1ae10 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
1ae20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ae30 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69   The index we wi
1ae40 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20  ll be using */. 
1ae50 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20     int iIdxCur; 
1ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae70 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
1ae80 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
1ae90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78 74   */.    int nExt
1aea0 72 61 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  raReg = 0;      
1aeb0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1aec0 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
1aed0 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20  s needed */.    
1aee0 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
1aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1af00 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f  Instruction opco
1af10 64 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  de */.    char *
1af20 7a 53 74 61 72 74 41 66 66 3b 20 20 20 20 20 20  zStartAff;      
1af30 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
1af40 74 79 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20  ty for start of 
1af50 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
1af60 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 45 6e   */.    char cEn
1af70 64 41 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20  dAff = 0;       
1af80 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
1af90 20 66 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e 67   for end of rang
1afa0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
1afb0 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f  .    pIdx = pLoo
1afc0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
1afd0 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d  x;.    iIdxCur =
1afe0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
1aff0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 45  ;.    assert( nE
1b000 71 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  q>=pLoop->u.btre
1b010 65 2e 6e 53 6b 69 70 20 29 3b 0a 0a 20 20 20 20  e.nSkip );..    
1b020 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20  /* If this loop 
1b030 73 61 74 69 73 66 69 65 73 20 61 20 73 6f 72 74  satisfies a sort
1b040 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42 79   order (pOrderBy
1b050 29 20 72 65 71 75 65 73 74 20 74 68 61 74 20 0a  ) request that .
1b060 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65      ** was passe
1b070 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
1b080 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  on to implement 
1b090 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  a "SELECT min(x)
1b0a0 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75   ..." .    ** qu
1b0b0 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61  ery, then the ca
1b0c0 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61  ller will only a
1b0d0 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f  llow the loop to
1b0e0 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20   run for.    ** 
1b0f0 61 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69  a single iterati
1b100 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  on. This means t
1b110 68 61 74 20 74 68 65 20 66 69 72 73 74 20 72 6f  hat the first ro
1b120 77 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a  w returned.    *
1b130 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76  * should not hav
1b140 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73  e a NULL value s
1b150 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66  tored in 'x'. If
1b160 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20   column 'x' is. 
1b170 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20     ** the first 
1b180 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e 45  one after the nE
1b190 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  q equality const
1b1a0 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  raints in the in
1b1b0 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73  dex,.    ** this
1b1c0 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73   requires some s
1b1d0 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e  pecial handling.
1b1e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1b1f0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
1b200 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
1b210 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20 26  Y_MIN)!=0.     &
1b220 26 20 28 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61  & (pWInfo->bOBSa
1b230 74 21 3d 30 29 0a 20 20 20 20 20 26 26 20 28 70  t!=0).     && (p
1b240 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 71  Idx->nKeyCol>nEq
1b250 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61  ).    ){.      a
1b260 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e  ssert( pLoop->u.
1b270 62 74 72 65 65 2e 6e 53 6b 69 70 3d 3d 30 20 29  btree.nSkip==0 )
1b280 3b 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65  ;.      isMinQue
1b290 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45  ry = 1;.      nE
1b2a0 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20  xtraReg = 1;.   
1b2b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20   }..    /* Find 
1b2c0 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63  any inequality c
1b2d0 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
1b2e0 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e  for the start an
1b2f0 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66  d end .    ** of
1b300 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20   the range. .   
1b310 20 2a 2f 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b   */.    j = nEq;
1b320 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1b330 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1b340 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
1b350 20 20 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d     pRangeStart =
1b360 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1b370 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  ++];.      nExtr
1b380 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
1b390 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1b3a0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
1b3b0 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
1b3c0 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 70 4c    pRangeEnd = pL
1b3d0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
1b3e0 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
1b3f0 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  g = 1;.    }..  
1b400 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1b410 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
1b420 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ll constraint te
1b430 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20  rms using == or 
1b440 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74  IN.    ** and st
1b450 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ore the values o
1b460 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e  f those terms in
1b470 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
1b480 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74  isters.    ** st
1b490 61 72 74 69 6e 67 20 61 74 20 72 65 67 42 61 73  arting at regBas
1b4a0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  e..    */.    re
1b4b0 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45  gBase = codeAllE
1b4c0 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61  qualityTerms(pPa
1b4d0 72 73 65 2c 70 4c 65 76 65 6c 2c 62 52 65 76 2c  rse,pLevel,bRev,
1b4e0 6e 45 78 74 72 61 52 65 67 2c 26 7a 53 74 61 72  nExtraReg,&zStar
1b4f0 74 41 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72  tAff);.    asser
1b500 74 28 20 7a 53 74 61 72 74 41 66 66 3d 3d 30 20  t( zStartAff==0 
1b510 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  || sqlite3Strlen
1b520 33 30 28 7a 53 74 61 72 74 41 66 66 29 3e 3d 6e  30(zStartAff)>=n
1b530 45 71 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  Eq );.    if( zS
1b540 74 61 72 74 41 66 66 20 29 20 63 45 6e 64 41 66  tartAff ) cEndAf
1b550 66 20 3d 20 7a 53 74 61 72 74 41 66 66 5b 6e 45  f = zStartAff[nE
1b560 71 5d 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20  q];.    addrNxt 
1b570 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
1b580 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  t;..    /* If we
1b590 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72 65 76   are doing a rev
1b5a0 65 72 73 65 20 6f 72 64 65 72 20 73 63 61 6e 20  erse order scan 
1b5b0 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
1b5c0 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a  index, or.    **
1b5d0 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72   a forward order
1b5e0 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65   scan on a desce
1b5f0 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74  nding index, int
1b600 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20  erchange the .  
1b610 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 65    ** start and e
1b620 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67 65  nd terms (pRange
1b630 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67 65  Start and pRange
1b640 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  End)..    */.   
1b650 20 69 66 28 20 28 6e 45 71 3c 70 49 64 78 2d 3e   if( (nEq<pIdx->
1b660 6e 4b 65 79 43 6f 6c 20 26 26 20 62 52 65 76 3d  nKeyCol && bRev=
1b670 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  =(pIdx->aSortOrd
1b680 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f  er[nEq]==SQLITE_
1b690 53 4f 5f 41 53 43 29 29 0a 20 20 20 20 20 7c 7c  SO_ASC)).     ||
1b6a0 20 28 62 52 65 76 20 26 26 20 70 49 64 78 2d 3e   (bRev && pIdx->
1b6b0 6e 4b 65 79 43 6f 6c 3d 3d 6e 45 71 29 0a 20 20  nKeyCol==nEq).  
1b6c0 20 20 29 7b 0a 20 20 20 20 20 20 53 57 41 50 28    ){.      SWAP(
1b6d0 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70 52 61  WhereTerm *, pRa
1b6e0 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65 53 74  ngeEnd, pRangeSt
1b6f0 61 72 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  art);.    }..   
1b700 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
1b710 65 53 74 61 72 74 20 26 26 20 28 70 52 61 6e 67  eStart && (pRang
1b720 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
1b730 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b  r & WO_LE)!=0 );
1b740 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1b750 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 28 70  RangeStart && (p
1b760 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
1b770 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d  rator & WO_GE)!=
1b780 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
1b790 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20  e( pRangeEnd && 
1b7a0 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65  (pRangeEnd->eOpe
1b7b0 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d  rator & WO_LE)!=
1b7c0 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
1b7d0 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20  e( pRangeEnd && 
1b7e0 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65  (pRangeEnd->eOpe
1b7f0 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d  rator & WO_GE)!=
1b800 30 20 29 3b 0a 20 20 20 20 73 74 61 72 74 45 71  0 );.    startEq
1b810 20 3d 20 21 70 52 61 6e 67 65 53 74 61 72 74 20   = !pRangeStart 
1b820 7c 7c 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  || pRangeStart->
1b830 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
1b840 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65  LE|WO_GE);.    e
1b850 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e 67 65  ndEq =   !pRange
1b860 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64  End || pRangeEnd
1b870 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1b880 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20  O_LE|WO_GE);.   
1b890 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
1b8a0 74 73 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74  ts = pRangeStart
1b8b0 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20   || nEq>0;..    
1b8c0 2f 2a 20 53 65 65 6b 20 74 68 65 20 69 6e 64 65  /* Seek the inde
1b8d0 78 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  x cursor to the 
1b8e0 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e  start of the ran
1b8f0 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73  ge. */.    nCons
1b900 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20  traint = nEq;.  
1b910 20 20 69 66 28 20 70 52 61 6e 67 65 53 74 61 72    if( pRangeStar
1b920 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  t ){.      Expr 
1b930 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65  *pRight = pRange
1b940 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52  Start->pExpr->pR
1b950 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  ight;.      sqli
1b960 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1b970 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  se, pRight, regB
1b980 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
1b990 69 66 28 20 28 70 52 61 6e 67 65 53 74 61 72 74  if( (pRangeStart
1b9a0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1b9b0 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  _VNULL)==0 ){.  
1b9c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b9d0 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28  rCodeIsNullJump(
1b9e0 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  v, pRight, regBa
1b9f0 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29  se+nEq, addrNxt)
1ba00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ba10 69 66 28 20 7a 53 74 61 72 74 41 66 66 20 29 7b  if( zStartAff ){
1ba20 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1ba30 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
1ba40 69 74 79 28 70 52 69 67 68 74 2c 20 7a 53 74 61  ity(pRight, zSta
1ba50 72 74 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c  rtAff[nEq])==SQL
1ba60 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20  ITE_AFF_NONE){. 
1ba70 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63           /* Sinc
1ba80 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
1ba90 20 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72   is to be perfor
1baa0 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76  med with no conv
1bab0 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20  ersions.        
1bac0 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20    ** applied to 
1bad0 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65  the operands, se
1bae0 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
1baf0 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68  o apply to pRigh
1bb00 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20  t to .          
1bb10 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ** SQLITE_AFF_NO
1bb20 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  NE.  */.        
1bb30 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d    zStartAff[nEq]
1bb40 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
1bb50 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
1bb60 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1bb70 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
1bb80 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68  nityChange(pRigh
1bb90 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71  t, zStartAff[nEq
1bba0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
1bbb0 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d  zStartAff[nEq] =
1bbc0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1bbd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1bbe0 20 20 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e    }  .      nCon
1bbf0 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20  straint++;.     
1bc00 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
1bc10 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  eStart->wtFlags 
1bc20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1bc30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1bc40 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20  isMinQuery ){.  
1bc50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bc60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1bc70 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  , 0, regBase+nEq
1bc80 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  );.      nConstr
1bc90 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74  aint++;.      st
1bca0 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20  artEq = 0;.     
1bcb0 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
1bcc0 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ts = 1;.    }.  
1bcd0 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
1bce0 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
1bcf0 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
1bd00 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  , zStartAff);.  
1bd10 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b    op = aStartOp[
1bd20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1bd30 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45  ts<<2) + (startE
1bd40 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20  q<<1) + bRev];. 
1bd50 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30     assert( op!=0
1bd60 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1bd70 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20  ( op==OP_Rewind 
1bd80 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1bd90 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a   op==OP_Last );.
1bda0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1bdb0 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20  ==OP_SeekGt );. 
1bdc0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1bdd0 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20  =OP_SeekGe );.  
1bde0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1bdf0 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20  OP_SeekLe );.   
1be00 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1be10 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20  P_SeekLt );.    
1be20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1be30 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
1be40 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
1be50 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
1be60 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  nt);..    /* Loa
1be70 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  d the value for 
1be80 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  the inequality c
1be90 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65  onstraint at the
1bea0 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
1beb0 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79  ** range (if any
1bec0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43  )..    */.    nC
1bed0 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b  onstraint = nEq;
1bee0 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45  .    if( pRangeE
1bef0 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  nd ){.      Expr
1bf00 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67   *pRight = pRang
1bf10 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69  eEnd->pExpr->pRi
1bf20 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
1bf30 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
1bf40 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
1bf50 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20  e+nEq, 1);.     
1bf60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1bf70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
1bf80 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
1bf90 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
1bfa0 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
1bfb0 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b  ERM_VNULL)==0 ){
1bfc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1bfd0 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
1bfe0 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65  mp(v, pRight, re
1bff0 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e  gBase+nEq, addrN
1c000 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xt);.      }.   
1c010 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
1c020 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52  mpareAffinity(pR
1c030 69 67 68 74 2c 20 63 45 6e 64 41 66 66 29 21 3d  ight, cEndAff)!=
1c040 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a  SQLITE_AFF_NONE.
1c050 20 20 20 20 20 20 20 26 26 20 21 73 71 6c 69 74         && !sqlit
1c060 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66  e3ExprNeedsNoAff
1c070 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67  inityChange(pRig
1c080 68 74 2c 20 63 45 6e 64 41 66 66 29 0a 20 20 20  ht, cEndAff).   
1c090 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f     ){.        co
1c0a0 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
1c0b0 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b  pParse, regBase+
1c0c0 6e 45 71 2c 20 31 2c 20 26 63 45 6e 64 41 66 66  nEq, 1, &cEndAff
1c0d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c0e0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
1c0f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c100 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61  pRangeEnd->wtFla
1c110 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
1c120 4c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  L );.    }.    s
1c130 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1c140 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 0a 20 20   zStartAff);..  
1c150 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
1c160 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20  loop body */.   
1c170 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71   pLevel->p2 = sq
1c180 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1c190 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  Addr(v);..    /*
1c1a0 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 6e   Check if the in
1c1b0 64 65 78 20 63 75 72 73 6f 72 20 69 73 20 70 61  dex cursor is pa
1c1c0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
1c1d0 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20  e range. */.    
1c1e0 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61  op = aEndOp[(pRa
1c1f0 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a  ngeEnd || nEq) *
1c200 20 28 31 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20   (1 + bRev)];.  
1c210 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1c220 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20 20 74  OP_Noop );.    t
1c230 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1c240 49 64 78 47 45 20 29 3b 0a 20 20 20 20 74 65 73  IdxGE );.    tes
1c250 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64  tcase( op==OP_Id
1c260 78 4c 54 20 29 3b 0a 20 20 20 20 69 66 28 20 6f  xLT );.    if( o
1c270 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
1c280 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c290 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20  ddOp4Int(v, op, 
1c2a0 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74  iIdxCur, addrNxt
1c2b0 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73  , regBase, nCons
1c2c0 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  traint);.      s
1c2d0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1c2e0 50 35 28 76 2c 20 65 6e 64 45 71 21 3d 62 52 65  P5(v, endEq!=bRe
1c2f0 76 20 3f 31 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a  v ?1:0);.    }..
1c300 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1c310 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  are inequality c
1c320 6f 6e 73 74 72 61 69 6e 74 73 2c 20 63 68 65 63  onstraints, chec
1c330 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
1c340 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  .    ** of the t
1c350 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74  able column that
1c360 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20   the inequality 
1c370 63 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f 74  contrains is not
1c380 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49 66   NULL..    ** If
1c390 20 69 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f 20   it is, jump to 
1c3a0 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
1c3b0 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  on of the loop..
1c3c0 20 20 20 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20      */.    r1 = 
1c3d0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
1c3e0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 74  g(pParse);.    t
1c3f0 65 73 74 63 61 73 65 28 20 70 4c 6f 6f 70 2d 3e  estcase( pLoop->
1c400 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1c410 42 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20  BTM_LIMIT );.   
1c420 20 74 65 73 74 63 61 73 65 28 20 70 4c 6f 6f 70   testcase( pLoop
1c430 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1c440 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a 20  E_TOP_LIMIT );. 
1c450 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
1c460 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
1c470 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f  BTM_LIMIT|WHERE_
1c480 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 20 0a  TOP_LIMIT))!=0 .
1c490 20 20 20 20 20 26 26 20 28 6a 20 3d 20 70 49 64       && (j = pId
1c4a0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d  x->aiColumn[nEq]
1c4b0 29 3e 3d 30 20 0a 20 20 20 20 20 26 26 20 70 49  )>=0 .     && pI
1c4c0 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
1c4d0 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 0a  [j].notNull==0 .
1c4e0 20 20 20 20 20 26 26 20 28 6e 45 71 20 7c 7c 20       && (nEq || 
1c4f0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1c500 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
1c510 54 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  T)==0).    ){.  
1c520 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c530 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
1c540 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45 71  mn, iIdxCur, nEq
1c550 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
1c560 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
1c570 22 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d  ", pIdx->pTable-
1c580 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 29  >aCol[j].zName))
1c590 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1c5a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1c5b0 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64 72  IsNull, r1, addr
1c5c0 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Cont);.    }.   
1c5d0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1c5e0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1c5f0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  1);..    /* Seek
1c600 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   the table curso
1c610 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  r, if required *
1c620 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72  /.    disableTer
1c630 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65  m(pLevel, pRange
1c640 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61  Start);.    disa
1c650 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1c660 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20  pRangeEnd);.    
1c670 69 66 28 20 6f 6d 69 74 54 61 62 6c 65 20 29 7b  if( omitTable ){
1c680 0a 20 20 20 20 20 20 2f 2a 20 70 49 64 78 20 69  .      /* pIdx i
1c690 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
1c6a0 65 78 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  ex.  No need to 
1c6b0 61 63 63 65 73 73 20 74 68 65 20 6d 61 69 6e 20  access the main 
1c6c0 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 7d 65  table. */.    }e
1c6d0 6c 73 65 20 69 66 28 20 48 61 73 52 6f 77 69 64  lse if( HasRowid
1c6e0 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 20 29  (pIdx->pTable) )
1c6f0 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
1c700 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20  g = iReleaseReg 
1c710 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1c720 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
1c730 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c740 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f  dOp2(v, OP_IdxRo
1c750 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52  wid, iIdxCur, iR
1c760 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1c770 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1c780 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
1c790 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
1c7a0 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1c7b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1c7c0 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52  P_Seek, iCur, iR
1c7d0 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65  owidReg);  /* De
1c7e0 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20  ferred seek */. 
1c7f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c800 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c  Index *pPk = sql
1c810 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
1c820 64 65 78 28 70 49 64 78 2d 3e 70 54 61 62 6c 65  dex(pIdx->pTable
1c830 29 3b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52  );.      iRowidR
1c840 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
1c850 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1c860 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a   pPk->nKeyCol);.
1c870 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
1c880 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  <pPk->nKeyCol; j
1c890 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d  ++){.        k =
1c8a0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
1c8b0 49 6e 64 65 78 28 70 49 64 78 2c 20 70 50 6b 2d  Index(pIdx, pPk-
1c8c0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20  >aiColumn[j]);. 
1c8d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1c8e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1c8f0 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20  olumn, iIdxCur, 
1c900 6b 2c 20 69 52 6f 77 69 64 52 65 67 2b 6a 29 3b  k, iRowidReg+j);
1c910 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1c920 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1c930 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
1c940 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72 43 6f  nd, iCur, addrCo
1c950 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  nt,.            
1c960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1c970 52 6f 77 69 64 52 65 67 2c 20 70 50 6b 2d 3e 6e  RowidReg, pPk->n
1c980 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 0a  KeyCol);.    }..
1c990 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68      /* Record th
1c9a0 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73  e instruction us
1c9b0 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  ed to terminate 
1c9c0 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c  the loop. Disabl
1c9d0 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20  e .    ** WHERE 
1c9e0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64  clause terms mad
1c9f0 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74  e redundant by t
1ca00 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73  he index range s
1ca10 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  can..    */.    
1ca20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1ca30 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
1ca40 57 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  W ){.      pLeve
1ca50 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  l->op = OP_Noop;
1ca60 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62  .    }else if( b
1ca70 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  Rev ){.      pLe
1ca80 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65  vel->op = OP_Pre
1ca90 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  v;.    }else{.  
1caa0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1cab0 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 7d 0a   OP_Next;.    }.
1cac0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
1cad0 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 69 66   iIdxCur;.    if
1cae0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1caf0 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52  s & WHERE_CONSTR
1cb00 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20  AINT)==0 ){.    
1cb10 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53    pLevel->p5 = S
1cb20 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
1cb30 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a  _FULLSCAN_STEP;.
1cb40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cb50 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
1cb60 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  >p5==0 );.    }.
1cb70 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66    }else..#ifndef
1cb80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
1cb90 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69  OPTIMIZATION.  i
1cba0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1cbb0 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s & WHERE_MULTI_
1cbc0 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  OR ){.    /* Cas
1cbd0 65 20 35 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72  e 5:  Two or mor
1cbe0 65 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e 64  e separately ind
1cbf0 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65  exed terms conne
1cc00 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20 20 2a  cted by OR.    *
1cc10 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65  *.    ** Example
1cc20 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1cc30 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1cc40 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20  1(a,b,c,d);.    
1cc50 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
1cc60 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20  X i1 ON t1(a);. 
1cc70 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49     **   CREATE I
1cc80 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62 29  NDEX i2 ON t1(b)
1cc90 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
1cca0 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31  E INDEX i3 ON t1
1ccb0 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  (c);.    **.    
1ccc0 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
1ccd0 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20  OM t1 WHERE a=5 
1cce0 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31 31 20  OR b=7 OR (c=11 
1ccf0 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a  AND d=13).    **
1cd00 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65 20 65  .    ** In the e
1cd10 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20 61 72  xample, there ar
1cd20 65 20 74 68 72 65 65 20 69 6e 64 65 78 65 64 20  e three indexed 
1cd30 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20  terms connected 
1cd40 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68  by OR..    ** Th
1cd50 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  e top of the loo
1cd60 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69  p looks like thi
1cd70 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
1cd80 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20            Null  
1cd90 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
1cda0 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65        # Zero the
1cdb0 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31   rowset in reg 1
1cdc0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1cdd0 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 69 6e  hen, for each in
1cde0 64 65 78 65 64 20 74 65 72 6d 2c 20 74 68 65 20  dexed term, the 
1cdf0 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61  following. The a
1ce00 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20  rguments to.    
1ce10 2a 2a 20 52 6f 77 53 65 74 54 65 73 74 20 61 72  ** RowSetTest ar
1ce20 65 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  e such that the 
1ce30 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63 75 72  rowid of the cur
1ce40 72 65 6e 74 20 72 6f 77 20 69 73 20 69 6e 73 65  rent row is inse
1ce50 72 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  rted.    ** into
1ce60 20 74 68 65 20 52 6f 77 53 65 74 2e 20 49 66 20   the RowSet. If 
1ce70 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 70 72  it is already pr
1ce80 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73  esent, control s
1ce90 6b 69 70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  kips the.    ** 
1cea0 47 6f 73 75 62 20 6f 70 63 6f 64 65 20 61 6e 64  Gosub opcode and
1ceb0 20 6a 75 6d 70 73 20 73 74 72 61 69 67 68 74 20   jumps straight 
1cec0 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  to the code gene
1ced0 72 61 74 65 64 20 62 79 20 57 68 65 72 65 45 6e  rated by WhereEn
1cee0 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  d()..    **.    
1cef0 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  **        sqlite
1cf00 33 57 68 65 72 65 42 65 67 69 6e 28 3c 74 65 72  3WhereBegin(<ter
1cf10 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  m>).    **      
1cf20 20 20 20 20 52 6f 77 53 65 74 54 65 73 74 20 20      RowSetTest  
1cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf40 23 20 49 6e 73 65 72 74 20 72 6f 77 69 64 20 69  # Insert rowid i
1cf50 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20 20 20 2a  nto rowset.    *
1cf60 2a 20 20 20 20 20 20 20 20 20 20 47 6f 73 75 62  *          Gosub
1cf70 20 20 20 20 20 20 32 20 41 0a 20 20 20 20 2a 2a        2 A.    **
1cf80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
1cf90 68 65 72 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a  hereEnd().    **
1cfa0 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e  .    ** Followin
1cfb0 67 20 74 68 65 20 61 62 6f 76 65 2c 20 63 6f 64  g the above, cod
1cfc0 65 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  e to terminate t
1cfd0 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41  he loop. Label A
1cfe0 2c 20 74 68 65 20 74 61 72 67 65 74 0a 20 20 20  , the target.   
1cff0 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73 75 62   ** of the Gosub
1d000 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f   above, jumps to
1d010 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
1d020 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
1d030 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20   Goto..    **.  
1d040 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75    **          Nu
1d050 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20  ll       1      
1d060 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f            # Zero
1d070 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72   the rowset in r
1d080 65 67 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20  eg 1.    **     
1d090 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20       Goto       
1d0a0 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  B               
1d0b0 20 23 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 66   # The loop is f
1d0c0 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a  inished..    **.
1d0d0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 3a 20      **       A: 
1d0e0 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20 20  <loop body>     
1d0f0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 52 65              # Re
1d100 74 75 72 6e 20 64 61 74 61 2c 20 77 68 61 74 65  turn data, whate
1d110 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ver..    **.    
1d120 2a 2a 20 20 20 20 20 20 20 20 20 20 52 65 74 75  **          Retu
1d130 72 6e 20 20 20 20 20 32 20 20 20 20 20 20 20 20  rn     2        
1d140 20 20 20 20 20 20 20 20 23 20 4a 75 6d 70 20 62          # Jump b
1d150 61 63 6b 20 74 6f 20 74 68 65 20 47 6f 73 75 62  ack to the Gosub
1d160 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1d170 20 20 20 20 20 42 3a 20 3c 61 66 74 65 72 20 74       B: <after t
1d180 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a  he loop>.    **.
1d190 20 20 20 20 2a 2f 0a 20 20 20 20 57 68 65 72 65      */.    Where
1d1a0 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20  Clause *pOrWc;  
1d1b0 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75    /* The OR-clau
1d1c0 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e  se broken out in
1d1d0 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20  to subterms */. 
1d1e0 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4f 72 54     SrcList *pOrT
1d1f0 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 6f  ab;       /* Sho
1d200 72 74 65 6e 65 64 20 74 61 62 6c 65 20 6c 69 73  rtened table lis
1d210 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73 65 20 67  t or OR-clause g
1d220 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  eneration */.   
1d230 20 49 6e 64 65 78 20 2a 70 43 6f 76 20 3d 20 30   Index *pCov = 0
1d240 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1d250 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f 76 65 72   Potential cover
1d260 69 6e 67 20 69 6e 64 65 78 20 28 6f 72 20 4e 55  ing index (or NU
1d270 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  LL) */.    int i
1d280 43 6f 76 43 75 72 20 3d 20 70 50 61 72 73 65 2d  CovCur = pParse-
1d290 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20 43 75 72  >nTab++;  /* Cur
1d2a0 73 6f 72 20 75 73 65 64 20 66 6f 72 20 69 6e 64  sor used for ind
1d2b0 65 78 20 73 63 61 6e 73 20 28 69 66 20 61 6e 79  ex scans (if any
1d2c0 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65  ) */..    int re
1d2d0 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
1d2e0 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20  se->nMem;       
1d2f0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
1d300 75 73 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73  used with OP_Gos
1d310 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ub */.    int re
1d320 67 52 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20  gRowset = 0;    
1d330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d340 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
1d350 66 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63  for RowSet objec
1d360 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  t */.    int reg
1d370 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20  Rowid = 0;      
1d380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d390 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
1d3a0 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a  olding rowid */.
1d3b0 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64      int iLoopBod
1d3c0 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  y = sqlite3VdbeM
1d3d0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a  akeLabel(v);  /*
1d3e0 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62   Start of loop b
1d3f0 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ody */.    int i
1d400 52 65 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20  RetInit;        
1d410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d420 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1d430 6f 66 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69  of regReturn ini
1d440 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74  t */.    int unt
1d450 65 73 74 65 64 54 65 72 6d 73 20 3d 20 30 3b 20  estedTerms = 0; 
1d460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1d470 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f  ome terms not co
1d480 6d 70 6c 65 74 65 6c 79 20 74 65 73 74 65 64 20  mpletely tested 
1d490 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20  */.    int ii;  
1d4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1d4c0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
1d4d0 20 45 78 70 72 20 2a 70 41 6e 64 45 78 70 72 20   Expr *pAndExpr 
1d4e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1d4f0 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e      /* An ".. AN
1d500 44 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73  D (...)" express
1d510 69 6f 6e 20 2a 2f 0a 20 20 20 0a 20 20 20 20 70  ion */.   .    p
1d520 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  Term = pLoop->aL
1d530 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73  Term[0];.    ass
1d540 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
1d550 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
1d560 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1d570 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73 73  WO_OR );.    ass
1d580 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ert( (pTerm->wtF
1d590 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e  lags & TERM_ORIN
1d5a0 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f  FO)!=0 );.    pO
1d5b0 72 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e  rWc = &pTerm->u.
1d5c0 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  pOrInfo->wc;.   
1d5d0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1d5e0 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65  _Return;.    pLe
1d5f0 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65 74  vel->p1 = regRet
1d600 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  urn;..    /* Set
1d610 20 75 70 20 61 20 6e 65 77 20 53 72 63 4c 69 73   up a new SrcLis
1d620 74 20 69 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74  t in pOrTab cont
1d630 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
1d640 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20   being scanned. 
1d650 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f     ** by this lo
1d660 6f 70 20 69 6e 20 74 68 65 20 61 5b 30 5d 20 73  op in the a[0] s
1d670 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52  lot and all notR
1d680 65 61 64 79 20 74 61 62 6c 65 73 20 69 6e 20 61  eady tables in a
1d690 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20  [1..] slots..   
1d6a0 20 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d 65 73   ** This becomes
1d6b0 20 74 68 65 20 53 72 63 4c 69 73 74 20 69 6e 20   the SrcList in 
1d6c0 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61  the recursive ca
1d6d0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ll to sqlite3Whe
1d6e0 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a  reBegin()..    *
1d6f0 2f 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  /.    if( pWInfo
1d700 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20  ->nLevel>1 ){.  
1d710 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64      int nNotRead
1d720 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1d730 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
1d740 20 6f 66 20 6e 6f 74 52 65 61 64 79 20 74 61 62   of notReady tab
1d750 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  les */.      str
1d760 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1d770 20 2a 6f 72 69 67 53 72 63 3b 20 20 20 20 20 2f   *origSrc;     /
1d780 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20  * Original list 
1d790 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  of tables */.   
1d7a0 20 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70     nNotReady = p
1d7b0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20  WInfo->nLevel - 
1d7c0 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20  iLevel - 1;.    
1d7d0 20 20 70 4f 72 54 61 62 20 3d 20 73 71 6c 69 74    pOrTab = sqlit
1d7e0 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28  e3StackAllocRaw(
1d7f0 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
1d800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d810 73 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b  sizeof(*pOrTab)+
1d820 20 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f   nNotReady*sizeo
1d830 66 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29  f(pOrTab->a[0]))
1d840 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
1d850 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e  ab==0 ) return n
1d860 6f 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70  otReady;.      p
1d870 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  OrTab->nAlloc = 
1d880 28 75 38 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b  (u8)(nNotReady +
1d890 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61   1);.      pOrTa
1d8a0 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62  b->nSrc = pOrTab
1d8b0 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  ->nAlloc;.      
1d8c0 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61  memcpy(pOrTab->a
1d8d0 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65  , pTabItem, size
1d8e0 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a  of(*pTabItem));.
1d8f0 20 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20        origSrc = 
1d900 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1d910 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  ->a;.      for(k
1d920 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79  =1; k<=nNotReady
1d930 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
1d940 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e  memcpy(&pOrTab->
1d950 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70  a[k], &origSrc[p
1d960 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c  Level[k].iFrom],
1d970 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e   sizeof(pOrTab->
1d980 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a  a[k]));.      }.
1d990 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d9a0 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f   pOrTab = pWInfo
1d9b0 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  ->pTabList;.    
1d9c0 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  }..    /* Initia
1d9d0 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20  lize the rowset 
1d9e0 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74  register to cont
1d9f0 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c  ain NULL. An SQL
1da00 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a   NULL is .    **
1da10 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61   equivalent to a
1da20 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a  n empty rowset..
1da30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
1da40 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65  so initialize re
1da50 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61  gReturn to conta
1da60 69 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  in the address o
1da70 66 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  f the instructio
1da80 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69  n .    ** immedi
1da90 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
1daa0 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74  the OP_Return at
1dab0 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   the bottom of t
1dac0 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20  he loop. This.  
1dad0 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
1dae0 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72   in a few obscur
1daf0 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65  e LEFT JOIN case
1db00 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20  s where control 
1db10 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65  jumps.    ** ove
1db20 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  r the top of the
1db30 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62   loop into the b
1db40 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68  ody of it. In th
1db50 69 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20  is case the .   
1db60 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70   ** correct resp
1db70 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64  onse for the end
1db80 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74  -of-loop code (t
1db90 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73  he OP_Return) is
1dba0 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c   to .    ** fall
1dbb0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
1dbc0 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
1dbd0 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f  , just as an OP_
1dbe0 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20  Next does if.   
1dbf0 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   ** called on an
1dc00 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63   uninitialized c
1dc10 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ursor..    */.  
1dc20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
1dc30 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1dc40 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
1dc50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 67  ==0 ){.      reg
1dc60 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Rowset = ++pPars
1dc70 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
1dc80 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72  egRowid = ++pPar
1dc90 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1dca0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1dcb0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1dcc0 20 72 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20   regRowset);.   
1dcd0 20 7d 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20   }.    iRetInit 
1dce0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1dcf0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1dd00 72 2c 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29  r, 0, regReturn)
1dd10 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
1dd20 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
1dd30 63 6c 61 75 73 65 20 69 73 20 7a 20 6f 66 20 74  clause is z of t
1dd40 68 65 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52  he form:  (x1 OR
1dd50 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20   x2 OR ...) AND 
1dd60 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f  y.    ** Then fo
1dd70 72 20 65 76 65 72 79 20 74 65 72 6d 20 78 4e 2c  r every term xN,
1dd80 20 65 76 61 6c 75 61 74 65 20 61 73 20 74 68 65   evaluate as the
1dd90 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 3a 20   subexpression: 
1dda0 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20  xN AND z.    ** 
1ddb0 54 68 61 74 20 77 61 79 2c 20 74 65 72 6d 73 20  That way, terms 
1ddc0 69 6e 20 79 20 74 68 61 74 20 61 72 65 20 66 61  in y that are fa
1ddd0 63 74 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20  ctored into the 
1dde0 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  disjunction will
1ddf0 0a 20 20 20 20 2a 2a 20 62 65 20 70 69 63 6b 65  .    ** be picke
1de00 64 20 75 70 20 62 79 20 74 68 65 20 72 65 63 75  d up by the recu
1de10 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 73  rsive calls to s
1de20 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1de30 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a  () below..    **
1de40 0a 20 20 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  .    ** Actually
1de50 2c 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73  , each subexpres
1de60 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65 72 74 65  sion is converte
1de70 64 20 74 6f 20 22 78 4e 20 41 4e 44 20 77 22 20  d to "xN AND w" 
1de80 77 68 65 72 65 20 77 20 69 73 0a 20 20 20 20 2a  where w is.    *
1de90 2a 20 74 68 65 20 22 69 6e 74 65 72 65 73 74 69  * the "interesti
1dea0 6e 67 22 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d  ng" terms of z -
1deb0 20 74 65 72 6d 73 20 74 68 61 74 20 64 69 64 20   terms that did 
1dec0 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e  not originate in
1ded0 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f   the.    ** ON o
1dee0 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
1def0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61  f a LEFT JOIN, a
1df00 6e 64 20 74 65 72 6d 73 20 74 68 61 74 20 61 72  nd terms that ar
1df10 65 20 75 73 61 62 6c 65 20 61 73 20 0a 20 20 20  e usable as .   
1df20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a 20 20 20   ** indices..   
1df30 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
1df40 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 73  optimization als
1df50 6f 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 69  o only applies i
1df60 66 20 74 68 65 20 28 78 31 20 4f 52 20 78 32 20  f the (x1 OR x2 
1df70 4f 52 20 2e 2e 2e 29 20 74 65 72 6d 0a 20 20 20  OR ...) term.   
1df80 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61   ** is not conta
1df90 69 6e 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 63  ined in the ON c
1dfa0 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20  lause of a LEFT 
1dfb0 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20 53 65 65  JOIN..    ** See
1dfc0 20 74 69 63 6b 65 74 20 68 74 74 70 3a 2f 2f 77   ticket http://w
1dfd0 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72  ww.sqlite.org/sr
1dfe0 63 2f 69 6e 66 6f 2f 66 32 33 36 39 33 30 34 65  c/info/f2369304e
1dff0 34 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  4.    */.    if(
1e000 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b   pWC->nTerm>1 ){
1e010 0a 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d  .      int iTerm
1e020 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 54 65 72  ;.      for(iTer
1e030 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e  m=0; iTerm<pWC->
1e040 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b  nTerm; iTerm++){
1e050 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
1e060 45 78 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54  Expr = pWC->a[iT
1e070 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  erm].pExpr;.    
1e080 20 20 20 20 69 66 28 20 26 70 57 43 2d 3e 61 5b      if( &pWC->a[
1e090 69 54 65 72 6d 5d 20 3d 3d 20 70 54 65 72 6d 20  iTerm] == pTerm 
1e0a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1e0b0 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1e0c0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1e0d0 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f  P_FromJoin) ) co
1e0e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1e0f0 69 66 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d  if( pWC->a[iTerm
1e100 5d 2e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ].wtFlags & (TER
1e110 4d 5f 4f 52 49 4e 46 4f 29 20 29 20 63 6f 6e 74  M_ORINFO) ) cont
1e120 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
1e130 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  ( (pWC->a[iTerm]
1e140 2e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  .eOperator & WO_
1e150 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ALL)==0 ) contin
1e160 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  ue;.        pExp
1e170 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
1e180 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29  up(db, pExpr, 0)
1e190 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78  ;.        pAndEx
1e1a0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
1e1b0 41 6e 64 28 64 62 2c 20 70 41 6e 64 45 78 70 72  And(db, pAndExpr
1e1c0 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
1e1d0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64  }.      if( pAnd
1e1e0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
1e1f0 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74  pAndExpr = sqlit
1e200 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
1e210 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45  TK_AND, 0, pAndE
1e220 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  xpr, 0);.      }
1e230 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
1e240 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e  ii=0; ii<pOrWc->
1e250 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
1e260 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1e270 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d  OrTerm = &pOrWc-
1e280 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66  >a[ii];.      if
1e290 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
1e2a0 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 28  ursor==iCur || (
1e2b0 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
1e2c0 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20  or & WO_AND)!=0 
1e2d0 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
1e2e0 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b  Info *pSubWInfo;
1e2f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
1e300 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d  o for single OR-
1e310 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20  term scan */.   
1e320 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72 45 78       Expr *pOrEx
1e330 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45  pr = pOrTerm->pE
1e340 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
1e350 20 70 41 6e 64 45 78 70 72 20 26 26 20 21 45 78   pAndExpr && !Ex
1e360 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f  prHasProperty(pO
1e370 72 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rExpr, EP_FromJo
1e380 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  in) ){.         
1e390 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74   pAndExpr->pLeft
1e3a0 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20 20 20   = pOrExpr;.    
1e3b0 20 20 20 20 20 20 70 4f 72 45 78 70 72 20 3d 20        pOrExpr = 
1e3c0 70 41 6e 64 45 78 70 72 3b 0a 20 20 20 20 20 20  pAndExpr;.      
1e3d0 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c    }.        /* L
1e3e0 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c  oop through tabl
1e3f0 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d  e entries that m
1e400 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72  atch term pOrTer
1e410 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 53  m. */.        pS
1e420 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  ubWInfo = sqlite
1e430 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
1e440 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72 45  se, pOrTab, pOrE
1e450 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  xpr, 0, 0,.     
1e460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e470 20 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50     WHERE_OMIT_OP
1e480 45 4e 5f 43 4c 4f 53 45 20 7c 20 57 48 45 52 45  EN_CLOSE | WHERE
1e490 5f 41 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20  _AND_ONLY |.    
1e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4b0 20 20 20 20 57 48 45 52 45 5f 46 4f 52 43 45 5f      WHERE_FORCE_
1e4c0 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e  TABLE | WHERE_ON
1e4d0 45 54 41 42 4c 45 5f 4f 4e 4c 59 2c 20 69 43 6f  ETABLE_ONLY, iCo
1e4e0 76 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 61  vCur);.        a
1e4f0 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f  ssert( pSubWInfo
1e500 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1e510 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1e520 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
1e530 69 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b  if( pSubWInfo ){
1e540 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  .          Where
1e550 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f 70 3b 0a  Loop *pSubLoop;.
1e560 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69            explai
1e570 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20  nOneScan(.      
1e580 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
1e590 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57 49 6e  pOrTab, &pSubWIn
1e5a0 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65 6c  fo->a[0], iLevel
1e5b0 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c  , pLevel->iFrom,
1e5c0 20 30 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a   0.          );.
1e5d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
1e5e0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
1e5f0 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43  s & WHERE_DUPLIC
1e600 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  ATES_OK)==0 ){. 
1e610 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
1e620 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57  Set = ((ii==pOrW
1e630 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69  c->nTerm-1)?-1:i
1e640 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
1e650 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20 20  int r;.         
1e660 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 45 78     r = sqlite3Ex
1e670 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
1e680 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d  pParse, pTabItem
1e690 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43 75 72  ->pTab, -1, iCur
1e6a0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6c0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52              regR
1e6d0 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  owid, 0);.      
1e6e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e6f0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
1e700 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67  _RowSetTest, reg
1e710 52 6f 77 73 65 74 2c 0a 20 20 20 20 20 20 20 20  Rowset,.        
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 73 71 6c 69 74 65 33           sqlite3
1e740 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1e750 76 29 2b 32 2c 20 72 2c 20 69 53 65 74 29 3b 0a  v)+2, r, iSet);.
1e760 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e770 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e780 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1e790 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e 2c 20  sub, regReturn, 
1e7a0 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20  iLoopBody);..   
1e7b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53         /* The pS
1e7c0 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65  ubWInfo->unteste
1e7d0 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e  dTerms flag mean
1e7e0 73 20 74 68 61 74 20 74 68 69 73 20 4f 52 20 74  s that this OR t
1e7f0 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  erm.          **
1e800 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f   contained one o
1e810 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d 20  r more AND term 
1e820 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79 20  from a notReady 
1e830 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20 20 20  table.  The.    
1e840 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 20 66        ** terms f
1e850 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61 64 79  rom the notReady
1e860 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74   table could not
1e870 20 62 65 20 74 65 73 74 65 64 20 61 6e 64 20 77   be tested and w
1e880 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ill.          **
1e890 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65 73 74   need to be test
1e8a0 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20  ed later..      
1e8b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1e8c0 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e   if( pSubWInfo->
1e8d0 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20  untestedTerms ) 
1e8e0 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20  untestedTerms = 
1e8f0 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  1;..          /*
1e900 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 4f   If all of the O
1e910 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d  R-connected term
1e920 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65 64 20  s are optimized 
1e930 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20  using the same. 
1e940 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65           ** inde
1e950 78 2c 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  x, and the index
1e960 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67   is opened using
1e970 20 74 68 65 20 73 61 6d 65 20 63 75 72 73 6f 72   the same cursor
1e980 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20   number.        
1e990 20 20 2a 2a 20 62 79 20 65 61 63 68 20 63 61 6c    ** by each cal
1e9a0 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  l to sqlite3Wher
1e9b0 65 42 65 67 69 6e 28 29 20 6d 61 64 65 20 62 79  eBegin() made by
1e9c0 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74 20 6d   this loop, it m
1e9d0 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ay.          ** 
1e9e0 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  be possible to u
1e9f0 73 65 20 74 68 61 74 20 69 6e 64 65 78 20 61 73  se that index as
1ea00 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
1ea10 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  x..          **.
1ea20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
1ea30 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
1ea40 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
1ea50 61 62 6f 76 65 20 72 65 73 75 6c 74 65 64 20 69  above resulted i
1ea60 6e 20 61 20 73 63 61 6e 20 74 68 61 74 0a 20 20  n a scan that.  
1ea70 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 73 20          ** uses 
1ea80 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68  an index, and th
1ea90 69 73 20 69 73 20 65 69 74 68 65 72 20 74 68 65  is is either the
1eaa0 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e 65 63   first OR-connec
1eab0 74 65 64 20 74 65 72 6d 0a 20 20 20 20 20 20 20  ted term.       
1eac0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
1ead0 6f 72 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  or the index is 
1eae0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 61 74  the same as that
1eaf0 20 75 73 65 64 20 62 79 20 61 6c 6c 20 70 72 65   used by all pre
1eb00 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20  vious.          
1eb10 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74 20 70 43  ** terms, set pC
1eb20 6f 76 20 74 6f 20 74 68 65 20 63 61 6e 64 69 64  ov to the candid
1eb30 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ate covering ind
1eb40 65 78 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73  ex. Otherwise, s
1eb50 65 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  et .          **
1eb60 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20 74 6f   pCov to NULL to
1eb70 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 6e   indicate that n
1eb80 6f 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65  o candidate cove
1eb90 72 69 6e 67 20 69 6e 64 65 78 20 77 69 6c 6c 20  ring index will 
1eba0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65  .          ** be
1ebb0 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20 20 20   available..    
1ebc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1ebd0 20 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20 70 53     pSubLoop = pS
1ebe0 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57  ubWInfo->a[0].pW
1ebf0 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  Loop;.          
1ec00 61 73 73 65 72 74 28 20 28 70 53 75 62 4c 6f 6f  assert( (pSubLoo
1ec10 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1ec20 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d  RE_AUTO_INDEX)==
1ec30 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  0 );.          i
1ec40 66 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73  f( (pSubLoop->ws
1ec50 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
1ec60 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20  DEXED)!=0.      
1ec70 20 20 20 20 20 26 26 20 28 69 69 3d 3d 30 20 7c       && (ii==0 |
1ec80 7c 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74  | pSubLoop->u.bt
1ec90 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70 43 6f 76  ree.pIndex==pCov
1eca0 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
1ecb0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1ecc0 74 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b  t( pSubWInfo->a[
1ecd0 30 5d 2e 69 49 64 78 43 75 72 3d 3d 69 43 6f 76  0].iIdxCur==iCov
1ece0 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Cur );.         
1ecf0 20 20 20 70 43 6f 76 20 3d 20 70 53 75 62 4c 6f     pCov = pSubLo
1ed00 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
1ed10 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ex;.          }e
1ed20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1ed30 20 70 43 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20   pCov = 0;.     
1ed40 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1ed50 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68 65 20    /* Finish the 
1ed60 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62  loop through tab
1ed70 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  le entries that 
1ed80 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65  match term pOrTe
1ed90 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  rm. */.         
1eda0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1edb0 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20  (pSubWInfo);.   
1edc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1edd0 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
1ede0 3e 75 2e 70 43 6f 76 69 64 78 20 3d 20 70 43 6f  >u.pCovidx = pCo
1edf0 76 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 76 20  v;.    if( pCov 
1ee00 29 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ) pLevel->iIdxCu
1ee10 72 20 3d 20 69 43 6f 76 43 75 72 3b 0a 20 20 20  r = iCovCur;.   
1ee20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b   if( pAndExpr ){
1ee30 0a 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d  .      pAndExpr-
1ee40 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20  >pLeft = 0;.    
1ee50 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1ee60 65 74 65 28 64 62 2c 20 70 41 6e 64 45 78 70 72  ete(db, pAndExpr
1ee70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1ee80 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
1ee90 28 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71  (v, iRetInit, sq
1eea0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1eeb0 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71  Addr(v));.    sq
1eec0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1eed0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
1eee0 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
1eef0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ef00 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1ef10 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20  iLoopBody);..   
1ef20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   if( pWInfo->nLe
1ef30 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53  vel>1 ) sqlite3S
1ef40 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70 4f 72  tackFree(db, pOr
1ef50 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20 21 75  Tab);.    if( !u
1ef60 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 64  ntestedTerms ) d
1ef70 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1ef80 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c  l, pTerm);.  }el
1ef90 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
1efa0 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
1efb0 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b  MIZATION */..  {
1efc0 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 36 3a 20  .    /* Case 6: 
1efd0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61   There is no usa
1efe0 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d  ble index.  We m
1eff0 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74  ust do a complet
1f000 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
1f010 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e    scan of the en
1f020 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20  tire table..    
1f030 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  */.    static co
1f040 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d 20 3d  nst u8 aStep[] =
1f050 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50   { OP_Next, OP_P
1f060 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61 74 69  rev };.    stati
1f070 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72  c const u8 aStar
1f080 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e  t[] = { OP_Rewin
1f090 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20  d, OP_Last };.  
1f0a0 20 20 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d    assert( bRev==
1f0b0 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a  0 || bRev==1 );.
1f0c0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1f0d0 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20 20   aStep[bRev];.  
1f0e0 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
1f0f0 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  Cur;.    pLevel-
1f100 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  >p2 = 1 + sqlite
1f110 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 61  3VdbeAddOp2(v, a
1f120 53 74 61 72 74 5b 62 52 65 76 5d 2c 20 69 43 75  Start[bRev], iCu
1f130 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  r, addrBrk);.   
1f140 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51   pLevel->p5 = SQ
1f150 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
1f160 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20  FULLSCAN_STEP;. 
1f170 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20   }..  /* Insert 
1f180 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76 65  code to test eve
1f190 72 79 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ry subexpression
1f1a0 20 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d   that can be com
1f1b0 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d  pletely.  ** com
1f1c0 70 75 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  puted using the 
1f1d0 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74  current set of t
1f1e0 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ables..  */.  fo
1f1f0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20  r(pTerm=pWC->a, 
1f200 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e  j=pWC->nTerm; j>
1f210 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; j--, pTerm++)
1f220 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a  {.    Expr *pE;.
1f230 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1f240 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
1f250 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
1f260 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
1f270 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
1f280 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20  RM_CODED );.    
1f290 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
1f2a0 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
1f2b0 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  AL|TERM_CODED) )
1f2c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
1f2d0 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
1f2e0 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e  qAll & pLevel->n
1f2f0 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20  otReady)!=0 ){. 
1f300 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1f310 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
1f320 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20 20  erms==0.        
1f330 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
1f340 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
1f350 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
1f360 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  NLY)!=0 );.     
1f370 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
1f380 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20  dTerms = 1;.    
1f390 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1f3a0 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d  }.    pE = pTerm
1f3b0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ->pExpr;.    ass
1f3c0 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20  ert( pE!=0 );.  
1f3d0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
1f3e0 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72  eftJoin && !Expr
1f3f0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
1f400 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
1f410 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1f420 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1f430 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1f440 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e  rse, pE, addrCon
1f450 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  t, SQLITE_JUMPIF
1f460 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65 72 6d  NULL);.    pTerm
1f470 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
1f480 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20  M_CODED;.  }..  
1f490 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74  /* Insert code t
1f4a0 6f 20 74 65 73 74 20 66 6f 72 20 69 6d 70 6c 69  o test for impli
1f4b0 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62  ed constraints b
1f4c0 61 73 65 64 20 6f 6e 20 74 72 61 6e 73 69 74 69  ased on transiti
1f4d0 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74 68 65  vity.  ** of the
1f4e0 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72 2e 0a   "==" operator..
1f4f0 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c    **.  ** Exampl
1f500 65 3a 20 49 66 20 74 68 65 20 57 48 45 52 45 20  e: If the WHERE 
1f510 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
1f520 22 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e 64 20  "t1.a=t2.b" and 
1f530 22 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a 2a 20  "t2.b=123".  ** 
1f540 61 6e 64 20 77 65 20 61 72 65 20 63 6f 64 69 6e  and we are codin
1f550 67 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e  g the t1 loop an
1f560 64 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 68 61  d the t2 loop ha
1f570 73 20 6e 6f 74 20 79 65 74 20 63 6f 64 65 64 2c  s not yet coded,
1f580 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65 20 63 61  .  ** then we ca
1f590 6e 6e 6f 74 20 75 73 65 20 74 68 65 20 22 74 31  nnot use the "t1
1f5a0 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74 72 61  .a=t2.b" constra
1f5b0 69 6e 74 2c 20 62 75 74 20 77 65 20 63 61 6e 20  int, but we can 
1f5c0 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20 69 6d  code.  ** the im
1f5d0 70 6c 69 65 64 20 22 74 31 2e 61 3d 31 32 33 22  plied "t1.a=123"
1f5e0 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a   constraint..  *
1f5f0 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  /.  for(pTerm=pW
1f600 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65  C->a, j=pWC->nTe
1f610 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54  rm; j>0; j--, pT
1f620 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  erm++){.    Expr
1f630 20 2a 70 45 2c 20 2a 70 45 41 6c 74 3b 0a 20 20   *pE, *pEAlt;.  
1f640 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6c    WhereTerm *pAl
1f650 74 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  t;.    if( pTerm
1f660 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
1f670 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
1f680 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
1f690 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
1f6a0 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28 57 4f 5f  >eOperator!=(WO_
1f6b0 45 51 55 49 56 7c 57 4f 5f 45 51 29 20 29 20 63  EQUIV|WO_EQ) ) c
1f6c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
1f6d0 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
1f6e0 6f 72 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69  or!=iCur ) conti
1f6f0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  nue;.    if( pLe
1f700 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
1f710 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
1f720 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
1f730 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
1f740 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1f750 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  E, EP_FromJoin) 
1f760 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
1f770 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
1f780 68 74 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  ht & pLevel->not
1f790 52 65 61 64 79 29 21 3d 30 20 29 3b 0a 20 20 20  Ready)!=0 );.   
1f7a0 20 70 41 6c 74 20 3d 20 66 69 6e 64 54 65 72 6d   pAlt = findTerm
1f7b0 28 70 57 43 2c 20 69 43 75 72 2c 20 70 54 65 72  (pWC, iCur, pTer
1f7c0 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 2c  m->u.leftColumn,
1f7d0 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51   notReady, WO_EQ
1f7e0 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20  |WO_IN, 0);.    
1f7f0 69 66 28 20 70 41 6c 74 3d 3d 30 20 29 20 63 6f  if( pAlt==0 ) co
1f800 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
1f810 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  pAlt->wtFlags & 
1f820 28 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  (TERM_CODED) ) c
1f830 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 74 65 73  ontinue;.    tes
1f840 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70  tcase( pAlt->eOp
1f850 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29  erator & WO_EQ )
1f860 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1f870 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pAlt->eOperator 
1f880 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 56  & WO_IN );.    V
1f890 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
1f8a0 28 28 76 2c 20 22 62 65 67 69 6e 20 74 72 61 6e  ((v, "begin tran
1f8b0 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e  sitive constrain
1f8c0 74 22 29 29 3b 0a 20 20 20 20 70 45 41 6c 74 20  t"));.    pEAlt 
1f8d0 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c  = sqlite3StackAl
1f8e0 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
1f8f0 66 28 2a 70 45 41 6c 74 29 29 3b 0a 20 20 20 20  f(*pEAlt));.    
1f900 69 66 28 20 70 45 41 6c 74 20 29 7b 0a 20 20 20  if( pEAlt ){.   
1f910 20 20 20 2a 70 45 41 6c 74 20 3d 20 2a 70 41 6c     *pEAlt = *pAl
1f920 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  t->pExpr;.      
1f930 70 45 41 6c 74 2d 3e 70 4c 65 66 74 20 3d 20 70  pEAlt->pLeft = p
1f940 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  E->pLeft;.      
1f950 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1f960 73 65 28 70 50 61 72 73 65 2c 20 70 45 41 6c 74  se(pParse, pEAlt
1f970 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
1f980 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
1f990 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 61        sqlite3Sta
1f9a0 63 6b 46 72 65 65 28 64 62 2c 20 70 45 41 6c 74  ckFree(db, pEAlt
1f9b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1f9c0 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f 55  /* For a LEFT OU
1f9d0 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61  TER JOIN, genera
1f9e0 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
1f9f0 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  l record the fac
1fa00 74 20 74 68 61 74 0a 20 20 2a 2a 20 61 74 20 6c  t that.  ** at l
1fa10 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  east one row of 
1fa20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
1fa30 68 61 73 20 6d 61 74 63 68 65 64 20 74 68 65 20  has matched the 
1fa40 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20  left table.  .  
1fa50 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  */.  if( pLevel-
1fa60 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  >iLeftJoin ){.  
1fa70 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69    pLevel->addrFi
1fa80 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rst = sqlite3Vdb
1fa90 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1faa0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1fab0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1fac0 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d  eger, 1, pLevel-
1fad0 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
1fae0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1faf0 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f   "record LEFT JO
1fb00 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20 73  IN hit"));.    s
1fb10 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
1fb20 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
1fb30 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
1fb40 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e  >a, j=0; j<pWC->
1fb50 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72  nTerm; j++, pTer
1fb60 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65 73 74  m++){.      test
1fb70 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
1fb80 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
1fb90 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UAL );.      tes
1fba0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
1fbb0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
1fbc0 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ED );.      if( 
1fbd0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1fbe0 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
1fbf0 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
1fc00 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
1fc10 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
1fc20 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  ll & pLevel->not
1fc30 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20  Ready)!=0 ){.   
1fc40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49       assert( pWI
1fc50 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
1fc60 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ms );.        co
1fc70 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
1fc80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
1fc90 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  erm->pExpr );.  
1fca0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1fcb0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1fcc0 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64 64  Term->pExpr, add
1fcd0 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55  rCont, SQLITE_JU
1fce0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
1fcf0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
1fd00 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
1fd10 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1fd20 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1fd30 28 70 50 61 72 73 65 2c 20 69 52 65 6c 65 61 73  (pParse, iReleas
1fd40 65 52 65 67 29 3b 0a 0a 20 20 72 65 74 75 72 6e  eReg);..  return
1fd50 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64   pLevel->notRead
1fd60 79 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  y;.}..#if define
1fd70 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  d(WHERETRACE_ENA
1fd80 42 4c 45 44 29 20 26 26 20 64 65 66 69 6e 65 64  BLED) && defined
1fd90 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54  (SQLITE_ENABLE_T
1fda0 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a  REE_EXPLAIN)./*.
1fdb0 2a 2a 20 47 65 6e 65 72 61 74 65 20 22 45 78 70  ** Generate "Exp
1fdc0 6c 61 6e 61 74 69 6f 6e 22 20 74 65 78 74 20 66  lanation" text f
1fdd0 6f 72 20 61 20 57 68 65 72 65 54 65 72 6d 2e 0a  or a WhereTerm..
1fde0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1fdf0 68 65 72 65 45 78 70 6c 61 69 6e 54 65 72 6d 28  hereExplainTerm(
1fe00 56 64 62 65 20 2a 76 2c 20 57 68 65 72 65 54 65  Vdbe *v, WhereTe
1fe10 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 63 68  rm *pTerm){.  ch
1fe20 61 72 20 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 6d  ar zType[4];.  m
1fe30 65 6d 63 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e  emcpy(zType, "..
1fe40 2e 22 2c 20 34 29 3b 0a 20 20 69 66 28 20 70 54  .", 4);.  if( pT
1fe50 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
1fe60 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 7a 54  ERM_VIRTUAL ) zT
1fe70 79 70 65 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20  ype[0] = 'V';.  
1fe80 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
1fe90 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 20  ator & WO_EQUIV 
1fea0 20 29 20 7a 54 79 70 65 5b 31 5d 20 3d 20 27 45   ) zType[1] = 'E
1feb0 27 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ';.  if( ExprHas
1fec0 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
1fed0 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
1fee0 69 6e 29 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d  in) ) zType[2] =
1fef0 20 27 4c 27 3b 0a 20 20 73 71 6c 69 74 65 33 45   'L';.  sqlite3E
1ff00 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 76 2c 20  xplainPrintf(v, 
1ff10 22 25 73 20 22 2c 20 7a 54 79 70 65 29 3b 0a 20  "%s ", zType);. 
1ff20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1ff30 78 70 72 28 76 2c 20 70 54 65 72 6d 2d 3e 70 45  xpr(v, pTerm->pE
1ff40 78 70 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  xpr);.}.#endif /
1ff50 2a 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  * WHERETRACE_ENA
1ff60 42 4c 45 44 20 26 26 20 53 51 4c 49 54 45 5f 45  BLED && SQLITE_E
1ff70 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41  NABLE_TREE_EXPLA
1ff80 49 4e 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57  IN */...#ifdef W
1ff90 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
1ffa0 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  D./*.** Print a 
1ffb0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1ffc0 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70   for debugging p
1ffd0 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69  urposes.*/.stati
1ffe0 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
1fff0 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20  Print(WhereLoop 
20000 2a 70 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20  *p, WhereClause 
20010 2a 70 57 43 29 7b 0a 20 20 57 68 65 72 65 49 6e  *pWC){.  WhereIn
20020 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43  fo *pWInfo = pWC
20030 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20  ->pWInfo;.  int 
20040 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e  nb = 1+(pWInfo->
20050 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 37  pTabList->nSrc+7
20060 29 2f 38 3b 0a 20 20 73 74 72 75 63 74 20 53 72  )/8;.  struct Sr
20070 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
20080 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  m = pWInfo->pTab
20090 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61  List->a + p->iTa
200a0 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  b;.  Table *pTab
200b0 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
200c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
200d0 69 6e 74 66 28 22 25 63 25 32 64 2e 25 30 2a 6c  intf("%c%2d.%0*l
200e0 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63  lx.%0*llx", p->c
200f0 49 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Id,.            
20100 20 20 20 20 20 20 20 20 20 70 2d 3e 69 54 61 62           p->iTab
20110 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c  , nb, p->maskSel
20120 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71  f, nb, p->prereq
20130 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
20140 67 50 72 69 6e 74 66 28 22 20 25 31 32 73 22 2c  gPrintf(" %12s",
20150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20160 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c        pItem->zAl
20170 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c  ias ? pItem->zAl
20180 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d  ias : pTab->zNam
20190 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73  e);.  if( (p->ws
201a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
201b0 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
201c0 7b 0a 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  {.     const cha
201d0 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69  r *zName;.     i
201e0 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  f( p->u.btree.pI
201f0 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65 20 3d  ndex && (zName =
20200 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
20210 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ex->zName)!=0 ){
20220 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
20230 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
20240 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31  e_autoindex_", 1
20250 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  7)==0 ){.       
20260 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33   int i = sqlite3
20270 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20  Strlen30(zName) 
20280 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69  - 1;.        whi
20290 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f  le( zName[i]!='_
202a0 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20  ' ) i--;.       
202b0 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20   zName += i;.   
202c0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
202d0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2e  e3DebugPrintf(".
202e0 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d  %-16s %2d", zNam
202f0 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  e, p->u.btree.nE
20300 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  q);.    }else{. 
20310 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
20320 67 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c 22  gPrintf("%20s","
20330 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ");.    }.  }els
20340 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  e{.    char *z;.
20350 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74 61      if( p->u.vta
20360 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20  b.idxStr ){.    
20370 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
20380 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73 5c  rintf("(%d,\"%s\
20390 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20 20  ",%x)",.        
203a0 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61          p->u.vta
203b0 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76  b.idxNum, p->u.v
203c0 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75  tab.idxStr, p->u
203d0 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b  .vtab.omitMask);
203e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
203f0 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
20400 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22 2c  rintf("(%d,%x)",
20410 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75   p->u.vtab.idxNu
20420 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  m, p->u.vtab.omi
20430 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  tMask);.    }.  
20440 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
20450 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20 7a  intf(" %-19s", z
20460 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
20470 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 73 71  ree(z);.  }.  sq
20480 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
20490 28 22 20 66 20 25 30 34 78 20 4e 20 25 64 22 2c  (" f %04x N %d",
204a0 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e   p->wsFlags, p->
204b0 6e 4c 54 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74  nLTerm);.  sqlit
204c0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
204d0 63 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22  cost %d,%d,%d\n"
204e0 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e  , p->rSetup, p->
204f0 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a  rRun, p->nOut);.
20500 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
20510 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49  ABLE_TREE_EXPLAI
20520 4e 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 30 78  N.  /* If the 0x
20530 31 30 30 20 62 69 74 20 6f 66 20 77 68 65 72 65  100 bit of where
20540 74 72 61 63 69 6e 67 20 69 73 20 73 65 74 2c 20  tracing is set, 
20550 74 68 65 6e 20 73 68 6f 77 20 61 6c 6c 20 6f 66  then show all of
20560 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 0a   the constraint.
20570 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73    ** expressions
20580 20 69 6e 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   in the WhereLoo
20590 70 2e 61 4c 54 65 72 6d 5b 5d 20 61 72 72 61 79  p.aLTerm[] array
205a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
205b0 6e 4c 54 65 72 6d 20 26 26 20 28 73 71 6c 69 74  nLTerm && (sqlit
205c0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
205d0 78 31 30 30 29 21 3d 30 20 29 7b 20 20 2f 2a 20  x100)!=0 ){  /* 
205e0 57 48 45 52 45 54 52 41 43 45 20 30 78 31 30 30  WHERETRACE 0x100
205f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   */.    int i;. 
20600 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 57 49     Vdbe *v = pWI
20610 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 70 56 64  nfo->pParse->pVd
20620 62 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  be;.    sqlite3E
20630 78 70 6c 61 69 6e 42 65 67 69 6e 28 76 29 3b 0a  xplainBegin(v);.
20640 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
20650 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a  ->nLTerm; i++){.
20660 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
20670 2a 70 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65  *pTerm = p->aLTe
20680 72 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  rm[i];.      if(
20690 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74   pTerm==0 ) cont
206a0 69 6e 75 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  inue;.      sqli
206b0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
206c0 28 76 2c 20 22 20 20 28 25 64 29 20 23 25 2d 32  (v, "  (%d) #%-2
206d0 64 20 22 2c 20 69 2b 31 2c 20 28 69 6e 74 29 28  d ", i+1, (int)(
206e0 70 54 65 72 6d 2d 70 57 43 2d 3e 61 29 29 3b 0a  pTerm-pWC->a));.
206f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20700 6c 61 69 6e 50 75 73 68 28 76 29 3b 0a 20 20 20  lainPush(v);.   
20710 20 20 20 77 68 65 72 65 45 78 70 6c 61 69 6e 54     whereExplainT
20720 65 72 6d 28 76 2c 20 70 54 65 72 6d 29 3b 0a 20  erm(v, pTerm);. 
20730 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
20740 61 69 6e 50 6f 70 28 76 29 3b 0a 20 20 20 20 20  ainPop(v);.     
20750 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
20760 4c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  L(v);.    }.    
20770 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 46 69  sqlite3ExplainFi
20780 6e 69 73 68 28 76 29 3b 0a 20 20 20 20 73 71 6c  nish(v);.    sql
20790 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
207a0 22 25 73 22 2c 20 73 71 6c 69 74 65 33 56 64 62  "%s", sqlite3Vdb
207b0 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28 76 29 29  eExplanation(v))
207c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 23  ;.  }.#endif.}.#
207d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  endif../*.** Con
207e0 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72 79  vert bulk memory
207f0 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 57 68   into a valid Wh
20800 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63 61 6e  ereLoop that can
20810 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f   be passed.** to
20820 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 20   whereLoopClear 
20830 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73  harmlessly..*/.s
20840 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
20850 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65 4c 6f  LoopInit(WhereLo
20860 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c 54  op *p){.  p->aLT
20870 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 53  erm = p->aLTermS
20880 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72  pace;.  p->nLTer
20890 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c  m = 0;.  p->nLSl
208a0 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70  ot = ArraySize(p
208b0 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3b 0a  ->aLTermSpace);.
208c0 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30    p->wsFlags = 0
208d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
208e0 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 75   the WhereLoop.u
208f0 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20 57   union.  Leave W
20900 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20  hereLoop.pLTerm 
20910 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  intact..*/.stati
20920 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
20930 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69 74  ClearUnion(sqlit
20940 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
20950 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  p *p){.  if( p->
20960 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
20970 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c 57 48  _VIRTUALTABLE|WH
20980 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20  ERE_AUTO_INDEX) 
20990 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77  ){.    if( (p->w
209a0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
209b0 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
209c0 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  && p->u.vtab.nee
209d0 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 73  dFree ){.      s
209e0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 75  qlite3_free(p->u
209f0 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20  .vtab.idxStr);. 
20a00 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 6e       p->u.vtab.n
20a10 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  eedFree = 0;.   
20a20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78     p->u.vtab.idx
20a30 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Str = 0;.    }el
20a40 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  se if( (p->wsFla
20a50 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
20a60 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 2d 3e  INDEX)!=0 && p->
20a70 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d  u.btree.pIndex!=
20a80 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
20a90 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
20aa0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
20ab0 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20 20  zColAff);.      
20ac0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
20ad0 72 65 66 28 70 2d 3e 75 2e 62 74 72 65 65 2e 70  ref(p->u.btree.p
20ae0 49 6e 64 65 78 2d 3e 70 4b 65 79 49 6e 66 6f 29  Index->pKeyInfo)
20af0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
20b00 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62  bFree(db, p->u.b
20b10 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20  tree.pIndex);.  
20b20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70      p->u.btree.p
20b30 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d  Index = 0;.    }
20b40 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
20b50 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e 61  allocate interna
20b60 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
20b70 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
20b80 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
20b90 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  id whereLoopClea
20ba0 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  r(sqlite3 *db, W
20bb0 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
20bc0 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70  if( p->aLTerm!=p
20bd0 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20  ->aLTermSpace ) 
20be0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
20bf0 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20  , p->aLTerm);.  
20c00 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
20c10 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77 68  ion(db, p);.  wh
20c20 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a  ereLoopInit(p);.
20c30 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73  }../*.** Increas
20c40 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
20c50 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f  ocation for pLoo
20c60 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62  p->aLTerm[] to b
20c70 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f  e at least n..*/
20c80 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
20c90 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69  eLoopResize(sqli
20ca0 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
20cb0 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20  op *p, int n){. 
20cc0 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e   WhereTerm **paN
20cd0 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53  ew;.  if( p->nLS
20ce0 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20  lot>=n ) return 
20cf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d  SQLITE_OK;.  n =
20d00 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e   (n+7)&~7;.  paN
20d10 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
20d20 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
20d30 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29  of(p->aLTerm[0])
20d40 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65 77  *n);.  if( paNew
20d50 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
20d60 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
20d70 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c  cpy(paNew, p->aL
20d80 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  Term, sizeof(p->
20d90 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c  aLTerm[0])*p->nL
20da0 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Slot);.  if( p->
20db0 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72  aLTerm!=p->aLTer
20dc0 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33  mSpace ) sqlite3
20dd0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
20de0 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65  Term);.  p->aLTe
20df0 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d  rm = paNew;.  p-
20e00 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72  >nLSlot = n;.  r
20e10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20e20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66  .}../*.** Transf
20e30 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  er content from 
20e40 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70  the second pLoop
20e50 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74 2e   into the first.
20e60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
20e70 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c  hereLoopXfer(sql
20e80 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
20e90 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c  oop *pTo, WhereL
20ea0 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77  oop *pFrom){.  w
20eb0 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
20ec0 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69  on(db, pTo);.  i
20ed0 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
20ee0 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f  ze(db, pTo, pFro
20ef0 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20  m->nLTerm) ){.  
20f00 20 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75    memset(&pTo->u
20f10 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d  , 0, sizeof(pTo-
20f20 3e 75 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >u));.    return
20f30 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
20f40 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c   }.  memcpy(pTo,
20f50 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f   pFrom, WHERE_LO
20f60 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d  OP_XFER_SZ);.  m
20f70 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72  emcpy(pTo->aLTer
20f80 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d  m, pFrom->aLTerm
20f90 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69  , pTo->nLTerm*si
20fa0 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d  zeof(pTo->aLTerm
20fb0 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46 72  [0]));.  if( pFr
20fc0 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  om->wsFlags & WH
20fd0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
20fe0 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75   ){.    pFrom->u
20ff0 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
21000 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
21010 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20  (pFrom->wsFlags 
21020 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
21030 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 46  EX)!=0 ){.    pF
21040 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  rom->u.btree.pIn
21050 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  dex = 0;.  }.  r
21060 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21070 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
21080 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
21090 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
210a0 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65  id whereLoopDele
210b0 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
210c0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
210d0 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28   whereLoopClear(
210e0 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65  db, p);.  sqlite
210f0 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
21100 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20  }../*.** Free a 
21110 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
21120 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ure.*/.static vo
21130 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  id whereInfoFree
21140 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
21150 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
21160 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  {.  if( ALWAYS(p
21170 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 77 68  WInfo) ){.    wh
21180 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
21190 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20  pWInfo->sWC);.  
211a0 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d    while( pWInfo-
211b0 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20  >pLoops ){.     
211c0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20   WhereLoop *p = 
211d0 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a  pWInfo->pLoops;.
211e0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c        pWInfo->pL
211f0 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c  oops = p->pNextL
21200 6f 6f 70 3b 0a 20 20 20 20 20 20 77 68 65 72 65  oop;.      where
21210 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70  LoopDelete(db, p
21220 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
21230 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
21240 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  WInfo);.  }.}../
21250 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72  *.** Insert or r
21260 65 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f  eplace a WhereLo
21270 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74  op entry using t
21280 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70  he template supp
21290 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  lied..**.** An e
212a0 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
212b0 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65  p entry might be
212c0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20   overwritten if 
212d0 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65  the new template
212e0 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e  .** is better an
212f0 64 20 68 61 73 20 66 65 77 65 72 20 64 65 70 65  d has fewer depe
21300 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68  ndencies.  Or th
21310 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20  e template will 
21320 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e  be ignored.** an
21330 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c  d no insert will
21340 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78 69   occur if an exi
21350 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
21360 69 73 20 66 61 73 74 65 72 20 61 6e 64 20 68 61  is faster and ha
21370 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e  s.** fewer depen
21380 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65  dencies than the
21390 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65   template.  Othe
213a0 72 77 69 73 65 20 61 20 6e 65 77 20 57 68 65 72  rwise a new Wher
213b0 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65  eLoop is.** adde
213c0 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74  d based on the t
213d0 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49  emplate..**.** I
213e0 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  f pBuilder->pOrS
213f0 65 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  et is not NULL t
21400 68 65 6e 20 77 65 20 6f 6e 6c 79 20 63 61 72 65  hen we only care
21410 20 61 62 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a   about only the.
21420 2a 2a 20 70 72 65 72 65 71 75 69 73 69 74 65 73  ** prerequisites
21430 20 61 6e 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f   and rRun and nO
21440 75 74 20 63 6f 73 74 73 20 6f 66 20 74 68 65 20  ut costs of the 
21450 4e 20 62 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54  N best loops.  T
21460 68 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  hat.** informati
21470 6f 6e 20 69 73 20 67 61 74 68 65 72 65 64 20 69  on is gathered i
21480 6e 20 74 68 65 20 70 42 75 69 6c 64 65 72 2d 3e  n the pBuilder->
21490 70 4f 72 53 65 74 20 6f 62 6a 65 63 74 2e 20 20  pOrSet object.  
214a0 54 68 69 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20  This special.** 
214b0 70 72 6f 63 65 73 73 69 6e 67 20 6d 6f 64 65 20  processing mode 
214c0 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72  is used only for
214d0 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65   OR clause proce
214e0 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ssing..**.** Whe
214f0 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d  n accumulating m
21500 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77  ultiple loops (w
21510 68 65 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  hen pBuilder->pO
21520 72 53 65 74 20 69 73 20 4e 55 4c 4c 29 20 77 65  rSet is NULL) we
21530 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67 68 74 20  .** still might 
21540 6f 76 65 72 77 72 69 74 65 20 73 69 6d 69 6c 61  overwrite simila
21550 72 20 6c 6f 6f 70 73 20 77 69 74 68 20 74 68 65  r loops with the
21560 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 66   new template if
21570 20 74 68 65 0a 2a 2a 20 74 65 6d 70 6c 61 74 65   the.** template
21580 20 69 73 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f   is better.  Loo
21590 70 73 20 6d 61 79 20 62 65 20 6f 76 65 72 77 72  ps may be overwr
215a0 69 74 74 65 6e 20 69 66 20 74 68 65 20 66 6f 6c  itten if the fol
215b0 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69  lowing .** condi
215c0 74 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a  tions are met:.*
215d0 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65  *.**    (1)  The
215e0 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  y have the same 
215f0 69 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20  iTab..**    (2) 
21600 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73   They have the s
21610 61 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a  ame iSortIdx..**
21620 20 20 20 20 28 33 29 20 20 54 68 65 20 74 65 6d      (3)  The tem
21630 70 6c 61 74 65 20 68 61 73 20 73 61 6d 65 20 6f  plate has same o
21640 72 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  r fewer dependen
21650 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 63 75  cies than the cu
21660 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20  rrent loop.**   
21670 20 28 34 29 20 20 54 68 65 20 74 65 6d 70 6c 61   (4)  The templa
21680 74 65 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  te has the same 
21690 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68  or lower cost th
216a0 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  an the current l
216b0 6f 6f 70 0a 2a 2a 20 20 20 20 28 35 29 20 20 54  oop.**    (5)  T
216c0 68 65 20 74 65 6d 70 6c 61 74 65 20 75 73 65 73  he template uses
216d0 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 74   more terms of t
216e0 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 62 75  he same index bu
216f0 74 20 68 61 73 20 6e 6f 20 61 64 64 69 74 69 6f  t has no additio
21700 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  nal.**         d
21710 65 70 65 6e 64 65 6e 63 69 65 73 20 20 20 20 20  ependencies     
21720 20 20 20 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20       .*/.static 
21730 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  int whereLoopIns
21740 65 72 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  ert(WhereLoopBui
21750 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
21760 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
21770 6c 61 74 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f  late){.  WhereLo
21780 6f 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a 70 2c  op **ppPrev, *p,
21790 20 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 57   *pNext = 0;.  W
217a0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
217b0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
217c0 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nfo;.  sqlite3 *
217d0 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
217e0 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  rse->db;..  /* I
217f0 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  f pBuilder->pOrS
21800 65 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  et is defined, t
21810 68 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72  hen only keep tr
21820 61 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73  ack of the costs
21830 0a 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71  .  ** and prereq
21840 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  s..  */.  if( pB
21850 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d  uilder->pOrSet!=
21860 30 20 29 7b 0a 23 69 66 20 57 48 45 52 45 54 52  0 ){.#if WHERETR
21870 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
21880 75 31 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72  u16 n = pBuilder
21890 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20  ->pOrSet->n;.   
218a0 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a   int x =.#endif.
218b0 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72      whereOrInser
218c0 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  t(pBuilder->pOrS
218d0 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  et, pTemplate->p
218e0 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65  rereq, pTemplate
218f0 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20  ->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 70 54 65 6d              pTem
21920 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69  plate->nOut);.#i
21930 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
21940 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
21950 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
21960 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
21970 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
21980 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20  ebugPrintf(x?"  
21990 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f   or-%d:  ":"   o
219a0 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20  r-X:  ", n);.   
219b0 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
219c0 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75  t(pTemplate, pBu
219d0 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20  ilder->pWC);.   
219e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65   }.#endif.    re
219f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21a00 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
21a10 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
21a20 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 6f 76   WhereLoop to ov
21a30 65 72 77 72 69 74 65 2c 20 6f 72 20 77 68 69 63  erwrite, or whic
21a40 68 20 74 61 6b 65 73 0a 20 20 2a 2a 20 70 72 69  h takes.  ** pri
21a50 6f 72 69 74 79 20 6f 76 65 72 20 70 54 65 6d 70  ority over pTemp
21a60 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  late..  */.  for
21a70 28 70 70 50 72 65 76 3d 26 70 57 49 6e 66 6f 2d  (ppPrev=&pWInfo-
21a80 3e 70 4c 6f 6f 70 73 2c 20 70 3d 2a 70 70 50 72  >pLoops, p=*ppPr
21a90 65 76 3b 20 70 3b 20 70 70 50 72 65 76 3d 26 70  ev; p; ppPrev=&p
21aa0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a  ->pNextLoop, p=*
21ab0 70 70 50 72 65 76 29 7b 0a 20 20 20 20 69 66 28  ppPrev){.    if(
21ac0 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c   p->iTab!=pTempl
21ad0 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e  ate->iTab || p->
21ae0 69 53 6f 72 74 49 64 78 21 3d 70 54 65 6d 70 6c  iSortIdx!=pTempl
21af0 61 74 65 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b  ate->iSortIdx ){
21b00 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 65 69 74  .      /* If eit
21b10 68 65 72 20 74 68 65 20 69 54 61 62 20 6f 72 20  her the iTab or 
21b20 69 53 6f 72 74 49 64 78 20 76 61 6c 75 65 73 20  iSortIdx values 
21b30 66 6f 72 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f  for two WhereLoo
21b40 70 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 0a  p are different.
21b50 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
21b60 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e  ose WhereLoops n
21b70 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64  eed to be consid
21b80 65 72 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  ered separately.
21b90 20 20 4e 65 69 74 68 65 72 20 69 73 0a 20 20 20    Neither is.   
21ba0 20 20 20 2a 2a 20 61 20 63 61 6e 64 69 64 61 74     ** a candidat
21bb0 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65  e to replace the
21bc0 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20   other. */.     
21bd0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
21be0 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 63  .    /* In the c
21bf0 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
21c00 61 74 69 6f 6e 2c 20 74 68 65 20 72 53 65 74 75  ation, the rSetu
21c10 70 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65  p value is eithe
21c20 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72  r zero.    ** or
21c30 20 74 68 65 20 63 6f 73 74 20 6f 66 20 62 75 69   the cost of bui
21c40 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74  lding an automat
21c50 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29  ic index (NlogN)
21c60 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20   and the NlogN. 
21c70 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d     ** is the sam
21c80 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65  e for compatible
21c90 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a   WhereLoops. */.
21ca0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
21cb0 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d  Setup==0 || pTem
21cc0 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30  plate->rSetup==0
21cd0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
21ce0 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d     || p->rSetup=
21cf0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
21d00 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68  up );..    /* wh
21d10 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
21d20 29 20 61 6c 77 61 79 73 20 67 65 6e 65 72 61 74  ) always generat
21d30 65 73 20 61 6e 64 20 69 6e 73 65 72 74 73 20 74  es and inserts t
21d40 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
21d50 65 78 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 66  ex.    ** case f
21d60 69 72 73 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d  irst.  Hence com
21d70 70 61 74 69 62 6c 65 20 63 61 6e 64 69 64 61 74  patible candidat
21d80 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76  e WhereLoops nev
21d90 65 72 20 68 61 76 65 20 61 20 6c 61 72 67 65 72  er have a larger
21da0 0a 20 20 20 20 2a 2a 20 72 53 65 74 75 70 2e 20  .    ** rSetup. 
21db0 43 61 6c 6c 20 74 68 69 73 20 53 45 54 55 50 2d  Call this SETUP-
21dc0 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20  INVARIANT */.   
21dd0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74   assert( p->rSet
21de0 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up>=pTemplate->r
21df0 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 69 66  Setup );..    if
21e00 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
21e10 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
21e20 29 3d 3d 70 2d 3e 70 72 65 72 65 71 0a 20 20 20  )==p->prereq.   
21e30 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d    && p->rSetup<=
21e40 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
21e50 70 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  p.     && p->rRu
21e60 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n<=pTemplate->rR
21e70 75 6e 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f  un.     && p->nO
21e80 75 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  ut<=pTemplate->n
21e90 4f 75 74 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Out.    ){.     
21ea0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
21eb0 74 61 6b 65 6e 20 77 68 65 6e 20 70 20 69 73 20  taken when p is 
21ec0 65 71 75 61 6c 20 6f 72 20 62 65 74 74 65 72 20  equal or better 
21ed0 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 20 69  than pTemplate i
21ee0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  n .      ** all 
21ef0 6f 66 20 28 31 29 20 64 65 70 65 6e 64 65 6e 63  of (1) dependenc
21f00 69 65 73 20 28 32 29 20 73 65 74 75 70 2d 63 6f  ies (2) setup-co
21f10 73 74 2c 20 28 33 29 20 72 75 6e 2d 63 6f 73 74  st, (3) run-cost
21f20 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28  , and.      ** (
21f30 34 29 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  4) number of out
21f40 70 75 74 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20  put rows. */.   
21f50 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
21f60 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  etup==pTemplate-
21f70 3e 72 53 65 74 75 70 20 29 3b 0a 20 20 20 20 20  >rSetup );.     
21f80 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71 3d 3d   if( p->prereq==
21f90 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
21fa0 71 0a 20 20 20 20 20 20 20 26 26 20 70 2d 3e 6e  q.       && p->n
21fb0 4c 54 65 72 6d 3c 70 54 65 6d 70 6c 61 74 65 2d  LTerm<pTemplate-
21fc0 3e 6e 4c 54 65 72 6d 0a 20 20 20 20 20 20 20 26  >nLTerm.       &
21fd0 26 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  & (p->wsFlags & 
21fe0 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61  pTemplate->wsFla
21ff0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
22000 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26  ED)!=0.       &&
22010 20 28 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e   (p->u.btree.pIn
22020 64 65 78 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  dex==pTemplate->
22030 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 0a 20  u.btree.pIndex. 
22040 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 65 6d           || pTem
22050 70 6c 61 74 65 2d 3e 72 52 75 6e 2b 70 2d 3e 6e  plate->rRun+p->n
22060 4c 54 65 72 6d 3c 3d 70 2d 3e 72 52 75 6e 2b 70  LTerm<=p->rRun+p
22070 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d  Template->nLTerm
22080 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
22090 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20     /* Overwrite 
220a0 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  an existing Wher
220b0 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 73 69  eLoop with an si
220c0 6d 69 6c 61 72 20 6f 6e 65 20 74 68 61 74 20 75  milar one that u
220d0 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  ses.        ** m
220e0 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ore terms of the
220f0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
22100 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65    pNext = p->pNe
22110 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  xtLoop;.        
22120 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
22130 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70  se{.        /* p
22140 54 65 6d 70 6c 61 74 65 20 69 73 20 6e 6f 74 20  Template is not 
22150 68 65 6c 70 66 75 6c 2e 0a 20 20 20 20 20 20 20  helpful..       
22160 20 2a 2a 20 52 65 74 75 72 6e 20 77 69 74 68 6f   ** Return witho
22170 75 74 20 63 68 61 6e 67 69 6e 67 20 6f 72 20 61  ut changing or a
22180 64 64 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a  dding anything *
22190 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77  /.        goto w
221a0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e  hereLoopInsert_n
221b0 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oop;.      }.   
221c0 20 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70   }.    if( (p->p
221d0 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74  rereq & pTemplat
221e0 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d  e->prereq)==pTem
221f0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20  plate->prereq.  
22200 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70     && p->rRun>=p
22210 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 0a 20  Template->rRun. 
22220 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d      && p->nOut>=
22230 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 0a  pTemplate->nOut.
22240 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
22250 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65 78 69  Overwrite an exi
22260 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
22270 77 69 74 68 20 61 20 62 65 74 74 65 72 20 6f 6e  with a better on
22280 65 3a 20 6f 6e 65 20 74 68 61 74 20 69 73 0a 20  e: one that is. 
22290 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 61       ** better a
222a0 74 20 6f 6e 65 20 6f 66 20 28 31 29 20 64 65 70  t one of (1) dep
222b0 65 6e 64 65 6e 63 69 65 73 2c 20 28 32 29 20 73  endencies, (2) s
222c0 65 74 75 70 2d 63 6f 73 74 2c 20 28 33 29 20 72  etup-cost, (3) r
222d0 75 6e 2d 63 6f 73 74 0a 20 20 20 20 20 20 2a 2a  un-cost.      **
222e0 20 6f 72 20 28 34 29 20 6e 75 6d 62 65 72 20 6f   or (4) number o
222f0 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2c 20 61  f output rows, a
22300 6e 64 20 69 73 20 6e 6f 20 77 6f 72 73 65 20 69  nd is no worse i
22310 6e 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 0a 20  n any of those. 
22320 20 20 20 20 20 2a 2a 20 63 61 74 65 67 6f 72 69       ** categori
22330 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  es. */.      ass
22340 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d  ert( p->rSetup>=
22350 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
22360 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e  p ); /* SETUP-IN
22370 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f  VARIANT above */
22380 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70  .      pNext = p
22390 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
223a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
223b0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
223c0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
223d0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65   it means that e
223e0 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c 64  ither p[] should
223f0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a   be overwritten.
22400 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c    ** with pTempl
22410 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78 69  ate[] if p[] exi
22420 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e 55  sts, or if p==NU
22430 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  LL then allocate
22440 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65 72   a new.  ** Wher
22450 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72 74  eLoop and insert
22460 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57 48   it..  */.#if WH
22470 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
22480 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69 66 28   /* 0x8 */.  if(
22490 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
224a0 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
224b0 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20  if( p!=0 ){.    
224c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
224d0 69 6e 74 66 28 22 69 6e 73 2d 64 65 6c 3a 20 20  intf("ins-del:  
224e0 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  ");.      whereL
224f0 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 42 75 69  oopPrint(p, pBui
22500 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
22510 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
22520 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 6e 65  ugPrintf("ins-ne
22530 77 3a 20 20 22 29 3b 0a 20 20 20 20 77 68 65 72  w:  ");.    wher
22540 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
22550 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
22560 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  pWC);.  }.#endif
22570 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
22580 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62     p = sqlite3Db
22590 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
225a0 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
225b0 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
225c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
225d0 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c  OMEM;.    whereL
225e0 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a  oopInit(p);.  }.
225f0 20 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28    whereLoopXfer(
22600 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65  db, p, pTemplate
22610 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  );.  p->pNextLoo
22620 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 2a 70 70  p = pNext;.  *pp
22630 50 72 65 76 20 3d 20 70 3b 0a 20 20 69 66 28 20  Prev = p;.  if( 
22640 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
22650 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
22660 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65  )==0 ){.    Inde
22670 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75  x *pIndex = p->u
22680 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
22690 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26 26     if( pIndex &&
226a0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30   pIndex->tnum==0
226b0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62   ){.      p->u.b
226c0 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
226d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
226e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
226f0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
22700 66 20 74 68 65 20 69 6e 73 65 72 74 20 69 73 20  f the insert is 
22710 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 77 68 65 72 65  a no-op */.where
22720 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3a  LoopInsert_noop:
22730 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
22740 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
22750 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  /.  if( sqlite3W
22760 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
22770 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
22780 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 6e  bugPrintf("ins-n
22790 6f 6f 70 3a 20 22 29 3b 0a 20 20 20 20 77 68 65  oop: ");.    whe
227a0 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d  reLoopPrint(pTem
227b0 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d  plate, pBuilder-
227c0 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  >pWC);.  }.#endi
227d0 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
227e0 45 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  E_OK;  .}../*.**
227f0 20 41 64 6a 75 73 74 20 74 68 65 20 57 68 65 72   Adjust the Wher
22800 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65  eLoop.nOut value
22810 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63   downward to acc
22820 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f  ount for terms o
22830 66 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63  f the.** WHERE c
22840 6c 61 75 73 65 20 74 68 61 74 20 72 65 66 65 72  lause that refer
22850 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75  ence the loop bu
22860 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
22870 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e  used by an.** in
22880 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  dex..**.** In th
22890 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
228a0 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 66 69  entation, the fi
228b0 72 73 74 20 65 78 74 72 61 20 57 48 45 52 45 20  rst extra WHERE 
228c0 63 6c 61 75 73 65 20 74 65 72 6d 20 72 65 64 75  clause term redu
228d0 63 65 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  ces.** the numbe
228e0 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
228f0 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20   by a factor of 
22900 31 30 20 61 6e 64 20 65 61 63 68 20 61 64 64 69  10 and each addi
22910 74 69 6f 6e 61 6c 20 74 65 72 6d 0a 2a 2a 20 72  tional term.** r
22920 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65  educes the numbe
22930 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
22940 20 62 79 20 73 71 72 74 28 32 29 2e 0a 2a 2f 0a   by sqrt(2)..*/.
22950 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
22960 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73  eLoopOutputAdjus
22970 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
22980 57 43 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  WC, WhereLoop *p
22990 4c 6f 6f 70 29 7b 0a 20 20 57 68 65 72 65 54 65  Loop){.  WhereTe
229a0 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a  rm *pTerm, *pX;.
229b0 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c    Bitmask notAll
229c0 6f 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e  owed = ~(pLoop->
229d0 70 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61  prereq|pLoop->ma
229e0 73 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69  skSelf);.  int i
229f0 2c 20 6a 3b 0a 0a 20 20 69 66 28 20 21 4f 70 74  , j;..  if( !Opt
22a00 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
22a10 28 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50  (pWC->pWInfo->pP
22a20 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45  arse->db, SQLITE
22a30 5f 41 64 6a 75 73 74 4f 75 74 45 73 74 29 20 29  _AdjustOutEst) )
22a40 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
22a50 7d 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e  }.  for(i=pWC->n
22a60 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d  Term, pTerm=pWC-
22a70 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54  >a; i>0; i--, pT
22a80 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
22a90 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
22aa0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21  & TERM_VIRTUAL)!
22ab0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
22ac0 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
22ad0 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d  eqAll & pLoop->m
22ae0 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f  askSelf)==0 ) co
22af0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
22b00 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
22b10 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21  l & notAllowed)!
22b20 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
22b30 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e     for(j=pLoop->
22b40 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20  nLTerm-1; j>=0; 
22b50 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d  j--){.      pX =
22b60 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
22b70 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  ];.      if( pX=
22b80 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
22b90 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65       if( pX==pTe
22ba0 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rm ) break;.    
22bb0 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e    if( pX->iParen
22bc0 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61  t>=0 && (&pWC->a
22bd0 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d  [pX->iParent])==
22be0 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20  pTerm ) break;. 
22bf0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30     }.    if( j<0
22c00 20 29 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b   ) pLoop->nOut +
22c10 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  = pTerm->truthPr
22c20 6f 62 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ob;.  }.}../*.**
22c30 20 57 65 20 68 61 76 65 20 73 6f 20 66 61 72 20   We have so far 
22c40 6d 61 74 63 68 65 64 20 70 42 75 69 6c 64 65 72  matched pBuilder
22c50 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
22c60 6e 45 71 20 74 65 72 6d 73 20 6f 66 20 74 68 65  nEq terms of the
22c70 20 69 6e 64 65 78 20 70 49 6e 64 65 78 2e 0a 2a   index pIndex..*
22c80 2a 20 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f  * Try to match o
22c90 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ne more..**.** I
22ca0 66 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d  f pProbe->tnum==
22cb0 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 70 49  0, that means pI
22cc0 6e 64 65 78 20 69 73 20 61 20 66 61 6b 65 20 69  ndex is a fake i
22cd0 6e 64 65 78 20 75 73 65 64 20 66 6f 72 20 74 68  ndex used for th
22ce0 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
22cf0 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61  MARY KEY..*/.sta
22d00 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
22d10 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 0a  pAddBtreeIndex(.
22d20 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
22d30 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 20  er *pBuilder,   
22d40 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
22d50 6f 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20  op factory */.  
22d60 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
22d70 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20  tem *pSrc,      
22d80 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  /* FROM clause t
22d90 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  erm being analyz
22da0 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
22db0 50 72 6f 62 65 2c 20 20 20 20 20 20 20 20 20 20  Probe,          
22dc0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
22dd0 64 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20  dex on pSrc */. 
22de0 20 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20   LogEst nInMul  
22df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e00 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f   /* log(Number o
22e10 66 20 69 74 65 72 61 74 69 6f 6e 73 20 64 75 65  f iterations due
22e20 20 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20   to IN) */.){.  
22e30 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
22e40 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
22e50 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20  Info;  /* WHERE 
22e60 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78 74 20  analyse context 
22e70 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
22e80 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
22e90 72 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50  rse;        /* P
22ea0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
22eb0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
22ec0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
22ed0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
22ee0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f  connection mallo
22ef0 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  c context */.  W
22f00 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20  hereLoop *pNew; 
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22f20 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65  * Template Where
22f30 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73 74  Loop under const
22f40 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65  ruction */.  Whe
22f50 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
22f60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22f70 41 20 57 68 65 72 65 54 65 72 6d 20 75 6e 64 65  A WhereTerm unde
22f80 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20  r consideration 
22f90 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b  */.  int opMask;
22fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fb0 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70       /* Valid op
22fc0 65 72 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73  erators for cons
22fd0 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65  traints */.  Whe
22fe0 72 65 53 63 61 6e 20 73 63 61 6e 3b 20 20 20 20  reScan scan;    
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23000 49 74 65 72 61 74 6f 72 20 66 6f 72 20 57 48 45  Iterator for WHE
23010 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69  RE terms */.  Bi
23020 74 6d 61 73 6b 20 73 61 76 65 64 5f 70 72 65 72  tmask saved_prer
23030 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  eq;           /*
23040 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
23050 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  of pNew->prereq 
23060 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
23070 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  LTerm;          
23080 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
23090 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
230a0 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20  nLTerm */.  u16 
230b0 73 61 76 65 64 5f 6e 45 71 3b 20 20 20 20 20 20  saved_nEq;      
230c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
230d0 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
230e0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
230f0 45 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  Eq */.  u16 save
23100 64 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20 20 20  d_nSkip;        
23110 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
23120 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
23130 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70  w->u.btree.nSkip
23140 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64 5f   */.  u32 saved_
23150 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  wsFlags;        
23160 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
23170 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
23180 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f  >wsFlags */.  Lo
23190 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b  gEst saved_nOut;
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
231b0 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
231c0 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f  of pNew->nOut */
231d0 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
231e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231f0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
23200 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  he column in the
23210 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
23220 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
23230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
23240 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
23250 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 3b 20  LogEst nRowEst; 
23260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23270 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 69 6e 64  /* Estimated ind
23280 65 78 20 73 65 6c 65 63 74 69 76 69 74 79 20 2a  ex selectivity *
23290 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53  /.  LogEst rLogS
232a0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
232b0 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d      /* Logarithm
232c0 20 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20 2a   of table size *
232d0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
232e0 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d  Top = 0, *pBtm =
232f0 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62   0; /* Top and b
23300 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73  ottom range cons
23310 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e  traints */..  pN
23320 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
23330 4e 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  New;.  if( db->m
23340 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
23350 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
23360 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70  M;..  assert( (p
23370 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
23380 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
23390 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  E)==0 );.  asser
233a0 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  t( (pNew->wsFlag
233b0 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
233c0 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  MIT)==0 );.  if(
233d0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26   pNew->wsFlags &
233e0 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
233f0 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d   ){.    opMask =
23400 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20   WO_LT|WO_LE;.  
23410 7d 65 6c 73 65 20 69 66 28 20 70 50 72 6f 62 65  }else if( pProbe
23420 2d 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70 53  ->tnum<=0 || (pS
23430 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  rc->jointype & J
23440 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20  T_LEFT)!=0 ){.  
23450 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51    opMask = WO_EQ
23460 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_IN|WO_GT|WO_
23470 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a  GE|WO_LT|WO_LE;.
23480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d    }else{.    opM
23490 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49  ask = WO_EQ|WO_I
234a0 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47  N|WO_ISNULL|WO_G
234b0 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f  T|WO_GE|WO_LT|WO
234c0 5f 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _LE;.  }.  if( p
234d0 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65  Probe->bUnordere
234e0 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28  d ) opMask &= ~(
234f0 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c  WO_GT|WO_GE|WO_L
23500 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73  T|WO_LE);..  ass
23510 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72  ert( pNew->u.btr
23520 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e  ee.nEq<=pProbe->
23530 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 69 66 28  nKeyCol );.  if(
23540 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
23550 45 71 20 3c 20 70 50 72 6f 62 65 2d 3e 6e 4b 65  Eq < pProbe->nKe
23560 79 43 6f 6c 20 29 7b 0a 20 20 20 20 69 43 6f 6c  yCol ){.    iCol
23570 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c   = pProbe->aiCol
23580 75 6d 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65  umn[pNew->u.btre
23590 65 2e 6e 45 71 5d 3b 0a 20 20 20 20 6e 52 6f 77  e.nEq];.    nRow
235a0 45 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Est = sqlite3Log
235b0 45 73 74 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f  Est(pProbe->aiRo
235c0 77 45 73 74 5b 70 4e 65 77 2d 3e 75 2e 62 74 72  wEst[pNew->u.btr
235d0 65 65 2e 6e 45 71 2b 31 5d 29 3b 0a 20 20 20 20  ee.nEq+1]);.    
235e0 69 66 28 20 6e 52 6f 77 45 73 74 3d 3d 30 20 26  if( nRowEst==0 &
235f0 26 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f  & pProbe->onErro
23600 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 6e 52 6f  r==OE_None ) nRo
23610 77 45 73 74 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  wEst = 1;.  }els
23620 65 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 2d 31  e{.    iCol = -1
23630 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 3d 20  ;.    nRowEst = 
23640 30 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  0;.  }.  pTerm =
23650 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26   whereScanInit(&
23660 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e  scan, pBuilder->
23670 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  pWC, pSrc->iCurs
23680 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20 20 20 20 20  or, iCol,.      
23690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236a0 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65    opMask, pProbe
236b0 29 3b 0a 20 20 73 61 76 65 64 5f 6e 45 71 20 3d  );.  saved_nEq =
236c0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
236d0 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69  Eq;.  saved_nSki
236e0 70 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  p = pNew->u.btre
236f0 65 2e 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65 64  e.nSkip;.  saved
23700 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e  _nLTerm = pNew->
23710 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f  nLTerm;.  saved_
23720 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e  wsFlags = pNew->
23730 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64  wsFlags;.  saved
23740 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e  _prereq = pNew->
23750 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f  prereq;.  saved_
23760 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75  nOut = pNew->nOu
23770 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  t;.  pNew->rSetu
23780 70 20 3d 20 30 3b 0a 20 20 72 4c 6f 67 53 69 7a  p = 0;.  rLogSiz
23790 65 20 3d 20 65 73 74 4c 6f 67 28 73 71 6c 69 74  e = estLog(sqlit
237a0 65 33 4c 6f 67 45 73 74 28 70 50 72 6f 62 65 2d  e3LogEst(pProbe-
237b0 3e 61 69 52 6f 77 45 73 74 5b 30 5d 29 29 3b 0a  >aiRowEst[0]));.
237c0 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 75  .  /* Consider u
237d0 73 69 6e 67 20 61 20 73 6b 69 70 2d 73 63 61 6e  sing a skip-scan
237e0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   if there are no
237f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
23800 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 61  nstraints.  ** a
23810 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65  vailable for the
23820 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73   left-most terms
23830 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61   of the index, a
23840 6e 64 20 69 66 20 74 68 65 20 61 76 65 72 61 67  nd if the averag
23850 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  e.  ** number of
23860 20 72 65 70 65 61 74 73 20 69 6e 20 74 68 65 20   repeats in the 
23870 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20  left-most terms 
23880 69 73 20 61 74 20 6c 65 61 73 74 20 31 38 2e 20  is at least 18. 
23890 20 54 68 65 20 6d 61 67 69 63 0a 20 20 2a 2a 20   The magic.  ** 
238a0 6e 75 6d 62 65 72 20 31 38 20 77 61 73 20 66 6f  number 18 was fo
238b0 75 6e 64 20 62 79 20 65 78 70 65 72 69 6d 65 6e  und by experimen
238c0 74 61 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65  tation to be the
238d0 20 70 61 79 6f 66 66 20 70 6f 69 6e 74 20 77 68   payoff point wh
238e0 65 72 65 0a 20 20 2a 2a 20 73 6b 69 70 2d 73 63  ere.  ** skip-sc
238f0 61 6e 20 62 65 63 6f 6d 65 20 66 61 73 74 65 72  an become faster
23900 20 74 68 61 6e 20 61 20 66 75 6c 6c 2d 73 63 61   than a full-sca
23910 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  n..  */.  if( pT
23920 65 72 6d 3d 3d 30 0a 20 20 20 26 26 20 73 61 76  erm==0.   && sav
23930 65 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53  ed_nEq==saved_nS
23940 6b 69 70 0a 20 20 20 26 26 20 73 61 76 65 64 5f  kip.   && saved_
23950 6e 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b  nEq+1<pProbe->nK
23960 65 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f  eyCol.   && pPro
23970 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 73 61 76  be->aiRowEst[sav
23980 65 64 5f 6e 45 71 2b 31 5d 3e 3d 31 38 20 20 2f  ed_nEq+1]>=18  /
23990 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75  * TUNING: Minimu
239a0 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20  m for skip-scan 
239b0 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45  */.  ){.    LogE
239c0 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e  st nIter;.    pN
239d0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b  ew->u.btree.nEq+
239e0 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  +;.    pNew->u.b
239f0 74 72 65 65 2e 6e 53 6b 69 70 2b 2b 3b 0a 20 20  tree.nSkip++;.  
23a00 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70    pNew->aLTerm[p
23a10 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d  New->nLTerm++] =
23a20 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73   0;.    pNew->ws
23a30 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 53  Flags |= WHERE_S
23a40 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49 74  KIPSCAN;.    nIt
23a50 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  er = sqlite3LogE
23a60 73 74 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77  st(pProbe->aiRow
23a70 45 73 74 5b 30 5d 2f 70 50 72 6f 62 65 2d 3e 61  Est[0]/pProbe->a
23a80 69 52 6f 77 45 73 74 5b 73 61 76 65 64 5f 6e 45  iRowEst[saved_nE
23a90 71 2b 31 5d 29 3b 0a 20 20 20 20 77 68 65 72 65  q+1]);.    where
23aa0 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
23ab0 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
23ac0 2c 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72 29  , pProbe, nIter)
23ad0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 20 72 63  ;.  }.  for(; rc
23ae0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
23af0 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d  Term!=0; pTerm =
23b00 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26   whereScanNext(&
23b10 73 63 61 6e 29 29 7b 0a 20 20 20 20 69 6e 74 20  scan)){.    int 
23b20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  nIn = 0;.#ifdef 
23b30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
23b40 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
23b50 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d   int nRecValid =
23b60 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
23b70 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20  alid;.#endif.   
23b80 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
23b90 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c  erator==WO_ISNUL
23ba0 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46  L || (pTerm->wtF
23bb0 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29  lags&TERM_VNULL)
23bc0 21 3d 30 29 0a 20 20 20 20 20 26 26 20 28 69 43  !=0).     && (iC
23bd0 6f 6c 3c 30 20 7c 7c 20 70 53 72 63 2d 3e 70 54  ol<0 || pSrc->pT
23be0 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e  ab->aCol[iCol].n
23bf0 6f 74 4e 75 6c 6c 29 0a 20 20 20 20 29 7b 0a 20  otNull).    ){. 
23c00 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f       continue; /
23c10 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54  * ignore IS [NOT
23c20 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  ] NULL constrain
23c30 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63  ts on NOT NULL c
23c40 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a  olumns */.    }.
23c50 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
23c60 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
23c70 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
23c80 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 61 73 73  ntinue;..    ass
23c90 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d  ert( pNew->nOut=
23ca0 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 0a  =saved_nOut );..
23cb0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
23cc0 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67  s = saved_wsFlag
23cd0 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  s;.    pNew->u.b
23ce0 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64  tree.nEq = saved
23cf0 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  _nEq;.    pNew->
23d00 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e  nLTerm = saved_n
23d10 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77  LTerm;.    if( w
23d20 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
23d30 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e  b, pNew, pNew->n
23d40 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b  LTerm+1) ) break
23d50 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20  ; /* OOM */.    
23d60 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65  pNew->aLTerm[pNe
23d70 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70  w->nLTerm++] = p
23d80 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Term;.    pNew->
23d90 70 72 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f  prereq = (saved_
23da0 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e  prereq | pTerm->
23db0 70 72 65 72 65 71 52 69 67 68 74 29 20 26 20 7e  prereqRight) & ~
23dc0 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  pNew->maskSelf;.
23dd0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
23de0 20 72 4c 6f 67 53 69 7a 65 3b 20 2f 2a 20 42 61   rLogSize; /* Ba
23df0 73 65 6c 69 6e 65 20 63 6f 73 74 20 69 73 20 6c  seline cost is l
23e00 6f 67 32 28 4e 29 2e 20 20 41 64 6a 75 73 74 6d  og2(N).  Adjustm
23e10 65 6e 74 73 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ents below */.  
23e20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
23e30 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
23e40 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
23e50 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
23e60 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  pr;.      pNew->
23e70 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
23e80 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20  _COLUMN_IN;.    
23e90 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
23ea0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
23eb0 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
23ec0 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28        /* "x IN (
23ed0 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54  SELECT ...)":  T
23ee0 55 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43  UNING: the SELEC
23ef0 54 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77  T returns 25 row
23f00 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e  s */.        nIn
23f10 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20   = 46;  assert( 
23f20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  46==sqlite3LogEs
23f30 74 28 32 35 29 20 29 3b 0a 20 20 20 20 20 20 7d  t(25) );.      }
23f40 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
23f50 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26  pExpr->x.pList &
23f60 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
23f70 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
23f80 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61      /* "x IN (va
23f90 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29  lue, value, ...)
23fa0 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e  " */.        nIn
23fb0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
23fc0 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
23fd0 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >nExpr);.      }
23fe0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
23ff0 6e 20 2b 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20  n += nIn;.      
24000 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
24010 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  q++;.      pNew-
24020 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20  >nOut = nRowEst 
24030 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a  + nInMul + nIn;.
24040 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
24050 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
24060 20 28 57 4f 5f 45 51 29 20 29 7b 0a 20 20 20 20   (WO_EQ) ){.    
24070 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
24080 20 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73    (pNew->wsFlags
24090 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   & (WHERE_COLUMN
240a0 5f 4e 55 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c 55  _NULL|WHERE_COLU
240b0 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 53 4b 49 50  MN_IN|WHERE_SKIP
240c0 53 43 41 4e 29 29 21 3d 30 0a 20 20 20 20 20 20  SCAN))!=0.      
240d0 20 20 7c 7c 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20    || nInMul==0. 
240e0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 4e       );.      pN
240f0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
24100 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a  HERE_COLUMN_EQ;.
24110 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
24120 20 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50    .       || (pP
24130 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  robe->onError!=O
24140 45 5f 4e 6f 6e 65 20 26 26 20 6e 49 6e 4d 75 6c  E_None && nInMul
24150 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
24160 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  & pNew->u.btree.
24170 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65  nEq==pProbe->nKe
24180 79 43 6f 6c 2d 31 29 0a 20 20 20 20 20 20 29 7b  yCol-1).      ){
24190 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
241a0 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
241b0 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  & WHERE_COLUMN_I
241c0 4e 29 3d 3d 30 20 7c 7c 20 69 43 6f 6c 3c 30 20  N)==0 || iCol<0 
241d0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
241e0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
241f0 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20  E_ONEROW;.      
24200 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  }.      pNew->u.
24210 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20  btree.nEq++;.   
24220 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
24230 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c  nRowEst + nInMul
24240 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
24250 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
24260 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29   & (WO_ISNULL) )
24270 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  {.      pNew->ws
24280 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
24290 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20  OLUMN_NULL;.    
242a0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
242b0 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 2f 2a 20  nEq++;.      /* 
242c0 54 55 4e 49 4e 47 3a 20 49 53 20 4e 55 4c 4c 20  TUNING: IS NULL 
242d0 73 65 6c 65 63 74 73 20 32 20 72 6f 77 73 20 2a  selects 2 rows *
242e0 2f 0a 20 20 20 20 20 20 6e 49 6e 20 3d 20 31 30  /.      nIn = 10
242f0 3b 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73  ;  assert( 10==s
24300 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20  qlite3LogEst(2) 
24310 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  );.      pNew->n
24320 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20  Out = nRowEst + 
24330 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20  nInMul + nIn;.  
24340 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72    }else if( pTer
24350 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
24360 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a  WO_GT|WO_GE) ){.
24370 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
24380 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
24390 20 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20   & WO_GT );.    
243a0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
243b0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
243c0 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 70 4e  O_GE );.      pN
243d0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
243e0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
243f0 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  E|WHERE_BTM_LIMI
24400 54 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20  T;.      pBtm = 
24410 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f  pTerm;.      pTo
24420 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  p = 0;.    }else
24430 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
24440 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
24450 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29   & (WO_LT|WO_LE)
24460 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
24470 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
24480 61 74 6f 72 20 26 20 57 4f 5f 4c 54 20 29 3b 0a  ator & WO_LT );.
24490 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
244a0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
244b0 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20   & WO_LE );.    
244c0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
244d0 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
244e0 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f  RANGE|WHERE_TOP_
244f0 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 54 6f  LIMIT;.      pTo
24500 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  p = pTerm;.     
24510 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77   pBtm = (pNew->w
24520 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
24530 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20  TM_LIMIT)!=0 ?. 
24540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24550 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
24560 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d  [pNew->nLTerm-2]
24570 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   : 0;.    }.    
24580 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
24590 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
245a0 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
245b0 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 61  /* Adjust nOut a
245c0 6e 64 20 72 52 75 6e 20 66 6f 72 20 53 54 41 54  nd rRun for STAT
245d0 33 20 72 61 6e 67 65 20 76 61 6c 75 65 73 20 2a  3 range values *
245e0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
245f0 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65  pNew->nOut==save
24600 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20 20  d_nOut );.      
24610 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
24620 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
24630 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20  er, pBtm, pTop, 
24640 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 23 69 66  pNew);.    }.#if
24650 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
24660 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
24670 0a 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d  .    if( nInMul=
24680 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 72 6f  =0 .     && pPro
24690 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20  be->nSample .   
246a0 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72    && pNew->u.btr
246b0 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e  ee.nEq<=pProbe->
246c0 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20  nSampleCol.     
246d0 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
246e0 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
246f0 45 5f 53 74 61 74 33 29 20 0a 20 20 20 20 29 7b  E_Stat3) .    ){
24700 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
24710 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
24720 72 3b 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74  r;.      tRowcnt
24730 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20   nOut = 0;.     
24740 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
24750 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c  erator & (WO_EQ|
24760 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 20 29  WO_ISNULL))!=0 )
24770 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
24780 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
24790 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
247a0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
247b0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
247c0 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
247d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
247e0 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
247f0 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
24800 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r, pExpr->pRight
24810 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  , &nOut);.      
24820 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d  }else if( (pTerm
24830 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
24840 5f 49 4e 29 0a 20 20 20 20 20 20 20 20 20 20 20  _IN).           
24850 20 20 26 26 20 20 21 45 78 70 72 48 61 73 50 72    &&  !ExprHasPr
24860 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
24870 5f 78 49 73 53 65 6c 65 63 74 29 20 20 29 7b 0a  _xIsSelect)  ){.
24880 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
24890 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72  reInScanEst(pPar
248a0 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45  se, pBuilder, pE
248b0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e  xpr->x.pList, &n
248c0 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Out);.      }.  
248d0 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f 75 74      assert( nOut
248e0 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
248f0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
24900 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  ( nOut ){.      
24910 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
24920 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75  qlite3LogEst(nOu
24930 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
24940 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64  pNew->nOut>saved
24950 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f  _nOut ) pNew->nO
24960 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
24970 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
24980 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70  endif.    if( (p
24990 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  New->wsFlags & (
249a0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57  WHERE_IDX_ONLY|W
249b0 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b  HERE_IPK))==0 ){
249c0 0a 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 72  .      /* Each r
249d0 6f 77 20 69 6e 76 6f 6c 76 65 73 20 61 20 73 74  ow involves a st
249e0 65 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c  ep of the index,
249f0 20 74 68 65 6e 20 61 20 62 69 6e 61 72 79 20 73   then a binary s
24a00 65 61 72 63 68 20 6f 66 0a 20 20 20 20 20 20 2a  earch of.      *
24a10 2a 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  * the main table
24a20 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
24a30 72 52 75 6e 20 3d 20 20 73 71 6c 69 74 65 33 4c  rRun =  sqlite3L
24a40 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72  ogEstAdd(pNew->r
24a50 52 75 6e 2c 72 4c 6f 67 53 69 7a 65 3e 32 37 20  Run,rLogSize>27 
24a60 3f 20 72 4c 6f 67 53 69 7a 65 2d 31 37 20 3a 20  ? rLogSize-17 : 
24a70 31 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  10);.    }.    /
24a80 2a 20 53 74 65 70 20 63 6f 73 74 20 66 6f 72 20  * Step cost for 
24a90 65 61 63 68 20 6f 75 74 70 75 74 20 72 6f 77 20  each output row 
24aa0 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  */.    pNew->rRu
24ab0 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
24ac0 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  tAdd(pNew->rRun,
24ad0 20 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20   pNew->nOut);.  
24ae0 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
24af0 74 41 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72  tAdjust(pBuilder
24b00 2d 3e 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20 20  ->pWC, pNew);.  
24b10 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
24b20 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
24b30 20 70 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20   pNew);.    if( 
24b40 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
24b50 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
24b60 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65  )==0.     && pNe
24b70 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 28  w->u.btree.nEq<(
24b80 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 20  pProbe->nKeyCol 
24b90 2b 20 28 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65  + (pProbe->zName
24ba0 21 3d 30 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  !=0)).    ){.   
24bb0 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42     whereLoopAddB
24bc0 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64  treeIndex(pBuild
24bd0 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65  er, pSrc, pProbe
24be0 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20  , nInMul+nIn);. 
24bf0 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e     }.    pNew->n
24c00 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
24c10 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
24c20 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
24c30 53 54 41 54 34 0a 20 20 20 20 70 42 75 69 6c 64  STAT4.    pBuild
24c40 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
24c50 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69  nRecValid;.#endi
24c60 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72  f.  }.  pNew->pr
24c70 65 72 65 71 20 3d 20 73 61 76 65 64 5f 70 72 65  ereq = saved_pre
24c80 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62  req;.  pNew->u.b
24c90 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64  tree.nEq = saved
24ca0 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e  _nEq;.  pNew->u.
24cb0 62 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20 73 61  btree.nSkip = sa
24cc0 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65  ved_nSkip;.  pNe
24cd0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76  w->wsFlags = sav
24ce0 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e  ed_wsFlags;.  pN
24cf0 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
24d00 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e  _nOut;.  pNew->n
24d10 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c  LTerm = saved_nL
24d20 54 65 72 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72  Term;.  return r
24d30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
24d40 72 6e 20 54 72 75 65 20 69 66 20 69 74 20 69 73  rn True if it is
24d50 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70   possible that p
24d60 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20 75  Index might be u
24d70 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c  seful in.** impl
24d80 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44  ementing the ORD
24d90 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20  ER BY clause in 
24da0 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  pBuilder..**.** 
24db0 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20  Return False if 
24dc0 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f  pBuilder does no
24dd0 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44  t contain an ORD
24de0 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a  ER BY clause or.
24df0 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ** if there is n
24e00 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78  o way for pIndex
24e10 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e   to be useful in
24e20 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
24e30 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63  at.** ORDER BY c
24e40 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
24e50 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48   int indexMightH
24e60 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a  elpWithOrderBy(.
24e70 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
24e80 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
24e90 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20  Index *pIndex,. 
24ea0 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a   int iCursor.){.
24eb0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b    ExprList *pOB;
24ec0 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a  .  int ii, jj;..
24ed0 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55    if( pIndex->bU
24ee0 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74 75 72  nordered ) retur
24ef0 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20  n 0;.  if( (pOB 
24f00 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
24f10 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30  fo->pOrderBy)==0
24f20 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
24f30 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d  or(ii=0; ii<pOB-
24f40 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
24f50 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
24f60 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
24f70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69  Collate(pOB->a[i
24f80 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
24f90 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
24fa0 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
24fb0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70   0;.    if( pExp
24fc0 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73  r->iTable==iCurs
24fd0 6f 72 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  or ){.      for(
24fe0 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d  jj=0; jj<pIndex-
24ff0 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b  >nKeyCol; jj++){
25000 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
25010 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e  pr->iColumn==pIn
25020 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a  dex->aiColumn[jj
25030 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ] ) return 1;.  
25040 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
25050 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
25060 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 69  *.** Return a bi
25070 74 6d 61 73 6b 20 77 68 65 72 65 20 31 73 20 69  tmask where 1s i
25080 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
25090 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63   corresponding c
250a0 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  olumn of.** the 
250b0 74 61 62 6c 65 20 69 73 20 75 73 65 64 20 62 79  table is used by
250c0 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79   an index.  Only
250d0 20 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f   the first 63 co
250e0 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69 64  lumns are consid
250f0 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ered..*/.static 
25100 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73 49  Bitmask columnsI
25110 6e 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49  nIndex(Index *pI
25120 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  dx){.  Bitmask m
25130 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20   = 0;.  int j;. 
25140 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f   for(j=pIdx->nCo
25150 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d  lumn-1; j>=0; j-
25160 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20  -){.    int x = 
25170 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
25180 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 30 20  ];.    if( x>=0 
25190 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
251a0 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  e( x==BMS-1 );. 
251b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
251c0 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20  ==BMS-2 );.     
251d0 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d   if( x<BMS-1 ) m
251e0 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a   |= MASKBIT(x);.
251f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
25200 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63  rn m;.}../* Chec
25210 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20 70 61  k to see if a pa
25220 72 74 69 61 6c 20 69 6e 64 65 78 20 77 69 74 68  rtial index with
25230 20 70 50 61 72 74 49 6e 64 65 78 57 68 65 72 65   pPartIndexWhere
25240 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20   can be used.** 
25250 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 71  in the current q
25260 75 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74 72  uery.  Return tr
25270 75 65 20 69 66 20 69 74 20 63 61 6e 20 62 65 20  ue if it can be 
25280 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  and false if not
25290 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
252a0 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69  whereUsableParti
252b0 61 6c 49 6e 64 65 78 28 69 6e 74 20 69 54 61 62  alIndex(int iTab
252c0 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  , WhereClause *p
252d0 57 43 2c 20 45 78 70 72 20 2a 70 57 68 65 72 65  WC, Expr *pWhere
252e0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  ){.  int i;.  Wh
252f0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
25300 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d    for(i=0, pTerm
25310 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
25320 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
25330 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  m++){.    if( sq
25340 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
25350 45 78 70 72 28 70 54 65 72 6d 2d 3e 70 45 78 70  Expr(pTerm->pExp
25360 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62 29  r, pWhere, iTab)
25370 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
25380 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
25390 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68  /*.** Add all Wh
253a0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
253b0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 61 62  for a single tab
253c0 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77  le of the join w
253d0 68 65 72 65 20 74 68 65 20 74 61 62 6c 65 0a 2a  here the table.*
253e0 2a 20 69 73 20 69 64 65 6e 66 69 65 64 20 62 79  * is idenfied by
253f0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
25400 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62  >iTab.  That tab
25410 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  le is guaranteed
25420 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72   to be.** a b-tr
25430 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  ee table, not a 
25440 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
25450 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
25460 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 0a  reLoopAddBtree(.
25470 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
25480 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a  er *pBuilder, /*
25490 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
254a0 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42  formation */.  B
254b0 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 20 20  itmask mExtra   
254c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
254d0 74 72 61 20 70 72 65 72 65 71 75 65 73 69 74 65  tra prerequesite
254e0 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68 69 73  s for using this
254f0 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57   table */.){.  W
25500 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
25510 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48  ;          /* WH
25520 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e  ERE analysis con
25530 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  text */.  Index 
25540 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20  *pProbe;        
25550 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
25560 78 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74  x we are evaluat
25570 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73  ing */.  Index s
25580 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pk;             
25590 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 69       /* A fake i
255a0 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20  ndex object for 
255b0 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
255c0 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 69 52  */.  tRowcnt aiR
255d0 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20 20  owEstPk[2];     
255e0 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 45 73 74   /* The aiRowEst
255f0 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
25600 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
25610 69 31 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d  i16 aiColumnPk =
25620 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54   -1;        /* T
25630 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c  he aColumn[] val
25640 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
25650 6e 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ndex */.  SrcLis
25660 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
25670 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
25680 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  M clause */.  st
25690 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
256a0 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65  m *pSrc;  /* The
256b0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72   FROM clause btr
256c0 65 65 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a  ee term to add *
256d0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
256e0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
256f0 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72  /* Template Wher
25700 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
25710 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
25720 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a  E_OK;         /*
25730 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
25740 20 20 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d    int iSortIdx =
25750 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   1;           /*
25760 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   Index number */
25770 0a 20 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20  .  int b;       
25780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25790 2a 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  * A boolean valu
257a0 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53  e */.  LogEst rS
257b0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
257c0 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20     /* number of 
257d0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
257e0 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c  e */.  LogEst rL
257f0 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ogSize;         
25800 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20     /* Logarithm 
25810 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
25820 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
25830 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  le */.  WhereCla
25840 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20  use *pWC;       
25850 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
25860 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  d WHERE clause *
25870 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
25880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25890 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71  /* Table being q
258a0 75 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70  ueried */.  .  p
258b0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
258c0 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  pNew;.  pWInfo =
258d0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
258e0 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  o;.  pTabList = 
258f0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
25900 3b 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c  ;.  pSrc = pTabL
25910 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69  ist->a + pNew->i
25920 54 61 62 3b 0a 20 20 70 54 61 62 20 3d 20 70 53  Tab;.  pTab = pS
25930 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 20  rc->pTab;.  pWC 
25940 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
25950 0a 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69  .  assert( !IsVi
25960 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62  rtual(pSrc->pTab
25970 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63  ) );..  if( pSrc
25980 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ->pIndex ){.    
25990 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59  /* An INDEXED BY
259a0 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65   clause specifie
259b0 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  s a particular i
259c0 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20  ndex to use */. 
259d0 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63     pProbe = pSrc
259e0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  ->pIndex;.  }els
259f0 65 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28  e if( !HasRowid(
25a00 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72  pTab) ){.    pPr
25a10 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  obe = pTab->pInd
25a20 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ex;.  }else{.   
25a30 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
25a40 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
25a50 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b  e.  Create a fak
25a60 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  e Index object i
25a70 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76  n local.    ** v
25a80 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72  ariable sPk to r
25a90 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77  epresent the row
25aa0 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  id primary key i
25ab0 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73  ndex.  Make this
25ac0 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64  .    ** fake ind
25ad0 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  ex the first in 
25ae0 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78  a chain of Index
25af0 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c   objects with al
25b00 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20  l of the real.  
25b10 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
25b20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e  follow */.    In
25b30 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20  dex *pFirst;    
25b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25b50 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69   First of real i
25b60 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61  ndices on the ta
25b70 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ble */.    memse
25b80 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f  t(&sPk, 0, sizeo
25b90 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73  f(Index));.    s
25ba0 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a  Pk.nKeyCol = 1;.
25bb0 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e      sPk.aiColumn
25bc0 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a   = &aiColumnPk;.
25bd0 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45 73 74      sPk.aiRowEst
25be0 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20   = aiRowEstPk;. 
25bf0 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d     sPk.onError =
25c00 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20   OE_Replace;.   
25c10 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 54   sPk.pTable = pT
25c20 61 62 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74  ab;.    aiRowEst
25c30 50 6b 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e 52  Pk[0] = pTab->nR
25c40 6f 77 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77  owEst;.    aiRow
25c50 45 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20  EstPk[1] = 1;.  
25c60 20 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d    pFirst = pSrc-
25c70 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20  >pTab->pIndex;. 
25c80 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74     if( pSrc->not
25c90 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20  Indexed==0 ){.  
25ca0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20      /* The real 
25cb0 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74  indices of the t
25cc0 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f  able are only co
25cd0 6e 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a  nsidered if the.
25ce0 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44        ** NOT IND
25cf0 45 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69  EXED qualifier i
25d00 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74  s omitted from t
25d10 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
25d20 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78  /.      sPk.pNex
25d30 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20  t = pFirst;.    
25d40 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26  }.    pProbe = &
25d50 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65  sPk;.  }.  rSize
25d60 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
25d70 28 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 29 3b  (pTab->nRowEst);
25d80 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73  .  rLogSize = es
25d90 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69  tLog(rSize);..#i
25da0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
25db0 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
25dc0 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63  X.  /* Automatic
25dd0 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66   indexes */.  if
25de0 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  ( !pBuilder->pOr
25df0 53 65 74 0a 20 20 20 26 26 20 28 70 57 49 6e 66  Set.   && (pWInf
25e00 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  o->pParse->db->f
25e10 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75  lags & SQLITE_Au
25e20 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26  toIndex)!=0.   &
25e30 26 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d  & pSrc->pIndex==
25e40 30 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 76  0.   && !pSrc->v
25e50 69 61 43 6f 72 6f 75 74 69 6e 65 0a 20 20 20 26  iaCoroutine.   &
25e60 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65  & !pSrc->notInde
25e70 78 65 64 0a 20 20 20 26 26 20 48 61 73 52 6f 77  xed.   && HasRow
25e80 69 64 28 70 54 61 62 29 0a 20 20 20 26 26 20 21  id(pTab).   && !
25e90 70 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74  pSrc->isCorrelat
25ea0 65 64 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47  ed.  ){.    /* G
25eb0 65 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64  enerate auto-ind
25ec0 65 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f  ex WhereLoops */
25ed0 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
25ee0 70 54 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65  pTerm;.    Where
25ef0 54 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70  Term *pWCEnd = p
25f00 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65  WC->a + pWC->nTe
25f10 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72  rm;.    for(pTer
25f20 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51  m=pWC->a; rc==SQ
25f30 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d  LITE_OK && pTerm
25f40 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  <pWCEnd; pTerm++
25f50 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ){.      if( pTe
25f60 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
25f70 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  & pNew->maskSelf
25f80 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
25f90 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
25fa0 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
25fb0 70 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20  pSrc, 0) ){.    
25fc0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
25fd0 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20  e.nEq = 1;.     
25fe0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
25ff0 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  .nSkip = 0;.    
26000 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
26010 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
26020 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
26030 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
26040 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  pNew->aLTerm[0] 
26050 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
26060 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d   /* TUNING: One-
26070 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63 6f  time cost for co
26080 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75 74 6f  mputing the auto
26090 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a 20  matic index is. 
260a0 20 20 20 20 20 20 20 2a 2a 20 61 70 70 72 6f 78         ** approx
260b0 69 6d 61 74 65 6c 79 20 37 2a 4e 2a 6c 6f 67 32  imately 7*N*log2
260c0 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20 74  (N) where N is t
260d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
260e0 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  s in.        ** 
260f0 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
26100 69 6e 64 65 78 65 64 2e 20 2a 2f 0a 20 20 20 20  indexed. */.    
26110 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
26120 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53   = rLogSize + rS
26130 69 7a 65 20 2b 20 32 38 3b 20 20 61 73 73 65 72  ize + 28;  asser
26140 74 28 20 32 38 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 28==sqlite3Lo
26150 67 45 73 74 28 37 29 20 29 3b 0a 20 20 20 20 20  gEst(7) );.     
26160 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61     /* TUNING: Ea
26170 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  ch index lookup 
26180 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69  yields 20 rows i
26190 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  n the table.  Th
261a0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  is.        ** is
261b0 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75   more than the u
261c0 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30  sual guess of 10
261d0 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20   rows, since we 
261e0 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20  have no way.    
261f0 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 6e 69      ** of knowni
26200 6e 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65  ng how selective
26210 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20   the index will 
26220 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20  ultimately be.  
26230 49 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20  It would.       
26240 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61   ** not be unrea
26250 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20  sonable to make 
26260 74 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20  this value much 
26270 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  larger. */.     
26280 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
26290 34 33 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d  43;  assert( 43=
262a0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
262b0 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  0) );.        pN
262c0 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74  ew->rRun = sqlit
262d0 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67  e3LogEstAdd(rLog
262e0 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29  Size,pNew->nOut)
262f0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
26300 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
26310 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20  AUTO_INDEX;.    
26320 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
26330 20 3d 20 6d 45 78 74 72 61 20 7c 20 70 54 65 72   = mExtra | pTer
26340 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
26350 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
26360 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
26370 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
26380 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
26390 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
263a0 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
263b0 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c  INDEX */..  /* L
263c0 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
263d0 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ices.  */.  for(
263e0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
263f0 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62  && pProbe; pProb
26400 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c  e=pProbe->pNext,
26410 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20   iSortIdx++){.  
26420 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50    if( pProbe->pP
26430 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20  artIdxWhere!=0. 
26440 20 20 20 20 26 26 20 21 77 68 65 72 65 55 73 61      && !whereUsa
26450 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28  blePartialIndex(
26460 70 4e 65 77 2d 3e 69 54 61 62 2c 20 70 57 43 2c  pNew->iTab, pWC,
26470 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64   pProbe->pPartId
26480 78 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20  xWhere) ){.     
26490 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50   continue;  /* P
264a0 61 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61  artial index ina
264b0 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
264c0 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  his query */.   
264d0 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62   }.    pNew->u.b
264e0 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20  tree.nEq = 0;.  
264f0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
26500 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 70  nSkip = 0;.    p
26510 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b  New->nLTerm = 0;
26520 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74  .    pNew->iSort
26530 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Idx = 0;.    pNe
26540 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
26550 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
26560 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e  = mExtra;.    pN
26570 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
26580 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
26590 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72  ree.pIndex = pPr
265a0 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64  obe;.    b = ind
265b0 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f  exMightHelpWithO
265c0 72 64 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c  rderBy(pBuilder,
265d0 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69   pProbe, pSrc->i
265e0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20  Cursor);.    /* 
265f0 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49  The ONEPASS_DESI
26600 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20  RED flags never 
26610 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65 72 20  occurs together 
26620 77 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f  with ORDER BY */
26630 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 57  .    assert( (pW
26640 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
26650 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
26660 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20  _DESIRED)==0 || 
26670 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b==0 );.    if( 
26680 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20  pProbe->tnum<=0 
26690 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65  ){.      /* Inte
266a0 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ger primary key 
266b0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70  index */.      p
266c0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
266d0 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20  HERE_IPK;..     
266e0 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73   /* Full table s
266f0 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  can */.      pNe
26700 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20  w->iSortIdx = b 
26710 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a  ? iSortIdx : 0;.
26720 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
26730 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61   Cost of full ta
26740 62 6c 65 20 73 63 61 6e 20 69 73 20 33 2a 28 4e  ble scan is 3*(N
26750 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20 20 20   + log2(N))..   
26760 20 20 20 2a 2a 20 20 2b 20 20 54 68 65 20 65 78     **  +  The ex
26770 74 72 61 20 33 20 66 61 63 74 6f 72 20 69 73 20  tra 3 factor is 
26780 74 6f 20 65 6e 63 6f 75 72 61 67 65 20 74 68 65  to encourage the
26790 20 75 73 65 20 6f 66 20 69 6e 64 65 78 65 64 20   use of indexed 
267a0 6c 6f 6f 6b 75 70 73 0a 20 20 20 20 20 20 2a 2a  lookups.      **
267b0 20 20 20 20 20 6f 76 65 72 20 66 75 6c 6c 20 73       over full s
267c0 63 61 6e 73 2e 20 20 46 49 58 4d 45 20 2a 2f 0a  cans.  FIXME */.
267d0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
267e0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
267f0 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69  Add(rSize,rLogSi
26800 7a 65 29 20 2b 20 31 36 3b 0a 20 20 20 20 20 20  ze) + 16;.      
26810 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
26820 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77 29  djust(pWC, pNew)
26830 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  ;.      rc = whe
26840 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
26850 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
26860 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
26870 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66   rSize;.      if
26880 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
26890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42    }else{.      B
268a0 69 74 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20  itmask m;.      
268b0 69 66 28 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f  if( pProbe->isCo
268c0 76 65 72 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  vering ){.      
268d0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
268e0 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  = WHERE_IDX_ONLY
268f0 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   | WHERE_INDEXED
26900 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 30 3b  ;.        m = 0;
26910 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
26920 20 20 20 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e        m = pSrc->
26930 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d  colUsed & ~colum
26940 6e 73 49 6e 49 6e 64 65 78 28 70 50 72 6f 62 65  nsInIndex(pProbe
26950 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
26960 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30  >wsFlags = (m==0
26970 29 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f  ) ? (WHERE_IDX_O
26980 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45  NLY|WHERE_INDEXE
26990 44 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58  D) : WHERE_INDEX
269a0 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ED;.      }..   
269b0 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20     /* Full scan 
269c0 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  via index */.   
269d0 20 20 20 69 66 28 20 62 0a 20 20 20 20 20 20 20     if( b.       
269e0 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  || !HasRowid(pTa
269f0 62 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 6d  b).       || ( m
26a00 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
26a10 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
26a20 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  ed==0.         &
26a30 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78  & (pProbe->szIdx
26a40 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52  Row<pTab->szTabR
26a50 6f 77 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  ow).         && 
26a60 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
26a70 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
26a80 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a  ASS_DESIRED)==0.
26a90 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
26aa0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
26ab0 62 55 73 65 43 69 73 0a 20 20 20 20 20 20 20 20  bUseCis.        
26ac0 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
26ad0 45 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e  Enabled(pWInfo->
26ae0 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49  pParse->db, SQLI
26af0 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 29  TE_CoverIdxScan)
26b00 0a 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20  .          ).   
26b10 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e     ){.        pN
26b20 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62  ew->iSortIdx = b
26b30 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b   ? iSortIdx : 0;
26b40 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 3d 3d  .        if( m==
26b50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
26b60 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
26b70 66 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  f a covering ind
26b80 65 78 20 73 63 61 6e 20 69 73 20 4b 2a 28 4e 20  ex scan is K*(N 
26b90 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20 20 20 20  + log2(N))..    
26ba0 20 20 20 20 20 20 2a 2a 20 20 2b 20 20 54 68 65        **  +  The
26bb0 20 65 78 74 72 61 20 66 61 63 74 6f 72 20 4b 20   extra factor K 
26bc0 6f 66 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61  of between 1.1 a
26bd0 6e 64 20 33 2e 30 20 74 68 61 74 20 64 65 70 65  nd 3.0 that depe
26be0 6e 64 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nds.          **
26bf0 20 20 20 20 20 6f 6e 20 74 68 65 20 72 65 6c 61       on the rela
26c00 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74 68  tive sizes of th
26c10 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20  e table and the 
26c20 69 6e 64 65 78 2e 20 20 4b 0a 20 20 20 20 20 20  index.  K.      
26c30 20 20 20 20 2a 2a 20 20 20 20 20 69 73 20 73 6d      **     is sm
26c40 61 6c 6c 65 72 20 66 6f 72 20 73 6d 61 6c 6c 65  aller for smalle
26c50 72 20 69 6e 64 69 63 65 73 2c 20 74 68 75 73 20  r indices, thus 
26c60 66 61 76 6f 72 69 6e 67 20 74 68 65 6d 2e 0a 20  favoring them.. 
26c70 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
26c80 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
26c90 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
26ca0 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69  Add(rSize,rLogSi
26cb0 7a 65 29 20 2b 20 31 20 2b 0a 20 20 20 20 20 20  ze) + 1 +.      
26cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cd0 20 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a    (15*pProbe->sz
26ce0 49 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a  IdxRow)/pTab->sz
26cf0 54 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20  TabRow;.        
26d00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
26d10 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
26d20 20 6f 66 20 73 63 61 6e 6e 69 6e 67 20 61 20 6e   of scanning a n
26d30 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
26d40 78 20 69 73 20 28 4e 2b 31 29 2a 6c 6f 67 32 28  x is (N+1)*log2(
26d50 4e 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  N).          ** 
26d60 77 68 69 63 68 20 77 65 20 77 69 6c 6c 20 73 69  which we will si
26d70 6d 70 6c 69 66 79 20 74 6f 20 6a 75 73 74 20 4e  mplify to just N
26d80 2a 6c 6f 67 32 28 4e 29 20 2a 2f 0a 20 20 20 20  *log2(N) */.    
26d90 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
26da0 20 3d 20 72 53 69 7a 65 20 2b 20 72 4c 6f 67 53   = rSize + rLogS
26db0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ize;.        }. 
26dc0 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70         whereLoop
26dd0 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43  OutputAdjust(pWC
26de0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
26df0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
26e00 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
26e10 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70  pNew);.        p
26e20 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a  New->nOut = rSiz
26e30 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  e;.        if( r
26e40 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  c ) break;.     
26e50 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63   }.    }..    rc
26e60 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42   = whereLoopAddB
26e70 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64  treeIndex(pBuild
26e80 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65  er, pSrc, pProbe
26e90 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  , 0);.#ifdef SQL
26ea0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
26eb0 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71  _OR_STAT4.    sq
26ec0 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 46  lite3Stat4ProbeF
26ed0 72 65 65 28 70 42 75 69 6c 64 65 72 2d 3e 70 52  ree(pBuilder->pR
26ee0 65 63 29 3b 0a 20 20 20 20 70 42 75 69 6c 64 65  ec);.    pBuilde
26ef0 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 30  r->nRecValid = 0
26f00 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ;.    pBuilder->
26f10 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66  pRec = 0;.#endif
26f20 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
26f30 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44  e was an INDEXED
26f40 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
26f50 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69   only that one i
26f60 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63  ndex is.    ** c
26f70 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20  onsidered. */.  
26f80 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64    if( pSrc->pInd
26f90 65 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ex ) break;.  }.
26fa0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26fb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
26fc0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
26fd0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57  ./*.** Add all W
26fe0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
26ff0 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66 20   for a table of 
27000 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66  the join identif
27010 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64  ied by.** pBuild
27020 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20  er->pNew->iTab. 
27030 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67   That table is g
27040 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
27050 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
27060 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
27070 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
27080 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  al(.  WhereLoopB
27090 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
270a0 2c 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75  ,  /* WHERE clau
270b0 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  se information *
270c0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74  /.  Bitmask mExt
270d0 72 61 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  ra.){.  WhereInf
270e0 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
270f0 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e       /* WHERE an
27100 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a  alysis context *
27110 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
27120 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
27130 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
27140 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
27150 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
27160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
27170 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
27180 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
27190 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20  t_item *pSrc;   
271a0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
271b0 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
271c0 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  h */.  Table *pT
271d0 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ab;.  sqlite3 *d
271e0 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  b;.  sqlite3_ind
271f0 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
27200 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  o;.  struct sqli
27210 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
27220 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
27230 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
27240 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
27250 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b  t_usage *pUsage;
27260 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
27270 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  erm;.  int i, j;
27280 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d 78  .  int iTerm, mx
27290 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e  Term;.  int nCon
272a0 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20 73  straint;.  int s
272b0 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20 20  eenIn = 0;      
272c0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
272d0 69 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  if an IN operato
272e0 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69  r is seen */.  i
272f0 6e 74 20 73 65 65 6e 56 61 72 20 3d 20 30 3b 20  nt seenVar = 0; 
27300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27310 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e  rue if a non-con
27320 73 74 61 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74  stant constraint
27330 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e   is seen */.  in
27340 74 20 69 50 68 61 73 65 3b 20 20 20 20 20 20 20  t iPhase;       
27350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a             /* 0:
27360 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c 20 31   const w/o IN, 1
27370 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20 49  : const, 2: no I
27380 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20 20 57  N,  2: IN */.  W
27390 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
273a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
273b0 45 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e 66 6f 20  E_OK;..  pWInfo 
273c0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
273d0 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70  fo;.  pParse = p
273e0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
273f0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
27400 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64  ;.  pWC = pBuild
27410 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20  er->pWC;.  pNew 
27420 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
27430 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49 6e  ;.  pSrc = &pWIn
27440 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
27450 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 70  pNew->iTab];.  p
27460 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  Tab = pSrc->pTab
27470 3b 0a 20 20 61 73 73 65 72 74 28 20 49 73 56 69  ;.  assert( IsVi
27480 72 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 20  rtual(pTab) );. 
27490 20 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f   pIdxInfo = allo
274a0 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50  cateIndexInfo(pP
274b0 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c  arse, pWC, pSrc,
274c0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65   pBuilder->pOrde
274d0 72 42 79 29 3b 0a 20 20 69 66 28 20 70 49 64 78  rBy);.  if( pIdx
274e0 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  Info==0 ) return
274f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
27500 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
27510 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  0;.  pNew->rSetu
27520 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77  p = 0;.  pNew->w
27530 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56  sFlags = WHERE_V
27540 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70  IRTUALTABLE;.  p
27550 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b  New->nLTerm = 0;
27560 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  .  pNew->u.vtab.
27570 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
27580 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66  pUsage = pIdxInf
27590 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
275a0 61 67 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69  age;.  nConstrai
275b0 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt = pIdxInfo->n
275c0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66  Constraint;.  if
275d0 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
275e0 65 28 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e  e(db, pNew, nCon
275f0 73 74 72 61 69 6e 74 29 20 29 7b 0a 20 20 20 20  straint) ){.    
27600 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
27610 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20  , pIdxInfo);.   
27620 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
27630 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  OMEM;.  }..  for
27640 28 69 50 68 61 73 65 3d 30 3b 20 69 50 68 61 73  (iPhase=0; iPhas
27650 65 3c 3d 33 3b 20 69 50 68 61 73 65 2b 2b 29 7b  e<=3; iPhase++){
27660 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 49 6e  .    if( !seenIn
27670 20 26 26 20 28 69 50 68 61 73 65 26 31 29 21 3d   && (iPhase&1)!=
27680 30 20 29 7b 0a 20 20 20 20 20 20 69 50 68 61 73  0 ){.      iPhas
27690 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69  e++;.      if( i
276a0 50 68 61 73 65 3e 33 20 29 20 62 72 65 61 6b 3b  Phase>3 ) break;
276b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
276c0 73 65 65 6e 56 61 72 20 26 26 20 69 50 68 61 73  seenVar && iPhas
276d0 65 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  e>1 ) break;.   
276e0 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74   pIdxCons = *(st
276f0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
27700 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
27710 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
27720 74 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72 28  traint;.    for(
27730 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d  i=0; i<pIdxInfo-
27740 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
27750 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a  +, pIdxCons++){.
27760 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f        j = pIdxCo
27770 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b  ns->iTermOffset;
27780 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
27790 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20  pWC->a[j];.     
277a0 20 73 77 69 74 63 68 28 20 69 50 68 61 73 65 20   switch( iPhase 
277b0 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
277c0 30 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e  0:    /* Constan
277d0 74 73 20 77 69 74 68 6f 75 74 20 49 4e 20 6f 70  ts without IN op
277e0 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
277f0 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
27800 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  able = 0;.      
27810 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
27820 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
27830 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  N)!=0 ){.       
27840 20 20 20 20 20 73 65 65 6e 49 6e 20 3d 20 31 3b       seenIn = 1;
27850 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27860 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
27870 2d 3e 70 72 65 72 65 71 52 69 67 68 74 21 3d 30  ->prereqRight!=0
27880 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27890 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20  seenVar = 1;.   
278a0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
278b0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
278c0 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29  or & WO_IN)==0 )
278d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
278e0 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
278f0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
27900 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
27910 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a  .        case 1:
27920 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73      /* Constants
27930 20 77 69 74 68 20 49 4e 20 6f 70 65 72 61 74 6f   with IN operato
27940 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  rs */.          
27950 61 73 73 65 72 74 28 20 73 65 65 6e 49 6e 20 29  assert( seenIn )
27960 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  ;.          pIdx
27970 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28  Cons->usable = (
27980 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
27990 68 74 3d 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  ht==0);.        
279a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
279b0 20 63 61 73 65 20 32 3a 20 20 20 20 2f 2a 20 56   case 2:    /* V
279c0 61 72 69 61 62 6c 65 73 20 77 69 74 68 6f 75 74  ariables without
279d0 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   IN */.         
279e0 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72   assert( seenVar
279f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49   );.          pI
27a00 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
27a10 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
27a20 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a  or & WO_IN)==0;.
27a30 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
27a40 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74  .        default
27a50 3a 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73  :   /* Variables
27a60 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20   with IN */.    
27a70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
27a80 65 6e 56 61 72 20 26 26 20 73 65 65 6e 49 6e 20  enVar && seenIn 
27a90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  );.          pId
27aa0 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
27ab0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
27ac0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
27ad0 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 55 73  }.    memset(pUs
27ae0 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  age, 0, sizeof(p
27af0 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e  Usage[0])*pIdxIn
27b00 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29  fo->nConstraint)
27b10 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e  ;.    if( pIdxIn
27b20 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
27b30 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66  xStr ) sqlite3_f
27b40 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ree(pIdxInfo->id
27b50 78 53 74 72 29 3b 0a 20 20 20 20 70 49 64 78 49  xStr);.    pIdxI
27b60 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b  nfo->idxStr = 0;
27b70 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
27b80 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70  dxNum = 0;.    p
27b90 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
27ba0 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20  reeIdxStr = 0;. 
27bb0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64     pIdxInfo->ord
27bc0 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30  erByConsumed = 0
27bd0 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
27be0 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
27bf0 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f  SQLITE_BIG_DBL /
27c00 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20   (double)2;.    
27c10 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
27c20 74 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20  tedRows = 25;.  
27c30 20 20 72 63 20 3d 20 76 74 61 62 42 65 73 74 49    rc = vtabBestI
27c40 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 54 61  ndex(pParse, pTa
27c50 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20  b, pIdxInfo);.  
27c60 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
27c70 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
27c80 5f 65 78 69 74 3b 0a 20 20 20 20 70 49 64 78 43  _exit;.    pIdxC
27c90 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
27ca0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
27cb0 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
27cc0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
27cd0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
27ce0 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20  eq = mExtra;.   
27cf0 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20   mxTerm = -1;.  
27d00 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
27d10 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61  nLSlot>=nConstra
27d20 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  int );.    for(i
27d30 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; i<nConstrain
27d40 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c  t; i++) pNew->aL
27d50 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Term[i] = 0;.   
27d60 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
27d70 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  itMask = 0;.    
27d80 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
27d90 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64  traint; i++, pId
27da0 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20  xCons++){.      
27db0 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55 73  if( (iTerm = pUs
27dc0 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
27dd0 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20   - 1)>=0 ){.    
27de0 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73      j = pIdxCons
27df0 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20  ->iTermOffset;. 
27e00 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d         if( iTerm
27e10 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20  >=nConstraint.  
27e20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20         || j<0.  
27e30 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43         || j>=pWC
27e40 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20  ->nTerm.        
27e50 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d   || pNew->aLTerm
27e60 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20  [iTerm]!=0.     
27e70 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
27e80 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
27e90 52 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  R;.          sql
27ea0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
27eb0 72 73 65 2c 20 22 25 73 2e 78 42 65 73 74 49 6e  rse, "%s.xBestIn
27ec0 64 65 78 28 29 20 6d 61 6c 66 75 6e 63 74 69 6f  dex() malfunctio
27ed0 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
27ee0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
27ef0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61   whereLoopAddVta
27f00 62 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  b_exit;.        
27f10 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  }.        testca
27f20 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73  se( iTerm==nCons
27f30 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20  traint-1 );.    
27f40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
27f50 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
27f60 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d 3e  stcase( j==pWC->
27f70 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20 20  nTerm-1 );.     
27f80 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
27f90 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70  >a[j];.        p
27fa0 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70  New->prereq |= p
27fb0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
27fc0 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
27fd0 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e  t( iTerm<pNew->n
27fe0 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 20  LSlot );.       
27ff0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54   pNew->aLTerm[iT
28000 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  erm] = pTerm;.  
28010 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e        if( iTerm>
28020 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20  mxTerm ) mxTerm 
28030 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = iTerm;.       
28040 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d   testcase( iTerm
28050 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20 20 20 20  ==15 );.        
28060 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d  testcase( iTerm=
28070 3d 31 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69  =16 );.        i
28080 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20 70  f( iTerm<16 && p
28090 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20  Usage[i].omit ) 
280a0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  pNew->u.vtab.omi
280b0 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65 72  tMask |= 1<<iTer
280c0 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  m;.        if( (
280d0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
280e0 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a   & WO_IN)!=0 ){.
280f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 55            if( pU
28100 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20  sage[i].omit==0 
28110 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
28120 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
28130 20 74 6f 20 75 73 65 20 61 6e 20 49 4e 20 63 6f   to use an IN co
28140 6e 73 74 72 61 69 6e 74 20 69 66 20 74 68 65 20  nstraint if the 
28150 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20  virtual table.  
28160 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 79            ** say
28170 73 20 74 68 61 74 20 74 68 65 20 65 71 75 69 76  s that the equiv
28180 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74 72 61  alent EQ constra
28190 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61  int cannot be sa
281a0 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20 20  fely omitted..  
281b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
281c0 77 65 20 64 6f 20 61 74 74 65 6d 70 74 20 74 6f  we do attempt to
281d0 20 75 73 65 20 73 75 63 68 20 61 20 63 6f 6e 73   use such a cons
281e0 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f 77  traint, some row
281f0 73 20 6d 69 67 68 74 20 62 65 0a 20 20 20 20 20  s might be.     
28200 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65 61 74         ** repeat
28210 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ed in the output
28220 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
28230 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
28240 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a    }.          /*
28250 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   A virtual table
28260 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61   that is constra
28270 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63 6c  ined by an IN cl
28280 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20  ause may not.   
28290 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d         ** consum
282a0 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  e the ORDER BY c
282b0 6c 61 75 73 65 20 62 65 63 61 75 73 65 20 28 31  lause because (1
282c0 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49  ) the order of I
282d0 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20 20  N terms.        
282e0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65    ** is not nece
282f0 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20  ssarily related 
28300 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  to the order of 
28310 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e 64  output terms and
28320 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 28 32  .          ** (2
28330 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70 75  ) Multiple outpu
28340 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  ts from a single
28350 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e   IN value will n
28360 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20 20 20  ot merge.       
28370 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20     ** together. 
28380 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49   */.          pI
28390 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
283a0 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20  onsumed = 0;.   
283b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
283c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d     }.    if( i>=
283d0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20  nConstraint ){. 
283e0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72       pNew->nLTer
283f0 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20  m = mxTerm+1;.  
28400 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
28410 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e  ->nLTerm<=pNew->
28420 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20  nLSlot );.      
28430 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
28440 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  Num = pIdxInfo->
28450 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70 4e  idxNum;.      pN
28460 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
28470 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  ree = pIdxInfo->
28480 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
28490 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f  ;.      pIdxInfo
284a0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
284b0 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e  tr = 0;.      pN
284c0 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  ew->u.vtab.idxSt
284d0 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  r = pIdxInfo->id
284e0 78 53 74 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  xStr;.      pNew
284f0 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72  ->u.vtab.isOrder
28500 65 64 20 3d 20 28 75 38 29 28 28 70 49 64 78 49  ed = (u8)((pIdxI
28510 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 21 3d 30  nfo->nOrderBy!=0
28520 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
28530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28540 20 20 20 20 20 20 20 26 26 20 70 49 64 78 49 6e         && pIdxIn
28550 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
28560 6d 65 64 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  med);.      pNew
28570 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
28580 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
28590 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46 72   sqlite3LogEstFr
285a0 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66  omDouble(pIdxInf
285b0 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
285c0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  );.      pNew->n
285d0 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Out = sqlite3Log
285e0 45 73 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73  Est(pIdxInfo->es
285f0 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 20 20  timatedRows);.  
28600 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73      whereLoopIns
28610 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
28620 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ew);.      if( p
28630 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
28640 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Free ){.        
28650 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
28660 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  w->u.vtab.idxStr
28670 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
28680 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
28690 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
286a0 20 20 7d 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65    }.  }  ..where
286b0 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74  LoopAddVtab_exit
286c0 3a 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  :.  if( pIdxInfo
286d0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
286e0 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  tr ) sqlite3_fre
286f0 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  e(pIdxInfo->idxS
28700 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  tr);.  sqlite3Db
28710 46 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66  Free(db, pIdxInf
28720 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  o);.  return rc;
28730 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
28740 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
28750 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
28760 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  Add WhereLoop en
28770 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20  tries to handle 
28780 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20  OR terms.  This 
28790 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72  works for either
287a0 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69  .** btrees or vi
287b0 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f  rtual tables..*/
287c0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
287d0 65 4c 6f 6f 70 41 64 64 4f 72 28 57 68 65 72 65  eLoopAddOr(Where
287e0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
287f0 69 6c 64 65 72 2c 20 42 69 74 6d 61 73 6b 20 6d  ilder, Bitmask m
28800 45 78 74 72 61 29 7b 0a 20 20 57 68 65 72 65 49  Extra){.  WhereI
28810 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
28820 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
28830 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
28840 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  WC;.  WhereLoop 
28850 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65  *pNew;.  WhereTe
28860 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45  rm *pTerm, *pWCE
28870 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  nd;.  int rc = S
28880 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
28890 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61  iCur;.  WhereCla
288a0 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68  use tempWC;.  Wh
288b0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73  ereLoopBuilder s
288c0 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72  SubBuild;.  Wher
288d0 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75  eOrSet sSum, sCu
288e0 72 2c 20 73 50 72 65 76 3b 0a 20 20 73 74 72 75  r, sPrev;.  stru
288f0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
28900 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43  *pItem;.  .  pWC
28910 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
28920 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  ;.  if( pWInfo->
28930 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
28940 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 29 20 72 65  RE_AND_ONLY ) re
28950 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28960 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e    pWCEnd = pWC->
28970 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  a + pWC->nTerm;.
28980 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
28990 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65  r->pNew;.  memse
289a0 74 28 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65  t(&sSum, 0, size
289b0 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20 70 49 74  of(sSum));.  pIt
289c0 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  em = pWInfo->pTa
289d0 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d  bList->a + pNew-
289e0 3e 69 54 61 62 3b 0a 20 20 69 66 28 20 21 48 61  >iTab;.  if( !Ha
289f0 73 52 6f 77 69 64 28 70 49 74 65 6d 2d 3e 70 54  sRowid(pItem->pT
28a00 61 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ab) ) return SQL
28a10 49 54 45 5f 4f 4b 3b 0a 20 20 69 43 75 72 20 3d  ITE_OK;.  iCur =
28a20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
28a30 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ..  for(pTerm=pW
28a40 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
28a50 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  nd && rc==SQLITE
28a60 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  _OK; pTerm++){. 
28a70 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
28a80 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52  Operator & WO_OR
28a90 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )!=0.     && (pT
28aa0 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
28ab0 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77  indexable & pNew
28ac0 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a  ->maskSelf)!=0 .
28ad0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65      ){.      Whe
28ae0 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74  reClause * const
28af0 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d   pOrWC = &pTerm-
28b00 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  >u.pOrInfo->wc;.
28b10 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
28b20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64  * const pOrWCEnd
28b30 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72   = &pOrWC->a[pOr
28b40 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20  WC->nTerm];.    
28b50 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72    WhereTerm *pOr
28b60 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Term;.      int 
28b70 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  once = 1;.      
28b80 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20  int i, j;.    . 
28b90 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d       sSubBuild =
28ba0 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20   *pBuilder;.    
28bb0 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64    sSubBuild.pOrd
28bc0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
28bd0 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 53 65 74  sSubBuild.pOrSet
28be0 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20 20 20   = &sCur;..     
28bf0 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72   for(pOrTerm=pOr
28c00 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70  WC->a; pOrTerm<p
28c10 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d  OrWCEnd; pOrTerm
28c20 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
28c30 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
28c40 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d  ator & WO_AND)!=
28c50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
28c60 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26  SubBuild.pWC = &
28c70 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49  pOrTerm->u.pAndI
28c80 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20  nfo->wc;.       
28c90 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
28ca0 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
28cb0 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
28cc0 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20    tempWC.pWInfo 
28cd0 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20  = pWC->pWInfo;. 
28ce0 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
28cf0 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20  pOuter = pWC;.  
28d00 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f          tempWC.o
28d10 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20  p = TK_AND;.    
28d20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65        tempWC.nTe
28d30 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
28d40 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72    tempWC.a = pOr
28d50 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Term;.          
28d60 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20  sSubBuild.pWC = 
28d70 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20  &tempWC;.       
28d80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28d90 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
28da0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43      }.        sC
28db0 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 6e 64 65  ur.n = 0;.#ifnde
28dc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
28dd0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
28de0 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
28df0 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b  (pItem->pTab) ){
28e00 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28e10 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
28e20 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64 2c 20  ual(&sSubBuild, 
28e30 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 20  mExtra);.       
28e40 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
28e50 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
28e60 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
28e70 41 64 64 42 74 72 65 65 28 26 73 53 75 62 42 75  AddBtree(&sSubBu
28e80 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  ild, mExtra);.  
28e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28ea0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
28eb0 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d  TE_OK || sCur.n=
28ec0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
28ed0 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20  ( sCur.n==0 ){. 
28ee0 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20           sSum.n 
28ef0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 0;.          b
28f00 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
28f10 6c 73 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a  lse if( once ){.
28f20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f            whereO
28f30 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43  rMove(&sSum, &sC
28f40 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  ur);.          o
28f50 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
28f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28f70 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73    whereOrMove(&s
28f80 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20  Prev, &sSum);.  
28f90 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d          sSum.n =
28fa0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   0;.          fo
28fb0 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e  r(i=0; i<sPrev.n
28fc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
28fd0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
28fe0 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Cur.n; j++){.   
28ff0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
29000 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c 20  OrInsert(&sSum, 
29010 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65  sPrev.a[i].prere
29020 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72  q | sCur.a[j].pr
29030 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20  ereq,.          
29040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29050 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41    sqlite3LogEstA
29060 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52  dd(sPrev.a[i].rR
29070 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52  un, sCur.a[j].rR
29080 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  un),.           
29090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290a0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
290b0 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75  d(sPrev.a[i].nOu
290c0 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75  t, sCur.a[j].nOu
290d0 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t));.           
290e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
290f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29100 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  .      pNew->nLT
29110 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  erm = 1;.      p
29120 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  New->aLTerm[0] =
29130 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e   pTerm;.      pN
29140 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
29150 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20  ERE_MULTI_OR;.  
29160 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
29170 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
29180 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a  ->iSortIdx = 0;.
29190 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e        memset(&pN
291a0 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66  ew->u, 0, sizeof
291b0 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20  (pNew->u));.    
291c0 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
291d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53  QLITE_OK && i<sS
291e0 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  um.n; i++){.    
291f0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d      /* TUNING: M
29200 75 6c 74 69 70 6c 65 20 62 79 20 33 2e 35 20 66  ultiple by 3.5 f
29210 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 61 72 79  or the secondary
29220 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 20 2a 2f   table lookup */
29230 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
29240 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e  Run = sSum.a[i].
29250 72 52 75 6e 20 2b 20 31 38 3b 0a 20 20 20 20 20  rRun + 18;.     
29260 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
29270 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a  sSum.a[i].nOut;.
29280 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
29290 65 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  ereq = sSum.a[i]
292a0 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20  .prereq;.       
292b0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
292c0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
292d0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
292e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
292f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
29300 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  dd all WhereLoop
29310 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
29320 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74   tables .*/.stat
29330 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
29340 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70  AddAll(WhereLoop
29350 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
29360 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  r){.  WhereInfo 
29370 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
29380 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69  er->pWInfo;.  Bi
29390 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30  tmask mExtra = 0
293a0 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69  ;.  Bitmask mPri
293b0 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  or = 0;.  int iT
293c0 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ab;.  SrcList *p
293d0 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
293e0 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74  ->pTabList;.  st
293f0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
29400 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
29410 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f  te3 *db = pWInfo
29420 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
29430 69 6e 74 20 6e 54 61 62 4c 69 73 74 20 3d 20 70  int nTabList = p
29440 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20  WInfo->nLevel;. 
29450 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
29460 5f 4f 4b 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a  _OK;.  u8 priorJ
29470 6f 69 6e 54 79 70 65 20 3d 20 30 3b 0a 20 20 57  oinType = 0;.  W
29480 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
29490 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  .  /* Loop over 
294a0 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
294b0 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66  e join, from lef
294c0 74 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20  t to right */.  
294d0 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
294e0 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f  >pNew;.  whereLo
294f0 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20  opInit(pNew);.  
29500 66 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65  for(iTab=0, pIte
29510 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
29520 54 61 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54  Tab<nTabList; iT
29530 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a  ab++, pItem++){.
29540 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d      pNew->iTab =
29550 20 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d   iTab;.    pNew-
29560 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d  >maskSelf = getM
29570 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
29580 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43  skSet, pItem->iC
29590 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ursor);.    if( 
295a0 28 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  ((pItem->jointyp
295b0 65 7c 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 29  e|priorJoinType)
295c0 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43   & (JT_LEFT|JT_C
295d0 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20  ROSS))!=0 ){.   
295e0 20 20 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69     mExtra = mPri
295f0 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72  or;.    }.    pr
29600 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70 49  iorJoinType = pI
29610 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20  tem->jointype;. 
29620 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
29630 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b  (pItem->pTab) ){
29640 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
29650 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
29660 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61  pBuilder, mExtra
29670 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
29680 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
29690 6f 70 41 64 64 42 74 72 65 65 28 70 42 75 69 6c  opAddBtree(pBuil
296a0 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  der, mExtra);.  
296b0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
296c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
296d0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
296e0 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72 2c  pAddOr(pBuilder,
296f0 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a   mExtra);.    }.
29700 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e      mPrior |= pN
29710 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  ew->maskSelf;.  
29720 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e    if( rc || db->
29730 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
29740 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 65 72  reak;.  }.  wher
29750 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70  eLoopClear(db, p
29760 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  New);.  return r
29770 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d  c;.}../*.** Exam
29780 69 6e 65 20 61 20 57 68 65 72 65 50 61 74 68 20  ine a WherePath 
29790 28 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69  (with the additi
297a0 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61 20  on of the extra 
297b0 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65  WhereLoop of the
297c0 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65   5th.** paramete
297d0 72 73 29 20 74 6f 20 73 65 65 20 69 66 20 69 74  rs) to see if it
297e0 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e   outputs rows in
297f0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 4f   the requested O
29800 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47  RDER BY.** (or G
29810 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75 74  ROUP BY) without
29820 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65 70   requiring a sep
29830 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61  arate sort opera
29840 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 3a 0a 2a  tion.  Return:.*
29850 2a 20 0a 2a 2a 20 20 20 20 30 3a 20 20 4f 52 44  * .**    0:  ORD
29860 45 52 20 42 59 20 69 73 20 6e 6f 74 20 73 61 74  ER BY is not sat
29870 69 73 66 69 65 64 2e 20 20 53 6f 72 74 69 6e 67  isfied.  Sorting
29880 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 20 20 20   required.**    
29890 31 3a 20 20 4f 52 44 45 52 20 42 59 20 69 73 20  1:  ORDER BY is 
298a0 73 61 74 69 73 66 69 65 64 2e 20 20 20 20 20 20  satisfied.      
298b0 4f 6d 69 74 20 73 6f 72 74 69 6e 67 0a 2a 2a 20  Omit sorting.** 
298c0 20 20 2d 31 3a 20 20 55 6e 6b 6e 6f 77 6e 20 61    -1:  Unknown a
298d0 74 20 74 68 69 73 20 74 69 6d 65 0a 2a 2a 0a 2a  t this time.**.*
298e0 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 72 6f 63  * Note that proc
298f0 65 73 73 69 6e 67 20 66 6f 72 20 57 48 45 52 45  essing for WHERE
29900 5f 47 52 4f 55 50 42 59 20 61 6e 64 20 57 48 45  _GROUPBY and WHE
29910 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 69 73  RE_DISTINCTBY is
29920 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72 69 63   not as.** stric
29930 74 2e 20 20 57 69 74 68 20 47 52 4f 55 50 20 42  t.  With GROUP B
29940 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 74  Y and DISTINCT t
29950 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d  he only requirem
29960 65 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a 20 65  ent is that.** e
29970 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61  quivalent rows a
29980 70 70 65 61 72 20 69 6d 6d 65 64 69 61 74 65 6c  ppear immediatel
29990 79 20 61 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e  y adjacent to on
299a0 65 20 61 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55  e another.  GROU
299b0 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54  P BY.** and DIST
299c0 49 4e 54 20 64 6f 20 6e 6f 74 20 72 65 71 75 69  INT do not requi
299d0 72 65 20 72 6f 77 73 20 74 6f 20 61 70 70 65 61  re rows to appea
299e0 72 20 69 6e 20 61 6e 79 20 70 61 72 74 69 63 75  r in any particu
299f0 6c 61 72 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e  lar order as lon
29a00 67 0a 2a 2a 20 61 73 20 65 71 75 69 76 65 6c 65  g.** as equivele
29a10 6e 74 20 72 6f 77 73 20 61 72 65 20 67 72 6f 75  nt rows are grou
29a20 70 65 64 20 74 6f 67 65 74 68 65 72 2e 20 20 54  ped together.  T
29a30 68 75 73 20 66 6f 72 20 47 52 4f 55 50 20 42 59  hus for GROUP BY
29a40 20 61 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a   and DISTINCT.**
29a50 20 74 68 65 20 70 4f 72 64 65 72 42 79 20 74 65   the pOrderBy te
29a60 72 6d 73 20 63 61 6e 20 62 65 20 6d 61 74 63 68  rms can be match
29a70 65 64 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e  ed in any order.
29a80 20 20 57 69 74 68 20 4f 52 44 45 52 20 42 59 2c    With ORDER BY,
29a90 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42   the .** pOrderB
29aa0 79 20 74 65 72 6d 73 20 6d 75 73 74 20 62 65 20  y terms must be 
29ab0 6d 61 74 63 68 65 64 20 69 6e 20 73 74 72 69 63  matched in stric
29ac0 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20  t left-to-right 
29ad0 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
29ae0 20 69 6e 74 20 77 68 65 72 65 50 61 74 68 53 61   int wherePathSa
29af0 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 0a  tisfiesOrderBy(.
29b00 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
29b10 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20 57  nfo,    /* The W
29b20 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
29b30 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
29b40 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20  rBy,   /* ORDER 
29b50 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f  BY or GROUP BY o
29b60 72 20 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73  r DISTINCT claus
29b70 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
29b80 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68  WherePath *pPath
29b90 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  ,     /* The Whe
29ba0 72 65 50 61 74 68 20 74 6f 20 63 68 65 63 6b 20  rePath to check 
29bb0 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c  */.  u16 wctrlFl
29bc0 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4d 69  ags,       /* Mi
29bd0 67 68 74 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  ght contain WHER
29be0 45 5f 47 52 4f 55 50 42 59 20 6f 72 20 57 48 45  E_GROUPBY or WHE
29bf0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 2a 2f  RE_DISTINCTBY */
29c00 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20  .  u16 nLoop,   
29c10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
29c20 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
29c30 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20   pPath->aLoop[] 
29c40 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
29c50 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20 41 64  pLast,     /* Ad
29c60 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70  d this WhereLoop
29c70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 70   to the end of p
29c80 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f  Path->aLoop[] */
29c90 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70 52 65 76  .  Bitmask *pRev
29ca0 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a  Mask     /* OUT:
29cb0 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f   Mask of WhereLo
29cc0 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20 72 65  ops to run in re
29cd0 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29  verse order */.)
29ce0 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b 20 20  {.  u8 revSet;  
29cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
29d00 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e 6f 77  e if rev is know
29d10 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20 20  n */.  u8 rev;  
29d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29d30 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74 20 6f  Composite sort o
29d40 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 76  rder */.  u8 rev
29d50 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
29d60 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20 6f 72  /* Index sort or
29d70 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72  der */.  u8 isOr
29d80 64 65 72 44 69 73 74 69 6e 63 74 3b 20 20 20 2f  derDistinct;   /
29d90 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57 68 65 72  * All prior Wher
29da0 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64 65 72  eLoops are order
29db0 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75  -distinct */.  u
29dc0 38 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  8 distinctColumn
29dd0 73 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  s;   /* True if 
29de0 74 68 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49  the loop has UNI
29df0 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c  QUE NOT NULL col
29e00 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d  umns */.  u8 isM
29e10 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  atch;           
29e20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68  /* iColumn match
29e30 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65  es a term of the
29e40 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
29e50 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f   */.  u16 nKeyCo
29e60 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  l;          /* N
29e70 75 6d 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c  umber of key col
29e80 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a  umns in pIndex *
29e90 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b  /.  u16 nColumn;
29ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
29eb0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64  al number of ord
29ec0 65 72 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  ered columns in 
29ed0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75  the index */.  u
29ee0 31 36 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  16 nOrderBy;    
29ef0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74       /* Number t
29f00 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
29f10 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
29f20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20   int iLoop;     
29f30 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
29f40 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20  of WhereLoop in 
29f50 70 50 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63  pPath being proc
29f60 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  essed */.  int i
29f70 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
29f80 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
29f90 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  s */.  int iCur;
29fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29fb0 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
29fc0 72 20 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c  r current WhereL
29fd0 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  oop */.  int iCo
29fe0 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  lumn;          /
29ff0 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  * A column numbe
2a000 72 20 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69  r within table i
2a010 43 75 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  Cur */.  WhereLo
2a020 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f  op *pLoop = 0; /
2a030 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c  * Current WhereL
2a040 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73  oop being proces
2a050 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54  sed. */.  WhereT
2a060 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
2a070 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d  /* A single term
2a080 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2a090 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
2a0a0 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20 20  pOBExpr;        
2a0b0 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e  /* An expression
2a0c0 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20   from the ORDER 
2a0d0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43  BY clause */.  C
2a0e0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
2a0f0 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20       /* COLLATE 
2a100 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e  function from an
2a110 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2a120 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78   term */.  Index
2a130 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
2a140 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73   /* The index as
2a150 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 4c  sociated with pL
2a160 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  oop */.  sqlite3
2a170 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   *db = pWInfo->p
2a180 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
2a190 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2a1a0 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
2a1b0 6f 62 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a  obSat = 0;    /*
2a1c0 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42   Mask of ORDER B
2a1d0 59 20 74 65 72 6d 73 20 73 61 74 69 73 66 69 65  Y terms satisfie
2a1e0 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69  d so far */.  Bi
2a1f0 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20  tmask obDone;   
2a200 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
2a210 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ll ORDER BY term
2a220 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f  s */.  Bitmask o
2a230 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
2a240 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c  ;  /* Mask of al
2a250 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c  l well-ordered l
2a260 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  oops */.  Bitmas
2a270 6b 20 72 65 61 64 79 3b 20 20 20 20 20 20 20 20  k ready;        
2a280 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
2a290 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a   inner loops */.
2a2a0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61  .  /*.  ** We sa
2a2b0 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  y the WhereLoop 
2a2c0 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20  is "one-row" if 
2a2d0 69 74 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20  it generates no 
2a2e0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20  more than one.  
2a2f0 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  ** row of output
2a300 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69  .  A WhereLoop i
2a310 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c  s one-row if all
2a320 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2a330 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a  g are true:.  **
2a340 20 20 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20    (a) All index 
2a350 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69  columns match wi
2a360 74 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  th WHERE_COLUMN_
2a370 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68  EQ..  **  (b) Th
2a380 65 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75  e index is uniqu
2a390 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65  e.  ** Any Where
2a3a0 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45  Loop with an WHE
2a3b0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e  RE_COLUMN_EQ con
2a3c0 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72  straint on the r
2a3d0 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e  owid is one-row.
2a3e0 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d  .  ** Every one-
2a3f0 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69  row WhereLoop wi
2a400 6c 6c 20 68 61 76 65 20 74 68 65 20 57 48 45 52  ll have the WHER
2a410 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74  E_ONEROW bit set
2a420 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a   in wsFlags..  *
2a430 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68  *.  ** We say th
2a440 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22  e WhereLoop is "
2a450 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20  order-distinct" 
2a460 69 66 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  if the set of co
2a470 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  lumns from.  ** 
2a480 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74  that WhereLoop t
2a490 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f  hat are in the O
2a4a0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
2a4b0 72 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  re different for
2a4c0 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20   every.  ** row 
2a4d0 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
2a4e0 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77  .  Every one-row
2a4f0 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75   WhereLoop is au
2a500 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a  tomatically.  **
2a510 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
2a520 20 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74     A WhereLoop t
2a530 68 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d  hat has no colum
2a540 6e 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ns in the ORDER 
2a550 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69  BY clause.  ** i
2a560 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74  s not order-dist
2a570 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65  inct. To be orde
2a580 72 2d 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f  r-distinct is no
2a590 74 20 71 75 69 74 65 20 74 68 65 20 73 61 6d 65  t quite the same
2a5a0 20 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55   as being.  ** U
2a5b0 4e 49 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e  NIQUE since a UN
2a5c0 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69  IQUE column or i
2a5d0 6e 64 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75  ndex can have mu
2a5e0 6c 74 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74  ltiple rows that
2a5f0 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20   .  ** are NULL 
2a600 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  and NULL values 
2a610 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  are equivalent f
2a620 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f  or the purpose o
2a630 66 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  f order-distinct
2a640 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64  ..  ** To be ord
2a650 65 72 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65  er-distinct, the
2a660 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65   columns must be
2a670 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20   UNIQUE and NOT 
2a680 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  NULL..  **.  ** 
2a690 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20  The rowid for a 
2a6a0 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  table is always 
2a6b0 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e  UNIQUE and NOT N
2a6c0 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20  ULL so whenever 
2a6d0 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61  the.  ** rowid a
2a6e0 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52  ppears in the OR
2a6f0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
2a700 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2a710 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20   WhereLoop is.  
2a720 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
2a730 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
2a740 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  .  */..  assert(
2a750 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a   pOrderBy!=0 );.
2a760 0a 20 20 2f 2a 20 53 6f 72 74 61 62 69 6c 69 74  .  /* Sortabilit
2a770 79 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61 62  y of virtual tab
2a780 6c 65 73 20 69 73 20 64 65 74 65 72 6d 69 6e 65  les is determine
2a790 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e  d by the xBestIn
2a7a0 64 65 78 20 6d 65 74 68 6f 64 0a 20 20 2a 2a 20  dex method.  ** 
2a7b0 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
2a7c0 61 62 6c 65 20 69 74 73 65 6c 66 20 2a 2f 0a 20  able itself */. 
2a7d0 20 69 66 28 20 70 4c 61 73 74 2d 3e 77 73 46 6c   if( pLast->wsFl
2a7e0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
2a7f0 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20  UALTABLE ){.    
2a800 74 65 73 74 63 61 73 65 28 20 6e 4c 6f 6f 70 3e  testcase( nLoop>
2a810 30 20 29 3b 20 20 2f 2a 20 54 72 75 65 20 77 68  0 );  /* True wh
2a820 65 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 61  en outer loops a
2a830 72 65 20 6f 6e 65 2d 72 6f 77 20 61 6e 64 20 6d  re one-row and m
2a840 61 74 63 68 20 0a 20 20 20 20 20 20 20 20 20 20  atch .          
2a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a860 2a 2a 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 74  ** no ORDER BY t
2a870 65 72 6d 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  erms */.    retu
2a880 72 6e 20 70 4c 61 73 74 2d 3e 75 2e 76 74 61 62  rn pLast->u.vtab
2a890 2e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 7d 0a  .isOrdered;.  }.
2a8a0 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f    if( nLoop && O
2a8b0 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
2a8c0 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  led(db, SQLITE_O
2a8d0 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29  rderByIdxJoin) )
2a8e0 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f   return 0;..  nO
2a8f0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
2a900 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73 74  y->nExpr;.  test
2a910 63 61 73 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d  case( nOrderBy==
2a920 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e  BMS-1 );.  if( n
2a930 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20  OrderBy>BMS-1 ) 
2a940 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61  return 0;  /* Ca
2a950 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76  nnot optimize ov
2a960 65 72 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52  erly large ORDER
2a970 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65   BYs */.  isOrde
2a980 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20  rDistinct = 1;. 
2a990 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49   obDone = MASKBI
2a9a0 54 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20  T(nOrderBy)-1;. 
2a9b0 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
2a9c0 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20  sk = 0;.  ready 
2a9d0 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  = 0;.  for(iLoop
2a9e0 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73 74 69  =0; isOrderDisti
2a9f0 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f 62 44  nct && obSat<obD
2aa00 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c  one && iLoop<=nL
2aa10 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20  oop; iLoop++){. 
2aa20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29     if( iLoop>0 )
2aa30 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d   ready |= pLoop-
2aa40 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70  >maskSelf;.    p
2aa50 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f  Loop = iLoop<nLo
2aa60 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  op ? pPath->aLoo
2aa70 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73 74  p[iLoop] : pLast
2aa80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
2aa90 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2aaa0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
2aab0 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 43  LE)==0 );.    iC
2aac0 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ur = pWInfo->pTa
2aad0 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e  bList->a[pLoop->
2aae0 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a  iTab].iCursor;..
2aaf0 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20      /* Mark off 
2ab00 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74 65 72  any ORDER BY ter
2ab10 6d 20 58 20 74 68 61 74 20 69 73 20 61 20 63 6f  m X that is a co
2ab20 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c  lumn in the tabl
2ab30 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  e of.    ** the 
2ab40 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72  current loop for
2ab50 20 77 68 69 63 68 20 74 68 65 72 65 20 69 73 20   which there is 
2ab60 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
2ab70 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20  E.    ** clause 
2ab80 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 53  of the form X IS
2ab90 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61   NULL or X=? tha
2aba0 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79  t reference only
2abb0 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f   outer.    ** lo
2abc0 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ops..    */.    
2abd0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
2abe0 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
2abf0 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20   if( MASKBIT(i) 
2ac00 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e  & obSat ) contin
2ac10 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45 78 70  ue;.      pOBExp
2ac20 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
2ac30 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65  kipCollate(pOrde
2ac40 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
2ac50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45  ;.      if( pOBE
2ac60 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
2ac70 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  MN ) continue;. 
2ac80 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
2ac90 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29  ->iTable!=iCur )
2aca0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2acb0 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
2acc0 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  m(&pWInfo->sWC, 
2acd0 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69  iCur, pOBExpr->i
2ace0 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20  Column,.        
2acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7e                 ~
2ad00 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f  ready, WO_EQ|WO_
2ad10 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20  ISNULL, 0);.    
2ad20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
2ad30 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2ad40 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
2ad50 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30  erator&WO_EQ)!=0
2ad60 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f   && pOBExpr->iCo
2ad70 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  lumn>=0 ){.     
2ad80 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2ad90 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20  1, *z2;.        
2ada0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
2adb0 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
2adc0 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65  o->pParse, pOrde
2add0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
2ade0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
2adf0 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
2ae00 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
2ae10 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c        z1 = pColl
2ae20 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
2ae30 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
2ae40 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e  ExprCollSeq(pWIn
2ae50 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54 65 72  fo->pParse, pTer
2ae60 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
2ae70 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
2ae80 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
2ae90 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a  tColl;.        z
2aea0 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  2 = pColl->zName
2aeb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
2aec0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c  lite3StrICmp(z1,
2aed0 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e   z2)!=0 ) contin
2aee0 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
2aef0 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42    obSat |= MASKB
2af00 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  IT(i);.    }..  
2af10 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
2af20 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2af30 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20  EROW)==0 ){.    
2af40 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
2af50 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b  lags & WHERE_IPK
2af60 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   ){.        pInd
2af70 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ex = 0;.        
2af80 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  nKeyCol = 0;.   
2af90 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31       nColumn = 1
2afa0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
2afb0 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f  ( (pIndex = pLoo
2afc0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
2afd0 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d  x)==0 || pIndex-
2afe0 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20  >bUnordered ){. 
2aff0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
2b000 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2b010 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20        nKeyCol = 
2b020 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  pIndex->nKeyCol;
2b030 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e  .        nColumn
2b040 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   = pIndex->nColu
2b050 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  mn;.        asse
2b060 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65  rt( nColumn==nKe
2b070 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f  yCol+1 || !HasRo
2b080 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62  wid(pIndex->pTab
2b090 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61  le) );.        a
2b0a0 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 61  ssert( pIndex->a
2b0b0 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d  iColumn[nColumn-
2b0c0 31 5d 3d 3d 28 2d 31 29 20 7c 7c 20 21 48 61 73  1]==(-1) || !Has
2b0d0 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54  Rowid(pIndex->pT
2b0e0 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20  able));.        
2b0f0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2b100 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  = pIndex->onErro
2b110 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 20 20  r!=OE_None;.    
2b120 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f    }..      /* Lo
2b130 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63  op through all c
2b140 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
2b150 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69 74  dex and deal wit
2b160 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20 20  h the ones.     
2b170 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74   ** that are not
2b180 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20   constrained by 
2b190 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20  == or IN..      
2b1a0 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20 72  */.      rev = r
2b1b0 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  evSet = 0;.     
2b1c0 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
2b1d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
2b1e0 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20  j=0; j<nColumn; 
2b1f0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 38  j++){.        u8
2b200 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72 75   bOnce;   /* Tru
2b210 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44  e to run the ORD
2b220 45 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f  ER BY search loo
2b230 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a  p */..        /*
2b240 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e   Skip over == an
2b250 64 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d 73 20  d IS NULL terms 
2b260 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  */.        if( j
2b270 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  <pLoop->u.btree.
2b280 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20  nEq.         && 
2b290 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
2b2a0 53 6b 69 70 3d 3d 30 0a 20 20 20 20 20 20 20 20  Skip==0.        
2b2b0 20 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d   && ((i = pLoop-
2b2c0 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65  >aLTerm[j]->eOpe
2b2d0 72 61 74 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c  rator) & (WO_EQ|
2b2e0 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 0a 20  WO_ISNULL))!=0. 
2b2f0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2b300 20 20 20 20 69 66 28 20 69 20 26 20 57 4f 5f 49      if( i & WO_I
2b310 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  SNULL ){.       
2b320 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2b330 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29  sOrderDistinct )
2b340 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73  ;.            is
2b350 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
2b360 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
2b370 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2b380 65 3b 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a  e;  .        }..
2b390 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74          /* Get t
2b3a0 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  he column number
2b3b0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69   in the table (i
2b3c0 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74  Column) and sort
2b3d0 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a   order.        *
2b3e0 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72 20 74  * (revIdx) for t
2b3f0 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  he j-th column o
2b400 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  f the index..   
2b410 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2b420 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
2b430 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20          iColumn 
2b440 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  = pIndex->aiColu
2b450 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20  mn[j];.         
2b460 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78   revIdx = pIndex
2b470 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b  ->aSortOrder[j];
2b480 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2b490 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e  Column==pIndex->
2b4a0 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20  pTable->iPKey ) 
2b4b0 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
2b4c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b4d0 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
2b4e0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72   -1;.          r
2b4f0 65 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20  evIdx = 0;.     
2b500 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
2b510 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65   An unconstraine
2b520 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69  d column that mi
2b530 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e  ght be NULL mean
2b540 73 20 74 68 61 74 20 74 68 69 73 0a 20 20 20 20  s that this.    
2b550 20 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70      ** WhereLoop
2b560 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64   is not well-ord
2b570 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ered.        */.
2b580 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72          if( isOr
2b590 64 65 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20  derDistinct.    
2b5a0 20 20 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e       && iColumn>
2b5b0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a  =0.         && j
2b5c0 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  >=pLoop->u.btree
2b5d0 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26  .nEq.         &&
2b5e0 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
2b5f0 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e  >aCol[iColumn].n
2b600 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20  otNull==0.      
2b610 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
2b620 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
2b630 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
2b640 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74         /* Find t
2b650 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
2b660 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
2b670 73 20 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f  s to the j-th co
2b680 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  lumn.        ** 
2b690 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
2b6a0 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20 4f   and mark that O
2b6b0 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66 66  RDER BY term off
2b6c0 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
2b6d0 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 31 3b 0a       bOnce = 1;.
2b6e0 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20          isMatch 
2b6f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
2b700 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20 69  (i=0; bOnce && i
2b710 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
2b720 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4d  .          if( M
2b730 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61  ASKBIT(i) & obSa
2b740 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
2b750 20 20 20 20 20 20 20 20 70 4f 42 45 78 70 72 20          pOBExpr 
2b760 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
2b770 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42  pCollate(pOrderB
2b780 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
2b790 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2b7a0 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  se( wctrlFlags &
2b7b0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29   WHERE_GROUPBY )
2b7c0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
2b7d0 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73  case( wctrlFlags
2b7e0 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
2b7f0 54 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20  TBY );.         
2b800 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
2b810 20 26 20 28 57 48 45 52 45 5f 47 52 4f 55 50 42   & (WHERE_GROUPB
2b820 59 7c 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  Y|WHERE_DISTINCT
2b830 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20  BY))==0 ) bOnce 
2b840 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
2b850 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d  f( pOBExpr->op!=
2b860 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74  TK_COLUMN ) cont
2b870 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2b880 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61  if( pOBExpr->iTa
2b890 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74  ble!=iCur ) cont
2b8a0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2b8b0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  if( pOBExpr->iCo
2b8c0 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20  lumn!=iColumn ) 
2b8d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2b8e0 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e      if( iColumn>
2b8f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2b900 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2b910 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49  3ExprCollSeq(pWI
2b920 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72  nfo->pParse, pOr
2b930 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
2b940 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
2b950 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
2b960 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
2b970 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
2b980 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
2b990 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
2b9a0 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
2b9b0 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  j])!=0 ) continu
2b9c0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2b9d0 20 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68           isMatch
2b9e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2b9f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
2ba00 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d  .        if( isM
2ba10 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  atch ){.        
2ba20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20    if( iColumn<0 
2ba30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
2ba40 65 73 74 63 61 73 65 28 20 64 69 73 74 69 6e 63  estcase( distinc
2ba50 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20  tColumns==0 );. 
2ba60 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 69             disti
2ba70 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a  nctColumns = 1;.
2ba80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ba90 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d        obSat |= M
2baa0 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20  ASKBIT(i);.     
2bab0 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f       if( (pWInfo
2bac0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
2bad0 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30  HERE_GROUPBY)==0
2bae0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2baf0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
2bb00 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63   sort order is c
2bb10 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20  ompatible in an 
2bb20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
2bb30 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2bb40 53 6f 72 74 20 6f 72 64 65 72 20 69 73 20 69 72  Sort order is ir
2bb50 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47  relevant for a G
2bb60 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
2bb70 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
2bb80 66 28 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20  f( revSet ){.   
2bb90 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
2bba0 72 65 76 20 5e 20 72 65 76 49 64 78 29 21 3d 70  rev ^ revIdx)!=p
2bbb0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
2bbc0 72 74 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e  rtOrder ) return
2bbd0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
2bbe0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2bbf0 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 49 64       rev = revId
2bc00 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  x ^ pOrderBy->a[
2bc10 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
2bc20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2bc30 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20  rev ) *pRevMask 
2bc40 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70  |= MASKBIT(iLoop
2bc50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2bc60 20 72 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20   revSet = 1;.   
2bc70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2bc80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2bc90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2bca0 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e  /* No match foun
2bcb0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  d */.          i
2bcc0 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65  f( j==0 || j<nKe
2bcd0 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  yCol ){.        
2bce0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
2bcf0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21 3d 30  OrderDistinct!=0
2bd00 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2bd10 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2bd20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
2bd30 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2bd40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2bd50 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20    } /* end Loop 
2bd60 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20 63  over all index c
2bd70 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20  olumns */.      
2bd80 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75  if( distinctColu
2bd90 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20 20 74  mns ){.        t
2bda0 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72  estcase( isOrder
2bdb0 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20  Distinct==0 );. 
2bdc0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
2bdd0 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20  stinct = 1;.    
2bde0 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64    }.    } /* end
2bdf0 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20  -if not one-row 
2be00 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20  */..    /* Mark 
2be10 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f 52  off any other OR
2be20 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61  DER BY terms tha
2be30 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f  t reference pLoo
2be40 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f  p */.    if( isO
2be50 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a  rderDistinct ){.
2be60 20 20 20 20 20 20 6f 72 64 65 72 44 69 73 74 69        orderDisti
2be70 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70  nctMask |= pLoop
2be80 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
2be90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
2bea0 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
2beb0 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20       Expr *p;.  
2bec0 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
2bed0 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
2bee0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2bef0 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61   p = pOrderBy->a
2bf00 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
2bf10 20 20 20 69 66 28 20 28 65 78 70 72 54 61 62 6c     if( (exprTabl
2bf20 65 55 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e  eUsage(&pWInfo->
2bf30 73 4d 61 73 6b 53 65 74 2c 20 70 29 26 7e 6f 72  sMaskSet, p)&~or
2bf40 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29  derDistinctMask)
2bf50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2bf60 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49   obSat |= MASKBI
2bf70 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  T(i);.        }.
2bf80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2bf90 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f  } /* End the loo
2bfa0 70 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65  p over all Where
2bfb0 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72  Loops from outer
2bfc0 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e  -most down to in
2bfd0 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66  ner-most */.  if
2bfe0 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20  ( obSat==obDone 
2bff0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
2c000 28 20 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e  ( !isOrderDistin
2c010 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ct ) return 0;. 
2c020 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 23   return -1;.}..#
2c030 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
2c040 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20  _ENABLED./* For 
2c050 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e  debugging use on
2c060 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ly: */.static co
2c070 6e 73 74 20 63 68 61 72 20 2a 77 68 65 72 65 50  nst char *whereP
2c080 61 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74  athName(WherePat
2c090 68 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c  h *pPath, int nL
2c0a0 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  oop, WhereLoop *
2c0b0 70 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63  pLast){.  static
2c0c0 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b   char zName[65];
2c0d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
2c0e0 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b  i=0; i<nLoop; i+
2c0f0 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70  +){ zName[i] = p
2c100 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e  Path->aLoop[i]->
2c110 63 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61  cId; }.  if( pLa
2c120 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20  st ) zName[i++] 
2c130 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20  = pLast->cId;.  
2c140 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  zName[i] = 0;.  
2c150 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
2c160 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47  #endif.../*.** G
2c170 69 76 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  iven the list of
2c180 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
2c190 74 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c  ts at pWInfo->pL
2c1a0 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69  oops, this routi
2c1b0 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ne.** attempts t
2c1c0 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73  o find the lowes
2c1d0 74 20 63 6f 73 74 20 70 61 74 68 20 74 68 61 74  t cost path that
2c1e0 20 76 69 73 69 74 73 20 65 61 63 68 20 57 68 65   visits each Whe
2c1f0 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20  reLoop.** once. 
2c200 20 54 68 69 73 20 70 61 74 68 20 69 73 20 74 68   This path is th
2c210 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74  en loaded into t
2c220 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70  he pWInfo->a[].p
2c230 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a  WLoop fields..**
2c240 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20  .** Assume that 
2c250 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
2c260 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
2c270 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74  that will need t
2c280 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77  o be sorted.** w
2c290 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28  ill be nRowEst (
2c2a0 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72  in the 10*log2 r
2c2b0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20  epresentation). 
2c2c0 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74   Or, ignore sort
2c2d0 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20  ing.** costs if 
2c2e0 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a  nRowEst==0..**.*
2c2f0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
2c300 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
2c310 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66   SQLITE_NOMEM of
2c320 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
2c330 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  tion.** error oc
2c340 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
2c350 69 6e 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c  int wherePathSol
2c360 76 65 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  ver(WhereInfo *p
2c370 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52  WInfo, LogEst nR
2c380 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78  owEst){.  int mx
2c390 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20  Choice;         
2c3a0 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
2c3b0 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61  umber of simulta
2c3c0 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72 61 63  neous paths trac
2c3d0 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  ked */.  int nLo
2c3e0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
2c3f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2c400 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69  terms in the joi
2c410 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  n */.  Parse *pP
2c420 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
2c430 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
2c440 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
2c450 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
2c460 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
2c470 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
2c480 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20  .  int iLoop;   
2c490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c4a0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65  Loop counter ove
2c4b0 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  r the terms of t
2c4c0 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74  he join */.  int
2c4d0 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20   ii, jj;        
2c4e0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2c4f0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
2c500 20 6d 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20   mxI = 0;       
2c510 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2c520 6f 66 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f  of next entry to
2c530 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 4c 6f   replace */.  Lo
2c540 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20 20 20  gEst rCost;     
2c550 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
2c560 6f 66 20 61 20 70 61 74 68 20 2a 2f 0a 20 20 4c  of a path */.  L
2c570 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20 20 20  ogEst nOut;     
2c580 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2c590 65 72 20 6f 66 20 6f 75 74 70 75 74 73 20 2a 2f  er of outputs */
2c5a0 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74  .  LogEst mxCost
2c5b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
2c5c0 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20  Maximum cost of 
2c5d0 61 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a  a set of paths *
2c5e0 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 4f 75 74  /.  LogEst mxOut
2c5f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
2c600 20 4d 61 78 69 6d 75 6d 20 6e 4f 75 74 20 76 61   Maximum nOut va
2c610 6c 75 65 20 6f 6e 20 74 68 65 20 73 65 74 20 6f  lue on the set o
2c620 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67  f paths */.  Log
2c630 45 73 74 20 72 53 6f 72 74 43 6f 73 74 3b 20 20  Est rSortCost;  
2c640 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 74         /* Cost t
2c650 6f 20 64 6f 20 61 20 73 6f 72 74 20 2a 2f 0a 20  o do a sort */. 
2c660 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b   int nTo, nFrom;
2c670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2c680 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e  mber of valid en
2c690 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61  tries in aTo[] a
2c6a0 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20  nd aFrom[] */.  
2c6b0 57 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d  WherePath *aFrom
2c6c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ;         /* All
2c6d0 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20   nFrom paths at 
2c6e0 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76  the previous lev
2c6f0 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  el */.  WherePat
2c700 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20  h *aTo;         
2c710 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73    /* The nTo bes
2c720 74 20 70 61 74 68 73 20 61 74 20 74 68 65 20 63  t paths at the c
2c730 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a  urrent level */.
2c740 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 46 72    WherePath *pFr
2c750 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  om;         /* A
2c760 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72  n element of aFr
2c770 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65  om[] that we are
2c780 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20   working on */. 
2c790 20 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b   WherePath *pTo;
2c7a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
2c7b0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b   element of aTo[
2c7c0 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f  ] that we are wo
2c7d0 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68  rking on */.  Wh
2c7e0 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b  ereLoop *pWLoop;
2c7f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
2c800 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
2c810 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65  objects */.  Whe
2c820 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20  reLoop **pX;    
2c830 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
2c840 6f 20 64 69 76 79 20 75 70 20 74 68 65 20 70 53  o divy up the pS
2c850 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  pace memory */. 
2c860 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20   char *pSpace;  
2c870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
2c880 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75  mporary memory u
2c890 73 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  sed by this rout
2c8a0 69 6e 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ine */..  pParse
2c8b0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
2c8c0 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  e;.  db = pParse
2c8d0 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20  ->db;.  nLoop = 
2c8e0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a  pWInfo->nLevel;.
2c8f0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72    /* TUNING: For
2c900 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c   simple queries,
2c910 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70   only the best p
2c920 61 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a  ath is tracked..
2c930 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a    ** For 2-way j
2c940 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74  oins, the 5 best
2c950 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f   paths are follo
2c960 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f  wed..  ** For jo
2c970 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65  ins of 3 or more
2c980 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74   tables, track t
2c990 68 65 20 31 30 20 62 65 73 74 20 70 61 74 68 73  he 10 best paths
2c9a0 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d   */.  mxChoice =
2c9b0 20 28 6e 4c 6f 6f 70 3d 3d 31 29 20 3f 20 31 20   (nLoop==1) ? 1 
2c9c0 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20  : (nLoop==2 ? 5 
2c9d0 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28  : 10);.  assert(
2c9e0 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e   nLoop<=pWInfo->
2c9f0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
2ca00 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  ;.  WHERETRACE(0
2ca10 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67  x002, ("---- beg
2ca20 69 6e 20 73 6f 6c 76 65 72 5c 6e 22 29 29 3b 0a  in solver\n"));.
2ca30 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
2ca40 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70  nd initialize sp
2ca50 61 63 65 20 66 6f 72 20 61 54 6f 20 61 6e 64 20  ace for aTo and 
2ca60 61 46 72 6f 6d 20 2a 2f 0a 20 20 69 69 20 3d 20  aFrom */.  ii = 
2ca70 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74  (sizeof(WherePat
2ca80 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  h)+sizeof(WhereL
2ca90 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43  oop*)*nLoop)*mxC
2caa0 68 6f 69 63 65 2a 32 3b 0a 20 20 70 53 70 61 63  hoice*2;.  pSpac
2cab0 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
2cac0 6c 6f 63 52 61 77 28 64 62 2c 20 69 69 29 3b 0a  locRaw(db, ii);.
2cad0 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20    if( pSpace==0 
2cae0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2caf0 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28  NOMEM;.  aTo = (
2cb00 57 68 65 72 65 50 61 74 68 2a 29 70 53 70 61 63  WherePath*)pSpac
2cb10 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f  e;.  aFrom = aTo
2cb20 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d  +mxChoice;.  mem
2cb30 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69  set(aFrom, 0, si
2cb40 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b  zeof(aFrom[0]));
2cb50 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f  .  pX = (WhereLo
2cb60 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68  op**)(aFrom+mxCh
2cb70 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d  oice);.  for(ii=
2cb80 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f  mxChoice*2, pFro
2cb90 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d  m=aTo; ii>0; ii-
2cba0 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b  -, pFrom++, pX +
2cbb0 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46  = nLoop){.    pF
2cbc0 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b  rom->aLoop = pX;
2cbd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 64 20  .  }..  /* Seed 
2cbe0 74 68 65 20 73 65 61 72 63 68 20 77 69 74 68 20  the search with 
2cbf0 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 50 61  a single WherePa
2cc00 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65  th containing ze
2cc10 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20  ro WhereLoops.. 
2cc20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a   **.  ** TUNING:
2cc30 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20   Do not let the 
2cc40 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74  number of iterat
2cc50 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20 32 35  ions go above 25
2cc60 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74 0a 20  .  If the cost. 
2cc70 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67   ** of computing
2cc80 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
2cc90 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69 64 20  dex is not paid 
2cca0 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20  back within the 
2ccb0 66 69 72 73 74 20 32 35 0a 20 20 2a 2a 20 72 6f  first 25.  ** ro
2ccc0 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ws, then do not 
2ccd0 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69  use the automati
2cce0 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46  c index. */.  aF
2ccf0 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49  rom[0].nRow = MI
2cd00 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  N(pParse->nQuery
2cd10 4c 6f 6f 70 2c 20 34 36 29 3b 20 20 61 73 73 65  Loop, 46);  asse
2cd20 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c  rt( 46==sqlite3L
2cd30 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 20 20 6e  ogEst(25) );.  n
2cd40 46 72 6f 6d 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20  From = 1;..  /* 
2cd50 50 72 65 63 6f 6d 70 75 74 65 20 74 68 65 20 63  Precompute the c
2cd60 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 74  ost of sorting t
2cd70 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20  he final result 
2cd80 73 65 74 2c 20 69 66 20 74 68 65 20 63 61 6c 6c  set, if the call
2cd90 65 72 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  er.  ** to sqlit
2cda0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 77  e3WhereBegin() w
2cdb0 61 73 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  as concerned abo
2cdc0 75 74 20 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20  ut sorting */.  
2cdd0 72 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b 0a 20  rSortCost = 0;. 
2cde0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
2cdf0 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77  derBy==0 || nRow
2ce00 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 46  Est==0 ){.    aF
2ce10 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64  rom[0].isOrdered
2ce20 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 7d 65 6c  Valid = 1;.  }el
2ce30 73 65 7b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e  se{.    /* TUNIN
2ce40 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73  G: Estimated cos
2ce50 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 69 73 20  t of sorting is 
2ce60 34 38 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65  48*N*log2(N) whe
2ce70 72 65 20 4e 20 69 73 20 74 68 65 0a 20 20 20 20  re N is the.    
2ce80 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ** number of out
2ce90 70 75 74 20 72 6f 77 73 2e 20 54 68 65 20 34 38  put rows. The 48
2cea0 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64   is the expected
2ceb0 20 73 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 74   size of a row t
2cec0 6f 20 73 6f 72 74 2e 20 0a 20 20 20 20 2a 2a 20  o sort. .    ** 
2ced0 46 49 58 4d 45 3a 20 20 63 6f 6d 70 75 74 65 20  FIXME:  compute 
2cee0 61 20 62 65 74 74 65 72 20 65 73 74 69 6d 61 74  a better estimat
2cef0 65 20 6f 66 20 74 68 65 20 34 38 20 6d 75 6c 74  e of the 48 mult
2cf00 69 70 6c 69 65 72 20 62 61 73 65 64 20 6f 6e 20  iplier based on 
2cf10 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  the.    ** resul
2cf20 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
2cf30 73 2e 20 2a 2f 0a 20 20 20 20 72 53 6f 72 74 43  s. */.    rSortC
2cf40 6f 73 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20  ost = nRowEst + 
2cf50 65 73 74 4c 6f 67 28 6e 52 6f 77 45 73 74 29 3b  estLog(nRowEst);
2cf60 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
2cf70 30 78 30 30 32 2c 28 22 2d 2d 2d 2d 20 73 6f 72  0x002,("---- sor
2cf80 74 20 63 6f 73 74 3d 25 2d 33 64 5c 6e 22 2c 20  t cost=%-3d\n", 
2cf90 72 53 6f 72 74 43 6f 73 74 29 29 3b 0a 20 20 7d  rSortCost));.  }
2cfa0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73  ..  /* Compute s
2cfb0 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67  uccessively long
2cfc0 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75 73  er WherePaths us
2cfd0 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75 73  ing the previous
2cfe0 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a   generation.  **
2cff0 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20 61   of WherePaths a
2d000 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72 20  s the basis for 
2d010 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20  the next.  Keep 
2d020 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43  track of the mxC
2d030 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20  hoice.  ** best 
2d040 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67 65  paths at each ge
2d050 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f  neration */.  fo
2d060 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70  r(iLoop=0; iLoop
2d070 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  <nLoop; iLoop++)
2d080 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20  {.    nTo = 0;. 
2d090 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72     for(ii=0, pFr
2d0a0 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72  om=aFrom; ii<nFr
2d0b0 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b  om; ii++, pFrom+
2d0c0 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57  +){.      for(pW
2d0d0 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f  Loop=pWInfo->pLo
2d0e0 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c  ops; pWLoop; pWL
2d0f0 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78  oop=pWLoop->pNex
2d100 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20  tLoop){.        
2d110 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b  Bitmask maskNew;
2d120 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
2d130 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20   revMask = 0;.  
2d140 20 20 20 20 20 20 75 38 20 69 73 4f 72 64 65 72        u8 isOrder
2d150 65 64 56 61 6c 69 64 20 3d 20 70 46 72 6f 6d 2d  edValid = pFrom-
2d160 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b  >isOrderedValid;
2d170 0a 20 20 20 20 20 20 20 20 75 38 20 69 73 4f 72  .        u8 isOr
2d180 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69  dered = pFrom->i
2d190 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20  sOrdered;.      
2d1a0 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70    if( (pWLoop->p
2d1b0 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e  rereq & ~pFrom->
2d1c0 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63  maskLoop)!=0 ) c
2d1d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2d1e0 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61   if( (pWLoop->ma
2d1f0 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e  skSelf & pFrom->
2d200 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63  maskLoop)!=0 ) c
2d210 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2d220 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
2d230 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63  t, pWLoop is a c
2d240 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74  andidate to be t
2d250 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20  he next loop. . 
2d260 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74         ** Comput
2d270 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20  e its cost */.  
2d280 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71        rCost = sq
2d290 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
2d2a0 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57  WLoop->rSetup,pW
2d2b0 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72  Loop->rRun + pFr
2d2c0 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20  om->nRow);.     
2d2d0 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69 74     rCost = sqlit
2d2e0 65 33 4c 6f 67 45 73 74 41 64 64 28 72 43 6f 73  e3LogEstAdd(rCos
2d2f0 74 2c 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 29  t, pFrom->rCost)
2d300 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d  ;.        nOut =
2d310 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70   pFrom->nRow + p
2d320 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20  WLoop->nOut;.   
2d330 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70       maskNew = p
2d340 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c  From->maskLoop |
2d350 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c   pWLoop->maskSel
2d360 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  f;.        if( !
2d370 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 29  isOrderedValid )
2d380 7b 0a 20 20 20 20 20 20 20 20 20 20 73 77 69 74  {.          swit
2d390 63 68 28 20 77 68 65 72 65 50 61 74 68 53 61 74  ch( wherePathSat
2d3a0 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57  isfiesOrderBy(pW
2d3b0 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  Info,.          
2d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
2d3d0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70  nfo->pOrderBy, p
2d3e0 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63  From, pWInfo->wc
2d3f0 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20  trlFlags,.      
2d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d410 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20   iLoop, pWLoop, 
2d420 26 72 65 76 4d 61 73 6b 29 20 29 7b 0a 20 20 20  &revMask) ){.   
2d430 20 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a           case 1:
2d440 20 20 2f 2a 20 59 65 73 2e 20 20 70 46 72 6f 6d    /* Yes.  pFrom
2d450 2b 70 57 4c 6f 6f 70 20 64 6f 65 73 20 73 61 74  +pWLoop does sat
2d460 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42  isfy the ORDER B
2d470 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  Y clause */.    
2d480 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
2d490 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  red = 1;.       
2d4a0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
2d4b0 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  Valid = 1;.     
2d4c0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2d4d0 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
2d4e0 20 30 3a 20 20 2f 2a 20 4e 6f 2e 20 20 70 46 72   0:  /* No.  pFr
2d4f0 6f 6d 2b 70 57 4c 6f 6f 70 20 77 69 6c 6c 20 72  om+pWLoop will r
2d500 65 71 75 69 72 65 20 61 20 73 65 70 61 72 61 74  equire a separat
2d510 65 20 73 6f 72 74 20 2a 2f 0a 20 20 20 20 20 20  e sort */.      
2d520 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
2d530 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
2d540 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61       isOrderedVa
2d550 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  lid = 1;.       
2d560 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73         rCost = s
2d570 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
2d580 72 43 6f 73 74 2c 20 72 53 6f 72 74 43 6f 73 74  rCost, rSortCost
2d590 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2d5a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2d5b0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20      default: /* 
2d5c0 43 61 6e 6e 6f 74 20 74 65 6c 6c 20 79 65 74 2e  Cannot tell yet.
2d5d0 20 20 54 72 79 20 61 67 61 69 6e 20 6f 6e 20 74    Try again on t
2d5e0 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
2d5f0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
2d600 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2d610 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2d620 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
2d630 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e  evMask = pFrom->
2d640 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  revLoop;.       
2d650 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68   }.        /* Ch
2d660 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57  eck to see if pW
2d670 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61  Loop should be a
2d680 64 64 65 64 20 74 6f 20 74 68 65 20 6d 78 43 68  dded to the mxCh
2d690 6f 69 63 65 20 62 65 73 74 20 73 6f 20 66 61 72  oice best so far
2d6a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
2d6b0 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a  jj=0, pTo=aTo; j
2d6c0 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f  j<nTo; jj++, pTo
2d6d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
2d6e0 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70  f( pTo->maskLoop
2d6f0 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20 20 20  ==maskNew.      
2d700 20 20 20 20 20 26 26 20 70 54 6f 2d 3e 69 73 4f       && pTo->isO
2d710 72 64 65 72 65 64 56 61 6c 69 64 3d 3d 69 73 4f  rderedValid==isO
2d720 72 64 65 72 65 64 56 61 6c 69 64 0a 20 20 20 20  rderedValid.    
2d730 20 20 20 20 20 20 20 26 26 20 28 28 70 54 6f 2d         && ((pTo-
2d740 3e 72 43 6f 73 74 3c 3d 72 43 6f 73 74 20 26 26  >rCost<=rCost &&
2d750 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74   pTo->nRow<=nOut
2d760 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ) ||.           
2d770 20 20 20 20 20 28 70 54 6f 2d 3e 72 43 6f 73 74       (pTo->rCost
2d780 3e 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e  >=rCost && pTo->
2d790 6e 52 6f 77 3e 3d 6e 4f 75 74 29 29 0a 20 20 20  nRow>=nOut)).   
2d7a0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2d7b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2d7c0 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20  jj==nTo-1 );.   
2d7d0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2d7e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d7f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2d800 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20  ( jj>=nTo ){.   
2d810 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
2d820 6d 78 43 68 6f 69 63 65 20 26 26 20 72 43 6f 73  mxChoice && rCos
2d830 74 3e 3d 6d 78 43 6f 73 74 20 29 7b 0a 23 69 66  t>=mxCost ){.#if
2d840 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
2d850 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f  NABLED /* 0x4 */
2d860 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2d870 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
2d880 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
2d890 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2d8a0 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70  ebugPrintf("Skip
2d8b0 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c     %s cost=%-3d,
2d8c0 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  %3d order=%c\n",
2d8d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d8e0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
2d8f0 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
2d900 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e  WLoop), rCost, n
2d910 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Out,.           
2d920 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
2d930 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72  Valid ? (isOrder
2d940 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20  ed ? 'Y' : 'N') 
2d950 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
2d960 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2d970 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2d980 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2d990 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
2d9a0 61 20 6e 65 77 20 50 61 74 68 20 74 6f 20 74 68  a new Path to th
2d9b0 65 20 61 54 6f 5b 5d 20 73 65 74 20 2a 2f 0a 20  e aTo[] set */. 
2d9c0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f           if( nTo
2d9d0 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20  <mxChoice ){.   
2d9e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72           /* Incr
2d9f0 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ease the size of
2da00 20 74 68 65 20 61 54 6f 20 73 65 74 20 62 79 20   the aTo set by 
2da10 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  one */.         
2da20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20     jj = nTo++;. 
2da30 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2da40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2da50 65 77 20 70 61 74 68 20 72 65 70 6c 61 63 65 73  ew path replaces
2da60 20 74 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74   the prior worst
2da70 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62   to keep count b
2da80 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f  elow mxChoice */
2da90 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
2daa0 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20 20 20 20  = mxI;.         
2dab0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f   }.          pTo
2dac0 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66   = &aTo[jj];.#if
2dad0 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
2dae0 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f  NABLED /* 0x4 */
2daf0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
2db00 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
2db10 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
2db20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2db30 50 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25  Printf("New    %
2db40 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
2db50 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
2db60 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
2db70 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
2db80 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
2db90 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
2dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2dbb0 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20  sOrderedValid ? 
2dbc0 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27  (isOrdered ? 'Y'
2dbd0 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a   : 'N') : '?');.
2dbe0 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
2dbf0 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  if.        }else
2dc00 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2dc10 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73  pTo->rCost<=rCos
2dc20 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d  t && pTo->nRow<=
2dc30 6e 4f 75 74 20 29 7b 0a 23 69 66 64 65 66 20 57  nOut ){.#ifdef W
2dc40 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
2dc50 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20  D /* 0x4 */.    
2dc60 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2dc70 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
2dc80 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
2dc90 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2dca0 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
2dcb0 20 20 20 20 20 20 20 20 20 22 53 6b 69 70 20 20           "Skip  
2dcc0 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
2dcd0 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
2dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
2dcf0 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
2dd00 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
2dd10 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
2dd20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dd30 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69     isOrderedVali
2dd40 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f  d ? (isOrdered ?
2dd50 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f   'Y' : 'N') : '?
2dd60 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
2dd70 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2dd80 69 6e 74 66 28 22 20 20 20 76 73 20 25 73 20 63  intf("   vs %s c
2dd90 6f 73 74 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65  ost=%-3d,%d orde
2dda0 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20  r=%c\n",.       
2ddb0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
2ddc0 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
2ddd0 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
2dde0 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
2ddf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2de00 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
2de10 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e  edValid ? (pTo->
2de20 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20  isOrdered ? 'Y' 
2de30 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20  : 'N') : '?');. 
2de40 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e             }.#en
2de50 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
2de60 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72  testcase( pTo->r
2de70 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20  Cost==rCost );. 
2de80 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
2de90 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
2dea0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2deb0 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d  ase( pTo->rCost=
2dec0 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20  =rCost+1 );.    
2ded0 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 61        /* A new a
2dee0 6e 64 20 62 65 74 74 65 72 20 73 63 6f 72 65 20  nd better score 
2def0 66 6f 72 20 61 20 70 72 65 76 69 6f 75 73 6c 79  for a previously
2df00 20 63 72 65 61 74 65 64 20 65 71 75 69 76 61 6c   created equival
2df10 65 6e 74 20 70 61 74 68 20 2a 2f 0a 23 69 66 64  ent path */.#ifd
2df20 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
2df30 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
2df40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
2df50 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
2df60 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
2df70 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2df80 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
2df90 20 20 20 20 20 20 20 22 55 70 64 61 74 65 20 25         "Update %
2dfa0 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
2dfb0 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
2dfc0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
2dfd0 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
2dfe0 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
2dff0 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20  rCost, nOut,.   
2e000 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
2e010 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69  rderedValid ? (i
2e020 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a  sOrdered ? 'Y' :
2e030 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20   'N') : '?');.  
2e040 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e050 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
2e060 77 61 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  was %s cost=%-3d
2e070 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  ,%3d order=%c\n"
2e080 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e090 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
2e0a0 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29  pTo, iLoop+1, 0)
2e0b0 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54  , pTo->rCost, pT
2e0c0 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20  o->nRow,.       
2e0d0 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73           pTo->is
2e0e0 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28  OrderedValid ? (
2e0f0 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f  pTo->isOrdered ?
2e100 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f   'Y' : 'N') : '?
2e110 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ');.          }.
2e120 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
2e130 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f  .        /* pWLo
2e140 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e 20  op is a winner. 
2e150 20 41 64 64 20 69 74 20 74 6f 20 74 68 65 20 73   Add it to the s
2e160 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66 61  et of best so fa
2e170 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f  r */.        pTo
2e180 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72  ->maskLoop = pFr
2e190 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70  om->maskLoop | p
2e1a0 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  WLoop->maskSelf;
2e1b0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65  .        pTo->re
2e1c0 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b  vLoop = revMask;
2e1d0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52  .        pTo->nR
2e1e0 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20  ow = nOut;.     
2e1f0 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20     pTo->rCost = 
2e200 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70  rCost;.        p
2e210 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c  To->isOrderedVal
2e220 69 64 20 3d 20 69 73 4f 72 64 65 72 65 64 56 61  id = isOrderedVa
2e230 6c 69 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  lid;.        pTo
2e240 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73  ->isOrdered = is
2e250 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20  Ordered;.       
2e260 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f   memcpy(pTo->aLo
2e270 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  op, pFrom->aLoop
2e280 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
2e290 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20  op*)*iLoop);.   
2e2a0 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b       pTo->aLoop[
2e2b0 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b  iLoop] = pWLoop;
2e2c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f  .        if( nTo
2e2d0 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20  >=mxChoice ){.  
2e2e0 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20 30 3b          mxI = 0;
2e2f0 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73  .          mxCos
2e300 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74  t = aTo[0].rCost
2e310 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 4f 75  ;.          mxOu
2e320 74 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b  t = aTo[0].nRow;
2e330 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
2e340 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d  j=1, pTo=&aTo[1]
2e350 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a  ; jj<mxChoice; j
2e360 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  j++, pTo++){.   
2e370 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
2e380 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c  ->rCost>mxCost |
2e390 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d  | (pTo->rCost==m
2e3a0 78 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52  xCost && pTo->nR
2e3b0 6f 77 3e 6d 78 4f 75 74 29 20 29 7b 0a 20 20 20  ow>mxOut) ){.   
2e3c0 20 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73             mxCos
2e3d0 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a  t = pTo->rCost;.
2e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78                mx
2e3f0 4f 75 74 20 3d 20 70 54 6f 2d 3e 6e 52 6f 77 3b  Out = pTo->nRow;
2e400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
2e410 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20  xI = jj;.       
2e420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e430 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2e440 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64     }.    }..#ifd
2e450 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
2e460 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f  ABLED  /* >=2 */
2e470 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2e480 57 68 65 72 65 54 72 61 63 65 3e 3d 32 20 29 7b  WhereTrace>=2 ){
2e490 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
2e4a0 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20  bugPrintf("---- 
2e4b0 61 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d  after round %d -
2e4c0 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a  ---\n", iLoop);.
2e4d0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20        for(ii=0, 
2e4e0 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b  pTo=aTo; ii<nTo;
2e4f0 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20   ii++, pTo++){. 
2e500 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
2e510 62 75 67 50 72 69 6e 74 66 28 22 20 25 73 20 63  bugPrintf(" %s c
2e520 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d  ost=%-3d nrow=%-
2e530 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20  3d order=%c",.  
2e540 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
2e550 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f  thName(pTo, iLoo
2e560 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43  p+1, 0), pTo->rC
2e570 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a  ost, pTo->nRow,.
2e580 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e             pTo->
2e590 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f  isOrderedValid ?
2e5a0 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64   (pTo->isOrdered
2e5b0 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20   ? 'Y' : 'N') : 
2e5c0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66  '?');.        if
2e5d0 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ( pTo->isOrdered
2e5e0 56 61 6c 69 64 20 26 26 20 70 54 6f 2d 3e 69 73  Valid && pTo->is
2e5f0 4f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20  Ordered ){.     
2e600 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2e610 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78  gPrintf(" rev=0x
2e620 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65  %llx\n", pTo->re
2e630 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  vLoop);.        
2e640 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2e650 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2e660 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ntf("\n");.     
2e670 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2e680 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
2e690 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73  * Swap the roles
2e6a0 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54   of aFrom and aT
2e6b0 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67  o for the next g
2e6c0 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  eneration */.   
2e6d0 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20   pFrom = aTo;.  
2e6e0 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20    aTo = aFrom;. 
2e6f0 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d     aFrom = pFrom
2e700 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54  ;.    nFrom = nT
2e710 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46  o;.  }..  if( nF
2e720 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  rom==0 ){.    sq
2e730 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2e740 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20  arse, "no query 
2e750 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20  solution");.    
2e760 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2e770 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72  , pSpace);.    r
2e780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2e790 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OR;.  }.  .  /* 
2e7a0 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20  Find the lowest 
2e7b0 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f  cost path.  pFro
2e7c0 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70  m will be left p
2e7d0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20  ointing to that 
2e7e0 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20  path */.  pFrom 
2e7f0 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69  = aFrom;.  for(i
2e800 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69  i=1; ii<nFrom; i
2e810 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46  i++){.    if( pF
2e820 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d  rom->rCost>aFrom
2e830 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72  [ii].rCost ) pFr
2e840 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b  om = &aFrom[ii];
2e850 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2e860 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e  WInfo->nLevel==n
2e870 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61  Loop );.  /* Loa
2e880 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
2e890 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e  t path into pWIn
2e8a0 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f  fo */.  for(iLoo
2e8b0 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70  p=0; iLoop<nLoop
2e8c0 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20  ; iLoop++){.    
2e8d0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
2e8e0 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b  el = pWInfo->a +
2e8f0 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76   iLoop;.    pLev
2e900 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c  el->pWLoop = pWL
2e910 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f  oop = pFrom->aLo
2e920 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70  op[iLoop];.    p
2e930 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70  Level->iFrom = p
2e940 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20  WLoop->iTab;.   
2e950 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
2e960 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
2e970 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
2e980 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  From].iCursor;. 
2e990 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f   }.  if( (pWInfo
2e9a0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
2e9b0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
2e9c0 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57  CT)!=0.   && (pW
2e9d0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2e9e0 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
2e9f0 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57  TBY)==0.   && pW
2ea00 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d  Info->eDistinct=
2ea10 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
2ea20 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45  NOOP.   && nRowE
2ea30 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d  st.  ){.    Bitm
2ea40 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20  ask notUsed;.   
2ea50 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50   int rc = whereP
2ea60 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
2ea70 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e  rBy(pWInfo, pWIn
2ea80 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20  fo->pResultSet, 
2ea90 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20  pFrom,.         
2eaa0 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 44 49          WHERE_DI
2eab0 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d  STINCTBY, nLoop-
2eac0 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b  1, pFrom->aLoop[
2ead0 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73  nLoop-1], &notUs
2eae0 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
2eaf0 3d 31 20 29 20 70 57 49 6e 66 6f 2d 3e 65 44 69  =1 ) pWInfo->eDi
2eb00 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
2eb10 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b  ISTINCT_ORDERED;
2eb20 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72 6f 6d  .  }.  if( pFrom
2eb30 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20  ->isOrdered ){. 
2eb40 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77     if( pWInfo->w
2eb50 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2eb60 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b 0a  E_DISTINCTBY ){.
2eb70 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
2eb80 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
2eb90 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
2eba0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2ebb0 20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61     pWInfo->bOBSa
2ebc0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 57 49  t = 1;.      pWI
2ebd0 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70  nfo->revMask = p
2ebe0 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20  From->revLoop;. 
2ebf0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e 66     }.  }.  pWInf
2ec00 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72  o->nRowOut = pFr
2ec10 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20  om->nRow;..  /* 
2ec20 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d  Free temporary m
2ec30 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e  emory and return
2ec40 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71   success */.  sq
2ec50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2ec60 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72  pSpace);.  retur
2ec70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2ec80 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69  /*.** Most queri
2ec90 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69  es use only a si
2eca0 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79  ngle table (they
2ecb0 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20   are not joins) 
2ecc0 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70  and have.** simp
2ecd0 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  le == constraint
2ece0 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65  s against indexe
2ecf0 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20  d fields.  This 
2ed00 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
2ed10 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73  .** to plan thos
2ed20 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75  e simple cases u
2ed30 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63  sing much less c
2ed40 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65  eremony than the
2ed50 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70  .** general-purp
2ed60 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  ose query planne
2ed70 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79 20 79  r, and thereby y
2ed80 69 65 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69  ield faster sqli
2ed90 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a  te3_prepare().**
2eda0 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63   times for the c
2edb0 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a  ommon case..**.*
2edc0 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
2edd0 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66  o on success, if
2ede0 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20   this query can 
2edf0 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68  be handled by th
2ee00 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20  is.** no-frills 
2ee10 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20  query planner.  
2ee20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74  Return zero if t
2ee30 68 69 73 20 71 75 65 72 79 20 6e 65 65 64 73 20  his query needs 
2ee40 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d  the .** general-
2ee50 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c  purpose query pl
2ee60 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  anner..*/.static
2ee70 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43   int whereShortC
2ee80 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  ut(WhereLoopBuil
2ee90 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a  der *pBuilder){.
2eea0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2eeb0 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72  nfo;.  struct Sr
2eec0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
2eed0 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  m;.  WhereClause
2eee0 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65   *pWC;.  WhereTe
2eef0 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65  rm *pTerm;.  Whe
2ef00 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20  reLoop *pLoop;. 
2ef10 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74   int iCur;.  int
2ef20 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   j;.  Table *pTa
2ef30 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
2ef40 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20 3d 20  ;.  .  pWInfo = 
2ef50 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
2ef60 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  ;.  if( pWInfo->
2ef70 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2ef80 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 29  RE_FORCE_TABLE )
2ef90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
2efa0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ert( pWInfo->pTa
2efb0 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29  bList->nSrc>=1 )
2efc0 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e  ;.  pItem = pWIn
2efd0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b  fo->pTabList->a;
2efe0 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  .  pTab = pItem-
2eff0 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49 73 56  >pTab;.  if( IsV
2f000 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
2f010 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
2f020 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 29 20 72  Item->zIndex ) r
2f030 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72 20  eturn 0;.  iCur 
2f040 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
2f050 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66  ;.  pWC = &pWInf
2f060 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20  o->sWC;.  pLoop 
2f070 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
2f080 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  ;.  pLoop->wsFla
2f090 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d  gs = 0;.  pLoop-
2f0a0 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 3d  >u.btree.nSkip =
2f0b0 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20 66 69   0;.  pTerm = fi
2f0c0 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
2f0d0 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 2c 20  , -1, 0, WO_EQ, 
2f0e0 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20  0);.  if( pTerm 
2f0f0 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73  ){.    pLoop->ws
2f100 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  Flags = WHERE_CO
2f110 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50  LUMN_EQ|WHERE_IP
2f120 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a  K|WHERE_ONEROW;.
2f130 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
2f140 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[0] = pTerm;.  
2f150 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20    pLoop->nLTerm 
2f160 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  = 1;.    pLoop->
2f170 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b  u.btree.nEq = 1;
2f180 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  .    /* TUNING: 
2f190 43 6f 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20  Cost of a rowid 
2f1a0 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a  lookup is 10 */.
2f1b0 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20      pLoop->rRun 
2f1c0 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71  = 33;  /* 33==sq
2f1d0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20  lite3LogEst(10) 
2f1e0 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
2f1f0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
2f200 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
2f210 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
2f220 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
2f230 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  oop->aLTermSpace
2f240 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20  ==pLoop->aLTerm 
2f250 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2f260 20 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70   ArraySize(pLoop
2f270 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3d 3d  ->aLTermSpace)==
2f280 34 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  4 );.      if( p
2f290 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
2f2a0 5f 4e 6f 6e 65 20 0a 20 20 20 20 20 20 20 7c 7c  _None .       ||
2f2b0 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
2f2c0 68 65 72 65 21 3d 30 20 0a 20 20 20 20 20 20 20  here!=0 .       
2f2d0 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  || pIdx->nKeyCol
2f2e0 3e 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70  >ArraySize(pLoop
2f2f0 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 20 0a  ->aLTermSpace) .
2f300 20 20 20 20 20 20 29 20 63 6f 6e 74 69 6e 75 65        ) continue
2f310 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
2f320 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   j<pIdx->nKeyCol
2f330 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
2f340 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
2f350 28 70 57 43 2c 20 69 43 75 72 2c 20 70 49 64 78  (pWC, iCur, pIdx
2f360 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30  ->aiColumn[j], 0
2f370 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 3b 0a  , WO_EQ, pIdx);.
2f380 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
2f390 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
2f3a0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54        pLoop->aLT
2f3b0 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[j] = pTerm;.
2f3c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2f3d0 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  ( j!=pIdx->nKeyC
2f3e0 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ol ) continue;. 
2f3f0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c       pLoop->wsFl
2f400 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
2f410 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52  MN_EQ|WHERE_ONER
2f420 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44  OW|WHERE_INDEXED
2f430 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
2f440 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20  ->isCovering || 
2f450 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  (pItem->colUsed 
2f460 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  & ~columnsInInde
2f470 78 28 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20  x(pIdx))==0 ){. 
2f480 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73         pLoop->ws
2f490 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49  Flags |= WHERE_I
2f4a0 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  DX_ONLY;.      }
2f4b0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c  .      pLoop->nL
2f4c0 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  Term = j;.      
2f4d0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
2f4e0 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c  Eq = j;.      pL
2f4f0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
2f500 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  dex = pIdx;.    
2f510 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
2f520 74 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e  t of a unique in
2f530 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35  dex lookup is 15
2f540 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d   */.      pLoop-
2f550 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20  >rRun = 39;  /* 
2f560 33 39 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  39==sqlite3LogEs
2f570 74 28 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62  t(15) */.      b
2f580 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
2f590 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
2f5a0 6c 61 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f  lags ){.    pLoo
2f5b0 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73  p->nOut = (LogEs
2f5c0 74 29 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  t)1;.    pWInfo-
2f5d0 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70  >a[0].pWLoop = p
2f5e0 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  Loop;.    pLoop-
2f5f0 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d  >maskSelf = getM
2f600 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
2f610 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20  skSet, iCur);.  
2f620 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69    pWInfo->a[0].i
2f630 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20  TabCur = iCur;. 
2f640 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f     pWInfo->nRowO
2f650 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ut = 1;.    if( 
2f660 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
2f670 20 29 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61   ) pWInfo->bOBSa
2f680 74 20 3d 20 20 31 3b 0a 20 20 20 20 69 66 28 20  t =  1;.    if( 
2f690 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2f6a0 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
2f6b0 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
2f6c0 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
2f6d0 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
2f6e0 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20  INCT_UNIQUE;.   
2f6f0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2f700 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70  _DEBUG.    pLoop
2f710 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e  ->cId = '0';.#en
2f720 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31  dif.    return 1
2f730 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2f740 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
2f750 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ate the beginnin
2f760 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73  g of the loop us
2f770 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  ed for WHERE cla
2f780 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
2f790 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
2f7a0 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  lue is a pointer
2f7b0 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74   to an opaque st
2f7c0 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e  ructure that con
2f7d0 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61  tains.** informa
2f7e0 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74  tion needed to t
2f7f0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
2f800 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63  p.  Later, the c
2f810 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a  alling routine.*
2f820 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  * should invoke 
2f830 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
2f840 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72  ) with the retur
2f850 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
2f860 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f  function.** in o
2f870 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
2f880 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2f890 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
2f8a0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
2f8b0 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75  occurs, this rou
2f8c0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
2f8d0 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73  L..**.** The bas
2f8e0 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f  ic idea is to do
2f8f0 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20   a nested loop, 
2f900 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63  one loop for eac
2f910 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68  h table in.** th
2f920 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
2f930 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53   a select.  (INS
2f940 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73  ERT and UPDATE s
2f950 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68  tatements are th
2f960 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53  e.** same as a S
2f970 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20  ELECT with only 
2f980 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
2f990 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2f9a0 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  e.)  For.** exam
2f9b0 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20  ple, if the SQL 
2f9c0 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  is this:.**.**  
2f9d0 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
2f9e0 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
2f9f0 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54  ERE ...;.**.** T
2fa00 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hen the code gen
2fa10 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70  erated is concep
2fa20 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20  tually like the 
2fa30 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
2fa40 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
2fa50 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20  w1 in t1 do     
2fa60 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
2fa70 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
2fa80 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
2fa90 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62  t2 do      |-- b
2faa0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
2fab0 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20  gin().**        
2fac0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69    foreach row3 i
2fad0 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20  n t3 do   /.**  
2fae0 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
2faf0 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20            end   
2fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb10 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
2fb20 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
2fb30 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
2fb40 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62             |-- b
2fb50 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  y sqlite3WhereEn
2fb60 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20  d().**      end 
2fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb80 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20          /.**.** 
2fb90 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f  Note that the lo
2fba0 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ops might not be
2fbb0 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f   nested in the o
2fbc0 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  rder in which th
2fbd0 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20  ey.** appear in 
2fbe0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2fbf0 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  if a different o
2fc00 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61  rder is better a
2fc10 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75  ble to make.** u
2fc20 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20  se of indices.  
2fc30 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77  Note also that w
2fc40 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61  hen the IN opera
2fc50 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a  tor appears in.*
2fc60 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
2fc70 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73  se, it might res
2fc80 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61  ult in additiona
2fc90 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66  l nested loops f
2fca0 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74  or.** scanning t
2fcb0 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65  hrough all value
2fcc0 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  s on the right-h
2fcd0 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
2fce0 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  IN..**.** There 
2fcf0 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72  are Btree cursor
2fd00 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2fd10 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74  h each table.  t
2fd20 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a  1 uses cursor.**
2fd30 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74   number pTabList
2fd40 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20  ->a[0].iCursor. 
2fd50 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72   t2 uses the cur
2fd60 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  sor pTabList->a[
2fd70 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41  1].iCursor..** A
2fd80 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68  nd so forth.  Th
2fd90 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
2fda0 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65  ates code to ope
2fdb0 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72  n those VDBE cur
2fdc0 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  sors.** and sqli
2fdd0 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65  te3WhereEnd() ge
2fde0 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
2fdf0 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a   to close them..
2fe00 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74  **.** The code t
2fe10 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  hat sqlite3Where
2fe20 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65  Begin() generate
2fe30 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  s leaves the cur
2fe40 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e  sors named.** in
2fe50 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69   pTabList pointi
2fe60 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72  ng at their appr
2fe70 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e  opriate entries.
2fe80 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65    The [...] code
2fe90 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43  .** can use OP_C
2fea0 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77  olumn and OP_Row
2feb0 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68  id opcodes on th
2fec0 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65  ese cursors to e
2fed0 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66  xtract.** data f
2fee0 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20  rom the various 
2fef0 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f  tables of the lo
2ff00 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
2ff10 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
2ff20 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65   empty, the fore
2ff30 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65  ach loops must e
2ff40 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a  ach scan their.*
2ff50 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e  * entire tables.
2ff60 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77    Thus a three-w
2ff70 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28  ay join is an O(
2ff80 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20  N^3) operation. 
2ff90 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74   But if.** the t
2ffa0 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63  ables have indic
2ffb0 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  es and there are
2ffc0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
2ffd0 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a  ERE clause that.
2ffe0 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73  ** refer to thos
2fff0 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d  e indices, a com
30000 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e  plete table scan
30010 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20   can be avoided 
30020 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  and the.** code 
30030 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61  will run much fa
30040 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74  ster.  Most of t
30050 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20  he work of this 
30060 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b  routine is check
30070 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ing.** to see if
30080 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63   there are indic
30090 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  es that can be u
300a0 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20  sed to speed up 
300b0 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
300c0 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  Terms of the WHE
300d0 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c  RE clause are al
300e0 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74  so used to limit
300f0 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75   which rows actu
30100 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20  ally.** make it 
30110 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20  to the "..." in 
30120 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
30130 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65  e loop.  After e
30140 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a  ach "foreach",.*
30150 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * terms of the W
30160 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
30170 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20   use only terms 
30180 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64  in that loop and
30190 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20   outer.** loops 
301a0 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e  are evaluated an
301b0 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d  d if false a jum
301c0 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64  p is made around
301d0 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
301e0 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28  ** inner loops (
301f0 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e  or around the ".
30200 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20  .." if the test 
30210 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
30220 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74  e inner-.** most
30230 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54   loop).**.** OUT
30240 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41  ER JOINS.**.** A
30250 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20  n outer join of 
30260 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32  tables t1 and t2
30270 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20   is conceptally 
30280 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  coded as follows
30290 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61  :.**.**    forea
302a0 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
302b0 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20  .**      flag = 
302c0 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  0.**      foreac
302d0 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a  h row2 in t2 do.
302e0 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a  **        start:
302f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  .**          ...
30300 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61  .**          fla
30310 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e  g = 1.**      en
30320 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61  d.**      if fla
30330 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20  g==0 then.**    
30340 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77      move the row
30350 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75  2 cursor to a nu
30360 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ll row.**       
30370 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20   goto start.**  
30380 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64      fi.**    end
30390 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  .**.** ORDER BY 
303a0 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e  CLAUSE PROCESSIN
303b0 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79  G.**.** pOrderBy
303c0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
303d0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
303e0 61 75 73 65 20 28 6f 72 20 74 68 65 20 47 52 4f  ause (or the GRO
303f0 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20  UP BY clause.** 
30400 69 66 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f  if the WHERE_GRO
30410 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65 74  UPBY flag is set
30420 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29 20   in wctrlFlags) 
30430 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
30440 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72  ement.** if ther
30450 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68  e is one.  If th
30460 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
30470 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20  BY clause or if 
30480 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
30490 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61  is called from a
304a0 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
304b0 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  TE statement, th
304c0 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e  en pOrderBy is N
304d0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ULL..**.** The i
304e0 49 64 78 43 75 72 20 70 61 72 61 6d 65 74 65 72  IdxCur parameter
304f0 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e   is the cursor n
30500 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65  umber of an inde
30510 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45 52 45  x.  If .** WHERE
30520 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69  _ONETABLE_ONLY i
30530 73 20 73 65 74 2c 20 69 49 64 78 43 75 72 20 69  s set, iIdxCur i
30540 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  s the cursor num
30550 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a  ber of an index.
30560 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20 4f 52  ** to use for OR
30570 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
30580 6e 67 2e 20 20 54 68 65 20 57 48 45 52 45 20 63  ng.  The WHERE c
30590 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 75 73 65  lause should use
305a0 20 74 68 69 73 0a 2a 2a 20 73 70 65 63 69 66 69   this.** specifi
305b0 63 20 63 75 72 73 6f 72 2e 20 20 49 66 20 57 48  c cursor.  If WH
305c0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
305d0 52 45 44 20 69 73 20 73 65 74 2c 20 74 68 65 6e  RED is set, then
305e0 20 69 49 64 78 43 75 72 20 69 73 0a 2a 2a 20 74   iIdxCur is.** t
305f0 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20  he first cursor 
30600 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 63  in an array of c
30610 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69  ursors for all i
30620 6e 64 69 63 65 73 2e 20 20 69 49 64 78 43 75 72  ndices.  iIdxCur
30630 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73   should.** be us
30640 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
30650 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 75  e appropriate cu
30660 72 73 6f 72 20 64 65 70 65 6e 64 69 6e 67 20 6f  rsor depending o
30670 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 69 73  n which index is
30680 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65  .** used..*/.Whe
30690 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57  reInfo *sqlite3W
306a0 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72  hereBegin(.  Par
306b0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
306c0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
306d0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
306e0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
306f0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
30700 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c  se: A list of al
30710 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73  l tables to be s
30720 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72  canned */.  Expr
30730 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
30740 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
30750 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
30760 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
30770 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20   /* An ORDER BY 
30780 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20  clause, or NULL 
30790 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
307a0 52 65 73 75 6c 74 53 65 74 2c 20 2f 2a 20 52 65  ResultSet, /* Re
307b0 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
307c0 71 75 65 72 79 20 2a 2f 0a 20 20 75 31 36 20 77  query */.  u16 w
307d0 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
307e0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57   /* One of the W
307f0 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66  HERE_* flags def
30800 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e  ined in sqliteIn
30810 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  t.h */.  int iId
30820 78 43 75 72 20 20 20 20 20 20 20 20 20 20 20 2f  xCur           /
30830 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41  * If WHERE_ONETA
30840 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c  BLE_ONLY is set,
30850 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75   index cursor nu
30860 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  mber */.){.  int
30870 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20   nByteWInfo;    
30880 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20          /* Num. 
30890 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
308a0 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74  for WhereInfo st
308b0 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ruct */.  int nT
308c0 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  abList;         
308d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
308e0 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54  f elements in pT
308f0 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72  abList */.  Wher
30900 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
30910 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62         /* Will b
30920 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e  ecome the return
30930 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
30940 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  unction */.  Vdb
30950 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
30960 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76  Vdbe;   /* The v
30970 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  irtual database 
30980 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d  engine */.  Bitm
30990 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20  ask notReady;   
309a0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
309b0 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79  s that are not y
309c0 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f  et positioned */
309d0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
309e0 64 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a  der sWLB;     /*
309f0 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62   The WhereLoop b
30a00 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72  uilder */.  Wher
30a10 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
30a20 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78  et;    /* The ex
30a30 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65  pression mask se
30a40 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  t */.  WhereLeve
30a50 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20  l *pLevel;      
30a60 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65    /* A single le
30a70 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61  vel in pWInfo->a
30a80 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  [] */.  WhereLoo
30a90 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
30aa0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
30ab0 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4c   a single WhereL
30ac0 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
30ad0 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
30ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
30af0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
30b00 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
30b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
30b20 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
30b30 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  n */.  int rc;  
30b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b50 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
30b60 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61   */...  /* Varia
30b70 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ble initializati
30b80 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  on */.  db = pPa
30b90 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65  rse->db;.  memse
30ba0 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65  t(&sWLB, 0, size
30bb0 6f 66 28 73 57 4c 42 29 29 3b 0a 20 20 73 57 4c  of(sWLB));.  sWL
30bc0 42 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  B.pOrderBy = pOr
30bd0 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73  derBy;..  /* Dis
30be0 61 62 6c 65 20 74 68 65 20 44 49 53 54 49 4e 43  able the DISTINC
30bf0 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  T optimization i
30c00 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63  f SQLITE_Distinc
30c10 74 4f 70 74 20 69 73 20 73 65 74 20 76 69 61 0a  tOpt is set via.
30c20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    ** sqlite3_tes
30c30 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f 54 45  t_ctrl(SQLITE_TE
30c40 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
30c50 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69  IONS,...) */.  i
30c60 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
30c70 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
30c80 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 29 20  TE_DistinctOpt) 
30c90 29 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67  ){.    wctrlFlag
30ca0 73 20 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54  s &= ~WHERE_WANT
30cb0 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a  _DISTINCT;.  }..
30cc0 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
30cd0 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
30ce0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
30cf0 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e  limited by the n
30d00 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69  umber of.  ** bi
30d10 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20  ts in a Bitmask 
30d20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
30d30 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
30d40 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20 70  ==BMS );.  if( p
30d50 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d  TabList->nSrc>BM
30d60 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  S ){.    sqlite3
30d70 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
30d80 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62   "at most %d tab
30d90 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20  les in a join", 
30da0 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  BMS);.    return
30db0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   0;.  }..  /* Th
30dc0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d  is function norm
30dd0 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61  ally generates a
30de0 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72   nested loop for
30df0 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a   all tables in .
30e00 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20    ** pTabList.  
30e10 42 75 74 20 69 66 20 74 68 65 20 57 48 45 52 45  But if the WHERE
30e20 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66  _ONETABLE_ONLY f
30e30 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
30e40 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20   we should.  ** 
30e50 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f  only generate co
30e60 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  de for the first
30e70 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69   table in pTabLi
30e80 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68  st and assume th
30e90 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73  at.  ** any curs
30ea0 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
30eb0 69 74 68 20 73 75 62 73 65 71 75 65 6e 74 20 74  ith subsequent t
30ec0 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74  ables are uninit
30ed0 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
30ee0 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72  nTabList = (wctr
30ef0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
30f00 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20  NETABLE_ONLY) ? 
30f10 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  1 : pTabList->nS
30f20 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  rc;..  /* Alloca
30f30 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
30f40 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20  e the WhereInfo 
30f50 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
30f60 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20  ill become the. 
30f70 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65   ** return value
30f80 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  . A single alloc
30f90 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
30fa0 20 73 74 6f 72 65 20 74 68 65 20 57 68 65 72 65   store the Where
30fb0 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74  Info.  ** struct
30fc0 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
30fd0 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c  f WhereInfo.a[],
30fe0 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
30ff0 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
31000 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61 73  and the WhereMas
31010 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 2e 20  kSet structure. 
31020 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73  Since WhereClaus
31030 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d  e contains an 8-
31040 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20  byte.  ** field 
31050 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69  (type Bitmask) i
31060 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65  t must be aligne
31070 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62  d on an 8-byte b
31080 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20  oundary on.  ** 
31090 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75 72  some architectur
310a0 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f  es. Hence the RO
310b0 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20  UND8() below..  
310c0 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20  */.  nByteWInfo 
310d0 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
310e0 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62  WhereInfo)+(nTab
310f0 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57  List-1)*sizeof(W
31100 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70  hereLevel));.  p
31110 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  WInfo = sqlite3D
31120 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
31130 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a  nByteWInfo + siz
31140 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b  eof(WhereLoop));
31150 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
31160 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
31170 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
31180 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57   pWInfo);.    pW
31190 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f  Info = 0;.    go
311a0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
311b0 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  or;.  }.  pWInfo
311c0 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30  ->aiCurOnePass[0
311d0 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75  ] = pWInfo->aiCu
311e0 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 2d 31  rOnePass[1] = -1
311f0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  ;.  pWInfo->nLev
31200 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20  el = nTabList;. 
31210 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20   pWInfo->pParse 
31220 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e  = pParse;.  pWIn
31230 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70  fo->pTabList = p
31240 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66  TabList;.  pWInf
31250 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  o->pOrderBy = pO
31260 72 64 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f  rderBy;.  pWInfo
31270 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 70  ->pResultSet = p
31280 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 70 57 49  ResultSet;.  pWI
31290 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71  nfo->iBreak = sq
312a0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
312b0 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d  el(v);.  pWInfo-
312c0 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63  >wctrlFlags = wc
312d0 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e  trlFlags;.  pWIn
312e0 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
312f0 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51  oop = pParse->nQ
31300 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73  ueryLoop;.  pMas
31310 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  kSet = &pWInfo->
31320 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42  sMaskSet;.  sWLB
31330 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f  .pWInfo = pWInfo
31340 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 26  ;.  sWLB.pWC = &
31350 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73  pWInfo->sWC;.  s
31360 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68 65 72  WLB.pNew = (Wher
31370 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a 29  eLoop*)(((char*)
31380 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e  pWInfo)+nByteWIn
31390 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  fo);.  assert( E
313a0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
313b0 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77 29 20 29  ENT(sWLB.pNew) )
313c0 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
313d0 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69  t(sWLB.pNew);.#i
313e0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
313f0 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63  G.  sWLB.pNew->c
31400 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66  Id = '*';.#endif
31410 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65  ..  /* Split the
31420 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
31430 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65  to separate sube
31440 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65  xpressions where
31450 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78   each.  ** subex
31460 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61  pression is sepa
31470 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20  rated by an AND 
31480 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20  operator..  */. 
31490 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61   initMaskSet(pMa
314a0 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43  skSet);.  whereC
314b0 6c 61 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66  lauseInit(&pWInf
314c0 6f 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b  o->sWC, pWInfo);
314d0 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 26 70  .  whereSplit(&p
314e0 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65  WInfo->sWC, pWhe
314f0 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 73  re, TK_AND);.  s
31500 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
31510 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d  Schema(pParse, -
31520 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  1); /* Insert th
31530 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65  e cookie verifie
31540 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 20 20 0a 20  r Goto */.    . 
31550 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
31560 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  : a WHERE clause
31570 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e   that is constan
31580 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65  t.  Evaluate the
31590 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
315a0 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70   and either jump
315b0 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65   over all of the
315c0 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68   code or fall th
315d0 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ru..  */.  if( p
315e0 57 68 65 72 65 20 26 26 20 28 6e 54 61 62 4c 69  Where && (nTabLi
315f0 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  st==0 || sqlite3
31600 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
31610 74 4a 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29  tJoin(pWhere)) )
31620 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
31630 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
31640 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d   pWhere, pWInfo-
31650 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f  >iBreak, SQLITE_
31660 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
31670 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d   pWhere = 0;.  }
31680 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63  ..  /* Special c
31690 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61  ase: No FROM cla
316a0 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  use.  */.  if( n
316b0 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  TabList==0 ){.  
316c0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
316d0 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20   pWInfo->bOBSat 
316e0 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 77 63 74  = 1;.    if( wct
316f0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
31700 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
31710 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
31720 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
31730 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
31740 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
31750 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66  * Assign a bit f
31760 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20  rom the bitmask 
31770 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
31780 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
31790 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
317a0 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61   assigning bitma
317b0 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f  sk values to FRO
317c0 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73  M clause cursors
317d0 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a  , it must be.  *
317e0 2a 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  * the case that 
317f0 69 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d  if X is the bitm
31800 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68  ask for the N-th
31810 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
31820 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  m then.  ** the 
31830 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20  bitmask for all 
31840 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
31850 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
31860 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20   the N-th term. 
31870 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20   ** is (X-1).   
31880 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  An expression fr
31890 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  om the ON clause
318a0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
318b0 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73  can use.  ** its
318c0 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e   Expr.iRightJoin
318d0 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66  Table value to f
318e0 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20  ind the bitmask 
318f0 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
31900 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a  le.  ** of the j
31910 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e  oin.  Subtractin
31920 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72  g one from the r
31930 69 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61  ight table bitma
31940 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20  sk gives a.  ** 
31950 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20  bitmask for all 
31960 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
31970 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ft of the join. 
31980 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74   Knowing the bit
31990 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c  mask.  ** for al
319a0 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
319b0 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a  left of a left j
319c0 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  oin is important
319d0 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e  .  Ticket #3015.
319e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20  .  **.  ** Note 
319f0 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72  that bitmasks ar
31a00 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c  e created for al
31a10 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  l pTabList->nSrc
31a20 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20   tables in.  ** 
31a30 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75  pTabList, not ju
31a40 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54 61  st the first nTa
31a50 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e  bList tables.  n
31a60 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61  TabList is norma
31a70 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74  lly.  ** equal t
31a80 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  o pTabList->nSrc
31a90 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 73 68   but might be sh
31aa0 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20  ortened to 1 if 
31ab0 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f  the.  ** WHERE_O
31ac0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61  NETABLE_ONLY fla
31ad0 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  g is set..  */. 
31ae0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54   for(ii=0; ii<pT
31af0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69  abList->nSrc; ii
31b00 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d  ++){.    createM
31b10 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
31b20 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43  abList->a[ii].iC
31b30 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e  ursor);.  }.#ifn
31b40 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20  def NDEBUG.  {. 
31b50 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65     Bitmask toThe
31b60 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f  Left = 0;.    fo
31b70 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c  r(ii=0; ii<pTabL
31b80 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29  ist->nSrc; ii++)
31b90 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
31ba0 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  m = getMask(pMas
31bb0 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
31bc0 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  a[ii].iCursor);.
31bd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6d        assert( (m
31be0 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29  -1)==toTheLeft )
31bf0 3b 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65 66  ;.      toTheLef
31c00 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20  t |= m;.    }.  
31c10 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
31c20 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68  nalyze all of th
31c30 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  e subexpressions
31c40 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70  .  Note that exp
31c50 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74  rAnalyze() might
31c60 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69  .  ** add new vi
31c70 72 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f  rtual terms onto
31c80 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
31c90 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57  WHERE clause.  W
31ca0 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61  e do not.  ** wa
31cb0 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68  nt to analyze th
31cc0 65 73 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d  ese virtual term
31cd0 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c  s, so start anal
31ce0 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64  yzing at the end
31cf0 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66  .  ** and work f
31d00 6f 72 77 61 72 64 20 73 6f 20 74 68 61 74 20 74  orward so that t
31d10 68 65 20 61 64 64 65 64 20 76 69 72 74 75 61 6c  he added virtual
31d20 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72   terms are never
31d30 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f   processed..  */
31d40 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  .  exprAnalyzeAl
31d50 6c 28 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49  l(pTabList, &pWI
31d60 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28  nfo->sWC);.  if(
31d70 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
31d80 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68  d ){.    goto wh
31d90 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
31da0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
31db0 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f  ORDER BY (or GRO
31dc0 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 63 6f  UP BY) clause co
31dd0 6e 74 61 69 6e 73 20 72 65 66 65 72 65 6e 63 65  ntains reference
31de0 73 20 74 6f 20 67 65 6e 65 72 61 6c 0a 20 20 2a  s to general.  *
31df0 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 74  * expressions, t
31e00 68 65 6e 20 77 65 20 77 6f 6e 27 74 20 62 65 20  hen we won't be 
31e10 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20  able to satisfy 
31e20 69 74 20 75 73 69 6e 67 20 69 6e 64 69 63 65 73  it using indices
31e30 2c 20 73 6f 0a 20 20 2a 2a 20 67 6f 20 61 68 65  , so.  ** go ahe
31e40 61 64 20 61 6e 64 20 64 69 73 61 62 6c 65 20 69  ad and disable i
31e50 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  t now..  */.  if
31e60 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 28 77  ( pOrderBy && (w
31e70 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
31e80 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29  E_WANT_DISTINCT)
31e90 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  !=0 ){.    for(i
31ea0 69 3d 30 3b 20 69 69 3c 70 4f 72 64 65 72 42 79  i=0; ii<pOrderBy
31eb0 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a  ->nExpr; ii++){.
31ec0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
31ed0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
31ee0 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65  kipCollate(pOrde
31ef0 72 42 79 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  rBy->a[ii].pExpr
31f00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
31f10 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
31f20 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49  N ){.        pWI
31f30 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  nfo->pOrderBy = 
31f40 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
31f50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
31f60 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78     }else if( pEx
31f70 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
31f80 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
31f90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
31fa0 7d 0a 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c  }..  if( wctrlFl
31fb0 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
31fc0 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20  _DISTINCT ){.   
31fd0 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 52   if( isDistinctR
31fe0 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c  edundant(pParse,
31ff0 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e   pTabList, &pWIn
32000 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c 74  fo->sWC, pResult
32010 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Set) ){.      /*
32020 20 54 68 65 20 44 49 53 54 49 4e 43 54 20 6d 61   The DISTINCT ma
32030 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65  rking is pointle
32040 73 73 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e 20  ss.  Ignore it. 
32050 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  */.      pWInfo-
32060 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
32070 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
32080 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  UE;.    }else if
32090 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ( pOrderBy==0 ){
320a0 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f  .      /* Try to
320b0 20 4f 52 44 45 52 20 42 59 20 74 68 65 20 72 65   ORDER BY the re
320c0 73 75 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b 65  sult set to make
320d0 20 64 69 73 74 69 6e 63 74 20 70 72 6f 63 65 73   distinct proces
320e0 73 69 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a 20  sing easier */. 
320f0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74       pWInfo->wct
32100 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  rlFlags |= WHERE
32110 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20  _DISTINCTBY;.   
32120 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65     pWInfo->pOrde
32130 72 42 79 20 3d 20 70 52 65 73 75 6c 74 53 65 74  rBy = pResultSet
32140 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
32150 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
32160 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
32170 73 20 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43  s */.  WHERETRAC
32180 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f  E(0xffff,("*** O
32190 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a  ptimizer Start *
321a0 2a 2a 5c 6e 22 29 29 3b 0a 20 20 2f 2a 20 44 69  **\n"));.  /* Di
321b0 73 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d 73 20  splay all terms 
321c0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
321d0 75 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  use */.#if defin
321e0 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
321f0 41 42 4c 45 44 29 20 26 26 20 64 65 66 69 6e 65  ABLED) && define
32200 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
32210 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20  TREE_EXPLAIN).  
32220 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
32230 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
32240 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
32250 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
32260 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 73 71 6c  ->pVdbe;.    sql
32270 69 74 65 33 45 78 70 6c 61 69 6e 42 65 67 69 6e  ite3ExplainBegin
32280 28 76 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  (v);.    for(i=0
32290 3b 20 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54  ; i<sWLB.pWC->nT
322a0 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  erm; i++){.     
322b0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
322c0 72 69 6e 74 66 28 76 2c 20 22 23 25 2d 32 64 20  rintf(v, "#%-2d 
322d0 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", i);.      sql
322e0 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28  ite3ExplainPush(
322f0 76 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 45  v);.      whereE
32300 78 70 6c 61 69 6e 54 65 72 6d 28 76 2c 20 26 73  xplainTerm(v, &s
32310 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 5d 29 3b 0a  WLB.pWC->a[i]);.
32320 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
32330 6c 61 69 6e 50 6f 70 28 76 29 3b 0a 20 20 20 20  lainPop(v);.    
32340 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
32350 4e 4c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  NL(v);.    }.   
32360 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 46   sqlite3ExplainF
32370 69 6e 69 73 68 28 76 29 3b 0a 20 20 20 20 73 71  inish(v);.    sq
32380 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
32390 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 56 64  ("%s", sqlite3Vd
323a0 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28 76 29  beExplanation(v)
323b0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
323c0 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20  if( nTabList!=1 
323d0 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75 74  || whereShortCut
323e0 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20  (&sWLB)==0 ){.  
323f0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
32400 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20  AddAll(&sWLB);. 
32410 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
32420 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
32430 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 44 69 73 70  ;.  .    /* Disp
32440 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 57  lay all of the W
32450 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
32460 20 69 66 20 77 68 65 72 65 74 72 61 63 65 20 69   if wheretrace i
32470 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 23 69 66  s enabled */.#if
32480 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
32490 4e 41 42 4c 45 44 20 2f 2a 20 21 3d 30 20 2a 2f  NABLED /* !=0 */
324a0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
324b0 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20  WhereTrace ){.  
324c0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
324d0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
324e0 20 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72       static char
324f0 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32   zLabel[] = "012
32500 33 34 35 36 37 38 39 61 62 63 64 65 66 67 68 69  3456789abcdefghi
32510 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78  jklmnopqrstuvwyx
32520 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  z".             
32530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32540 20 20 20 20 20 20 20 20 20 20 22 41 42 43 44 45            "ABCDE
32550 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
32560 56 57 59 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f  VWYXZ";.      fo
32570 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  r(p=pWInfo->pLoo
32580 70 73 2c 20 69 3d 30 3b 20 70 3b 20 70 3d 70 2d  ps, i=0; p; p=p-
32590 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29  >pNextLoop, i++)
325a0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 49 64  {.        p->cId
325b0 20 3d 20 7a 4c 61 62 65 6c 5b 69 25 73 69 7a 65   = zLabel[i%size
325c0 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20 20  of(zLabel)];.   
325d0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
325e0 69 6e 74 28 70 2c 20 73 57 4c 42 2e 70 57 43 29  int(p, sWLB.pWC)
325f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32600 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 77 68  #endif.  .    wh
32610 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57  erePathSolver(pW
32620 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66  Info, 0);.    if
32630 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
32640 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
32650 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69  eginError;.    i
32660 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
32670 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 77 68  rBy ){.       wh
32680 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57  erePathSolver(pW
32690 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52  Info, pWInfo->nR
326a0 6f 77 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20 20  owOut+1);.      
326b0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
326c0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
326d0 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
326e0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57    }.  }.  if( pW
326f0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  Info->pOrderBy==
32700 30 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20  0 && (db->flags 
32710 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65  & SQLITE_Reverse
32720 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a 20 20 20  Order)!=0 ){.   
32730 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
32740 6b 20 3d 20 28 42 69 74 6d 61 73 6b 29 28 2d 31  k = (Bitmask)(-1
32750 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
32760 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56  rse->nErr || NEV
32770 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ER(db->mallocFai
32780 6c 65 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  led) ){.    goto
32790 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
327a0 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 57 48 45  ;.  }.#ifdef WHE
327b0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
327c0 2f 2a 20 21 3d 30 20 2a 2f 0a 20 20 69 66 28 20  /* !=0 */.  if( 
327d0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
327e0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b  e ){.    int ii;
327f0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
32800 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f  gPrintf("---- So
32810 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c  lution nRow=%d",
32820 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
32830 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
32840 6f 2d 3e 62 4f 42 53 61 74 20 29 7b 0a 20 20 20  o->bOBSat ){.   
32850 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
32860 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59 3d  rintf(" ORDERBY=
32870 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d  0x%llx", pWInfo-
32880 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d  >revMask);.    }
32890 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 57 49  .    switch( pWI
328a0 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 29  nfo->eDistinct )
328b0 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  {.      case WHE
328c0 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
328d0 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  UE: {.        sq
328e0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
328f0 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 69  ("  DISTINCT=uni
32900 71 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20 62  que");.        b
32910 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
32920 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
32930 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a  ISTINCT_ORDERED:
32940 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
32950 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
32960 20 44 49 53 54 49 4e 43 54 3d 6f 72 64 65 72 65   DISTINCT=ordere
32970 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  d");.        bre
32980 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
32990 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
329a0 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a  TINCT_UNORDERED:
329b0 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
329c0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
329d0 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65   DISTINCT=unorde
329e0 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62  red");.        b
329f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
32a00 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
32a10 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
32a20 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
32a30 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  ii<pWInfo->nLeve
32a40 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  l; ii++){.      
32a50 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
32a60 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c  WInfo->a[ii].pWL
32a70 6f 6f 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a  oop, sWLB.pWC);.
32a80 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
32a90 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f  .  /* Attempt to
32aa0 20 6f 6d 69 74 20 74 61 62 6c 65 73 20 66 72 6f   omit tables fro
32ab0 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68 61 74 20  m the join that 
32ac0 64 6f 20 6e 6f 74 20 65 66 66 65 63 74 20 74 68  do not effect th
32ad0 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 66  e result */.  if
32ae0 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
32af0 3e 3d 32 0a 20 20 20 26 26 20 70 52 65 73 75 6c  >=2.   && pResul
32b00 74 53 65 74 21 3d 30 0a 20 20 20 26 26 20 4f 70  tSet!=0.   && Op
32b10 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
32b20 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 6d 69  d(db, SQLITE_Omi
32b30 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a  tNoopJoin).  ){.
32b40 20 20 20 20 42 69 74 6d 61 73 6b 20 74 61 62 55      Bitmask tabU
32b50 73 65 64 20 3d 20 65 78 70 72 4c 69 73 74 54 61  sed = exprListTa
32b60 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
32b70 74 2c 20 70 52 65 73 75 6c 74 53 65 74 29 3b 0a  t, pResultSet);.
32b80 20 20 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72      if( sWLB.pOr
32b90 64 65 72 42 79 20 29 20 74 61 62 55 73 65 64 20  derBy ) tabUsed 
32ba0 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
32bb0 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
32bc0 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b 0a  sWLB.pOrderBy);.
32bd0 20 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66      while( pWInf
32be0 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a  o->nLevel>=2 ){.
32bf0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
32c00 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20  *pTerm, *pEnd;. 
32c10 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49       pLoop = pWI
32c20 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e  nfo->a[pWInfo->n
32c30 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b  Level-1].pWLoop;
32c40 0a 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e  .      if( (pWIn
32c50 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
32c60 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 6a 6f 69  pLoop->iTab].joi
32c70 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
32c80 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
32c90 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
32ca0 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
32cb0 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20 20  DISTINCT)==0.   
32cc0 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77      && (pLoop->w
32cd0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
32ce0 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20 20  NEROW)==0.      
32cf0 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
32d00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32d10 69 66 28 20 28 74 61 62 55 73 65 64 20 26 20 70  if( (tabUsed & p
32d20 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21  Loop->maskSelf)!
32d30 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
32d40 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57    pEnd = sWLB.pW
32d50 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d  C->a + sWLB.pWC-
32d60 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f  >nTerm;.      fo
32d70 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43  r(pTerm=sWLB.pWC
32d80 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b  ->a; pTerm<pEnd;
32d90 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
32da0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
32db0 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70  rereqAll & pLoop
32dc0 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a 20  ->maskSelf)!=0. 
32dd0 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72          && !Expr
32de0 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
32df0 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
32e00 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 29  mJoin).        )
32e10 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  {.          brea
32e20 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
32e30 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
32e40 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72 65 61  Term<pEnd ) brea
32e50 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  k;.      WHERETR
32e60 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d 3e  ACE(0xffff, ("->
32e70 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f   drop loop %c no
32e80 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70  t used\n", pLoop
32e90 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20 70  ->cId));.      p
32ea0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b  WInfo->nLevel--;
32eb0 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74 2d  .      nTabList-
32ec0 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57  -;.    }.  }.  W
32ed0 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66  HERETRACE(0xffff
32ee0 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  ,("*** Optimizer
32ef0 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22   Finished ***\n"
32f00 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50  ));.  pWInfo->pP
32f10 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
32f20 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77   += pWInfo->nRow
32f30 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Out;..  /* If th
32f40 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55  e caller is an U
32f50 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
32f60 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69  statement that i
32f70 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a  s requesting.  *
32f80 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70  * to use a one-p
32f90 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64  ass algorithm, d
32fa0 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73  etermine if this
32fb0 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   is appropriate.
32fc0 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61  .  ** The one-pa
32fd0 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c  ss algorithm onl
32fe0 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57  y works if the W
32ff0 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
33000 74 72 61 69 6e 73 0a 20 20 2a 2a 20 74 68 65 20  trains.  ** the 
33010 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70 64  statement to upd
33020 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  ate a single row
33030 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
33040 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
33050 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
33060 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e  IRED)==0 || pWIn
33070 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b  fo->nLevel==1 );
33080 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61  .  if( (wctrlFla
33090 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
330a0 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 0a  SS_DESIRED)!=0 .
330b0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 61     && (pWInfo->a
330c0 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  [0].pWLoop->wsFl
330d0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
330e0 4f 57 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57  OW)!=0 ){.    pW
330f0 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
33100 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 48 61 73  = 1;.    if( Has
33110 52 6f 77 69 64 28 70 54 61 62 4c 69 73 74 2d 3e  Rowid(pTabList->
33120 61 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20  a[0].pTab) ){.  
33130 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
33140 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  .pWLoop->wsFlags
33150 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f   &= ~WHERE_IDX_O
33160 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  NLY;.    }.  }..
33170 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61    /* Open all ta
33180 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62  bles in the pTab
33190 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64  List and any ind
331a0 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f  ices selected fo
331b0 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67  r.  ** searching
331c0 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20   those tables.. 
331d0 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
331e0 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
331f0 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c  for(ii=0, pLevel
33200 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e  =pWInfo->a; ii<n
33210 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70  TabList; ii++, p
33220 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61  Level++){.    Ta
33230 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
33240 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  * Table to open 
33250 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
33260 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
33270 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
33280 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e  taining table/in
33290 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  dex */.    struc
332a0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
332b0 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70  pTabItem;..    p
332c0 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
332d0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
332e0 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20  From];.    pTab 
332f0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
33300 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
33310 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
33320 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
33330 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  ma);.    pLoop =
33340 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
33350 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
33360 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
33370 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70  hemeral)!=0 || p
33380 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
33390 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
333a0 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ing */.    }else
333b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
333c0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
333d0 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  E.    if( (pLoop
333e0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
333f0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
33400 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
33410 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20  t char *pVTab = 
33420 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
33430 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
33440 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
33450 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
33460 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
33470 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
33480 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65  ddOp4(v, OP_VOpe
33490 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70  n, iCur, 0, 0, p
334a0 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  VTab, P4_VTAB);.
334b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
334c0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
334d0 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a  .      /* noop *
334e0 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  /.    }else.#end
334f0 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  if.    if( (pLoo
33500 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
33510 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
33520 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74           && (wct
33530 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
33540 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29  OMIT_OPEN_CLOSE)
33550 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
33560 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61   op = OP_OpenRea
33570 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  d;.      if( pWI
33580 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 29  nfo->okOnePass )
33590 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  {.        op = O
335a0 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20  P_OpenWrite;.   
335b0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43       pWInfo->aiC
335c0 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70  urOnePass[0] = p
335d0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
335e0 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  ;.      };.     
335f0 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
33600 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74  e(pParse, pTabIt
33610 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62  em->iCursor, iDb
33620 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20  , pTab, op);.   
33630 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 49     assert( pTabI
33640 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 4c  tem->iCursor==pL
33650 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 3b  evel->iTabCur );
33660 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
33670 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
33680 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  ass && pTab->nCo
33690 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  l==BMS-1 );.    
336a0 20 20 74 65 73 74 63 61 73 65 28 20 21 70 57 49    testcase( !pWI
336b0 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26  nfo->okOnePass &
336c0 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d  & pTab->nCol==BM
336d0 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  S );.      if( !
336e0 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
336f0 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c  s && pTab->nCol<
33700 42 4d 53 20 26 26 20 48 61 73 52 6f 77 69 64 28  BMS && HasRowid(
33710 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
33720 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61   Bitmask b = pTa
33730 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  bItem->colUsed;.
33740 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
33750 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b  0;.        for(;
33760 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29   b; b=b>>1, n++)
33770 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  {}.        sqlit
33780 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
33790 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
337a0 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 0a  rentAddr(v)-1, .
337b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
337c0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
337d0 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29  TE_INT_TO_PTR(n)
337e0 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20  , P4_INT32);.   
337f0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d       assert( n<=
33800 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
33810 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
33820 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
33830 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
33840 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
33850 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
33860 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
33870 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
33880 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
33890 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
338a0 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Ix = pLoop->u.bt
338b0 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
338c0 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75 72 3b    int iIndexCur;
338d0 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  .      int op = 
338e0 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20  OP_OpenRead;.   
338f0 20 20 20 2f 2a 20 69 49 64 78 43 75 72 20 69 73     /* iIdxCur is
33900 20 61 6c 77 61 79 73 20 73 65 74 20 69 66 20 74   always set if t
33910 6f 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c  o a positive val
33920 75 65 20 69 66 20 4f 4e 45 50 41 53 53 20 69 73  ue if ONEPASS is
33930 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 20   possible */.   
33940 20 20 20 61 73 73 65 72 74 28 20 69 49 64 78 43     assert( iIdxC
33950 75 72 21 3d 30 20 7c 7c 20 28 70 57 49 6e 66 6f  ur!=0 || (pWInfo
33960 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
33970 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
33980 49 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20  IRED)==0 );.    
33990 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6f 6b    if( pWInfo->ok
339a0 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20 20 20 20  OnePass ){.     
339b0 20 20 20 49 6e 64 65 78 20 2a 70 4a 20 3d 20 70     Index *pJ = p
339c0 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70  TabItem->pTab->p
339d0 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 69  Index;.        i
339e0 49 6e 64 65 78 43 75 72 20 3d 20 69 49 64 78 43  IndexCur = iIdxC
339f0 75 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ur;.        asse
33a00 72 74 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  rt( wctrlFlags &
33a10 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
33a20 45 53 49 52 45 44 20 29 3b 0a 20 20 20 20 20 20  ESIRED );.      
33a30 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
33a40 70 4a 29 20 26 26 20 70 4a 21 3d 70 49 78 20 29  pJ) && pJ!=pIx )
33a50 7b 0a 20 20 20 20 20 20 20 20 20 20 69 49 6e 64  {.          iInd
33a60 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20 20 20 20  exCur++;.       
33a70 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78     pJ = pJ->pNex
33a80 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
33a90 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65       op = OP_Ope
33aa0 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20  nWrite;.        
33ab0 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
33ac0 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e 64 65 78  Pass[1] = iIndex
33ad0 43 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Cur;.      }else
33ae0 20 69 66 28 20 69 49 64 78 43 75 72 20 26 26 20   if( iIdxCur && 
33af0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
33b00 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
33b10 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
33b20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 49 64   iIndexCur = iId
33b30 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xCur;.      }els
33b40 65 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65  e{.        iInde
33b50 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xCur = pParse->n
33b60 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  Tab++;.      }. 
33b70 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64       pLevel->iId
33b80 78 43 75 72 20 3d 20 69 49 6e 64 65 78 43 75 72  xCur = iIndexCur
33b90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
33ba0 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  pIx->pSchema==pT
33bb0 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
33bc0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 49 6e       assert( iIn
33bd0 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20  dexCur>=0 );.   
33be0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
33bf0 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64  dOp3(v, op, iInd
33c00 65 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d  exCur, pIx->tnum
33c10 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
33c20 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
33c30 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yInfo(pParse, pI
33c40 78 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  x);.      VdbeCo
33c50 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
33c60 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  pIx->zName));.  
33c70 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
33c80 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
33c90 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
33ca0 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67    notReady &= ~g
33cb0 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
33cc0 73 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74  sMaskSet, pTabIt
33cd0 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
33ce0 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  }.  pWInfo->iTop
33cf0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
33d00 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
33d10 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
33d20 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
33d30 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20  eBeginError;..  
33d40 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
33d50 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73  code to do the s
33d60 65 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65  earch.  Each ite
33d70 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f  ration of the fo
33d80 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f  r.  ** loop belo
33d90 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  w generates code
33da0 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65   for a single ne
33db0 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65  sted loop of the
33dc0 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d   VM.  ** program
33dd0 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64  ..  */.  notRead
33de0 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  y = ~(Bitmask)0;
33df0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
33e00 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b  nTabList; ii++){
33e10 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
33e20 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 23 69  WInfo->a[ii];.#i
33e30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33e40 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
33e50 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  X.    if( (pLeve
33e60 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  l->pWLoop->wsFla
33e70 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
33e80 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20  INDEX)!=0 ){.   
33e90 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f     constructAuto
33ea0 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61 72 73  maticIndex(pPars
33eb0 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  e, &pWInfo->sWC,
33ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33ed0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
33ee0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f  evel->iFrom], no
33ef0 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b  tReady, pLevel);
33f00 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  .      if( db->m
33f10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
33f20 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
33f30 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  or;.    }.#endif
33f40 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53  .    explainOneS
33f50 63 61 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  can(pParse, pTab
33f60 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69  List, pLevel, ii
33f70 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c  , pLevel->iFrom,
33f80 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20   wctrlFlags);.  
33f90 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f    pLevel->addrBo
33fa0 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dy = sqlite3Vdbe
33fb0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
33fc0 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 63      notReady = c
33fd0 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28  odeOneLoopStart(
33fe0 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52  pWInfo, ii, notR
33ff0 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66  eady);.    pWInf
34000 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70  o->iContinue = p
34010 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b  Level->addrCont;
34020 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e  .  }..  /* Done.
34030 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65   */.  VdbeModule
34040 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67  Comment((v, "Beg
34050 69 6e 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29  in WHERE-core"))
34060 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  ;.  return pWInf
34070 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  o;..  /* Jump he
34080 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  re if malloc fai
34090 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e  ls */.whereBegin
340a0 45 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49  Error:.  if( pWI
340b0 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73  nfo ){.    pPars
340c0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
340d0 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
340e0 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65  eryLoop;.    whe
340f0 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70  reInfoFree(db, p
34100 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  WInfo);.  }.  re
34110 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
34120 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e   Generate the en
34130 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c  d of the WHERE l
34140 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e  oop.  See commen
34150 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65  ts on .** sqlite
34160 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f  3WhereBegin() fo
34170 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
34180 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  ormation..*/.voi
34190 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  d sqlite3WhereEn
341a0 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  d(WhereInfo *pWI
341b0 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  nfo){.  Parse *p
341c0 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
341d0 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a  pParse;.  Vdbe *
341e0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
341f0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  e;.  int i;.  Wh
34200 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
34210 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
34220 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74 20  Loop;.  SrcList 
34230 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e  *pTabList = pWIn
34240 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
34250 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
34260 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
34270 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65  Generate loop te
34280 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a  rmination code..
34290 20 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c    */.  VdbeModul
342a0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e  eComment((v, "En
342b0 64 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b  d WHERE-core"));
342c0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
342d0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
342e0 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f  ;.  for(i=pWInfo
342f0 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30  ->nLevel-1; i>=0
34300 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
34310 61 64 64 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  addr;.    pLevel
34320 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
34330 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ;.    pLoop = pL
34340 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
34350 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
34360 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
34370 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a  vel->addrCont);.
34380 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
34390 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  op!=OP_Noop ){. 
343a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
343b0 41 64 64 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c  AddOp2(v, pLevel
343c0 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31  ->op, pLevel->p1
343d0 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20  , pLevel->p2);. 
343e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
343f0 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76  ChangeP5(v, pLev
34400 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 7d 0a 20  el->p5);.    }. 
34410 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
34420 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
34430 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d  _ABLE && pLevel-
34440 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20  >u.in.nIn>0 ){. 
34450 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f       struct InLo
34460 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69  op *pIn;.      i
34470 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt j;.      sqli
34480 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
34490 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
344a0 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66  ddrNxt);.      f
344b0 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69  or(j=pLevel->u.i
344c0 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76  n.nIn, pIn=&pLev
344d0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
344e0 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  [j-1]; j>0; j--,
344f0 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20   pIn--){.       
34500 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
34510 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64  Here(v, pIn->add
34520 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20  rInTop+1);.     
34530 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34540 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e 65 45 6e  dOp2(v, pIn->eEn
34550 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43  dLoopOp, pIn->iC
34560 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  ur, pIn->addrInT
34570 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  op);.        sql
34580 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
34590 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  (v, pIn->addrInT
345a0 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  op-1);.      }. 
345b0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
345c0 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75  ee(db, pLevel->u
345d0 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20  .in.aInLoop);.  
345e0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
345f0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
34600 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  v, pLevel->addrB
34610 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  rk);.    if( pLe
34620 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 29 7b  vel->addrSkip ){
34630 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
34640 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
34650 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  oto, 0, pLevel->
34660 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20  addrSkip);.     
34670 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
34680 20 22 6e 65 78 74 20 73 6b 69 70 2d 73 63 61 6e   "next skip-scan
34690 20 6f 6e 20 25 73 22 2c 20 70 4c 6f 6f 70 2d 3e   on %s", pLoop->
346a0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
346b0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
346c0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
346d0 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  re(v, pLevel->ad
346e0 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 73  drSkip);.      s
346f0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
34700 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  re(v, pLevel->ad
34710 64 72 53 6b 69 70 2d 32 29 3b 0a 20 20 20 20 7d  drSkip-2);.    }
34720 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
34730 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  >iLeftJoin ){.  
34740 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
34750 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
34760 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c  OP_IfPos, pLevel
34770 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
34780 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f      assert( (pLo
34790 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
347a0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
347b0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
347c0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
347d0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
347e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
347f0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
34800 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
34810 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
34820 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34830 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
34840 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
34850 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
34860 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f  }.      if( pLoo
34870 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
34880 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20  RE_INDEXED ){.  
34890 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
348a0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
348b0 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69  llRow, pLevel->i
348c0 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d  IdxCur);.      }
348d0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
348e0 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e  l->op==OP_Return
348f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
34900 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
34910 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65   OP_Gosub, pLeve
34920 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61  l->p1, pLevel->a
34930 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20  ddrFirst);.     
34940 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
34950 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34960 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
34970 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
34980 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
34990 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
349a0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
349b0 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65 4d  .    }.    VdbeM
349c0 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
349d0 20 22 45 6e 64 20 57 48 45 52 45 2d 6c 6f 6f 70   "End WHERE-loop
349e0 25 64 3a 20 25 73 22 2c 20 69 2c 0a 20 20 20 20  %d: %s", i,.    
349f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a00 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
34a10 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
34a20 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  om].pTab->zName)
34a30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
34a40 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69   "break" point i
34a50 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73  s here, just pas
34a60 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
34a70 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a   outer loop..  *
34a80 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20  * Set it..  */. 
34a90 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
34aa0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e  lveLabel(v, pWIn
34ab0 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
34ac0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
34ad0 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74  nLevel<=pTabList
34ae0 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28  ->nSrc );.  for(
34af0 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
34b00 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d  fo->a; i<pWInfo-
34b10 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c  >nLevel; i++, pL
34b20 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64  evel++){.    Ind
34b30 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20  ex *pIdx = 0;.  
34b40 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
34b50 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20  _item *pTabItem 
34b60 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
34b70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
34b80 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
34b90 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
34ba0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
34bb0 62 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f  b!=0 );.    pLoo
34bc0 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
34bd0 6f 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73  op;..    /* Clos
34be0 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72  e all of the cur
34bf0 73 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f  sors that were o
34c00 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  pened by sqlite3
34c10 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 20 20  WhereBegin..    
34c20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f  ** Except, do no
34c30 74 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20  t close cursors 
34c40 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 75  that will be reu
34c50 73 65 64 20 62 79 20 74 68 65 20 4f 52 20 6f 70  sed by the OR op
34c60 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a  timization.    *
34c70 2a 20 28 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50  * (WHERE_OMIT_OP
34c80 45 4e 5f 43 4c 4f 53 45 29 2e 20 20 41 6e 64 20  EN_CLOSE).  And 
34c90 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 74 68 65  do not close the
34ca0 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 63 75   OP_OpenWrite cu
34cb0 72 73 6f 72 73 0a 20 20 20 20 2a 2a 20 63 72 65  rsors.    ** cre
34cc0 61 74 65 64 20 66 6f 72 20 74 68 65 20 4f 4e 45  ated for the ONE
34cd0 50 41 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f  PASS optimizatio
34ce0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
34cf0 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
34d00 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
34d10 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 54 61  )==0.     && pTa
34d20 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20  b->pSelect==0.  
34d30 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
34d40 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
34d50 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53  E_OMIT_OPEN_CLOS
34d60 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  E)==0.    ){.   
34d70 20 20 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f     int ws = pLoo
34d80 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  p->wsFlags;.    
34d90 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f    if( !pWInfo->o
34da0 6b 4f 6e 65 50 61 73 73 20 26 26 20 28 77 73 20  kOnePass && (ws 
34db0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
34dc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
34dd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34de0 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  1(v, OP_Close, p
34df0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
34e00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
34e10 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52 45   if( (ws & WHERE
34e20 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20  _INDEXED)!=0.   
34e30 20 20 20 20 26 26 20 28 77 73 20 26 20 28 57 48      && (ws & (WH
34e40 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 41 55  ERE_IPK|WHERE_AU
34e50 54 4f 5f 49 4e 44 45 58 29 29 3d 3d 30 20 0a 20  TO_INDEX))==0 . 
34e60 20 20 20 20 20 20 26 26 20 70 4c 65 76 65 6c 2d        && pLevel-
34e70 3e 69 49 64 78 43 75 72 21 3d 70 57 49 6e 66 6f  >iIdxCur!=pWInfo
34e80 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31  ->aiCurOnePass[1
34e90 5d 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ].      ){.     
34ea0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34eb0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
34ec0 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
34ed0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
34ee0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
34ef0 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69  s scan uses an i
34f00 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44 42 45 20  ndex, make VDBE 
34f10 63 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f  code substitutio
34f20 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a  ns to read data.
34f30 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
34f40 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66  index instead of
34f50 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
34f60 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 20  where possible. 
34f70 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a 20   In some cases. 
34f80 20 20 20 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d     ** this optim
34f90 69 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e 74 73  ization prevents
34fa0 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
34fb0 65 76 65 72 20 62 65 69 6e 67 20 72 65 61 64 2c  ever being read,
34fc0 20 77 68 69 63 68 20 63 61 6e 0a 20 20 20 20 2a   which can.    *
34fd0 2a 20 79 69 65 6c 64 20 61 20 73 69 67 6e 69 66  * yield a signif
34fe0 69 63 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63  icant performanc
34ff0 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20  e boost..    ** 
35000 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f  .    ** Calls to
35010 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
35020 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73  tor in between s
35030 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
35040 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69   and.    ** sqli
35050 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c  te3WhereEnd will
35060 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f   have created co
35070 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  de that referenc
35080 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  es the table.   
35090 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54   ** directly.  T
350a0 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61  his loop scans a
350b0 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f  ll that code loo
350c0 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73  king for opcodes
350d0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66  .    ** that ref
350e0 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65  erence the table
350f0 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68   and converts th
35100 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20  em into opcodes 
35110 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65  that.    ** refe
35120 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e  rence the index.
35130 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
35140 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
35150 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c   (WHERE_INDEXED|
35160 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20  WHERE_IDX_ONLY) 
35170 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20  ){.      pIdx = 
35180 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
35190 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65  Index;.    }else
351a0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
351b0 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
351c0 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49  I_OR ){.      pI
351d0 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70  dx = pLevel->u.p
351e0 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20  Covidx;.    }.  
351f0 20 20 69 66 28 20 70 49 64 78 20 26 26 20 21 64    if( pIdx && !d
35200 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
35210 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20  ){.      int k, 
35220 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65  last;.      Vdbe
35230 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 20 20 20 20  Op *pOp;..      
35240 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  last = sqlite3Vd
35250 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
35260 3b 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c 65 76  ;.      k = pLev
35270 65 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 20 20  el->addrBody;.  
35280 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
35290 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 6b 29  3VdbeGetOp(v, k)
352a0 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 6b 3c  ;.      for(; k<
352b0 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b  last; k++, pOp++
352c0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
352d0 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e  Op->p1!=pLevel->
352e0 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e  iTabCur ) contin
352f0 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
35300 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
35310 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
35320 20 20 20 20 69 6e 74 20 78 20 3d 20 70 4f 70 2d      int x = pOp-
35330 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20 61  >p2;.          a
35340 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 54 61  ssert( pIdx->pTa
35350 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20  ble==pTab );.   
35360 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52         if( !HasR
35370 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
35380 20 20 20 20 20 20 20 20 20 20 49 6e 64 65 78 20            Index 
35390 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72  *pPk = sqlite3Pr
353a0 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
353b0 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ab);.           
353c0 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75   x = pPk->aiColu
353d0 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20 20 20 20 20  mn[x];.         
353e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d   }.          x =
353f0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
35400 49 6e 64 65 78 28 70 49 64 78 2c 20 78 29 3b 0a  Index(pIdx, x);.
35410 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 3e            if( x>
35420 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
35430 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a 20    pOp->p2 = x;. 
35440 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
35450 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
35460 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
35470 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  }.          asse
35480 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
35490 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
354a0 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30  ONLY)==0 || x>=0
354b0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
354c0 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
354d0 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
354e0 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
354f0 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
35500 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ur;.          pO
35510 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49  p->opcode = OP_I
35520 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  dxRowid;.       
35530 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
35540 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c  .  }..  /* Final
35550 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20   cleanup.  */.  
35560 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
35570 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76  op = pWInfo->sav
35580 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
35590 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62  whereInfoFree(db
355a0 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74  , pWInfo);.  ret
355b0 75 72 6e 3b 0a 7d 0a                             urn;.}.