/ Hex Artifact Content
Login

Artifact 540f52385a653d7cc077e381875ec02bf4c80053:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65  Int.h"../*.** Re
0360: 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61 74  turn the estimat
0370: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
0380: 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61 20  put rows from a 
0390: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a  WHERE clause.*/.
03a0: 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72 65  u64 sqlite3Where
03b0: 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 57  OutputRowCount(W
03c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
03d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
03e0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
03f0: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
0400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0410: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
0420: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
0430: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
0440: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
0450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0460: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
0470: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
0480: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
0490: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
04a0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
04b0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04c0: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
04d0: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
04e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
04f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0500: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
0510: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
0520: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
0530: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
0540: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
0550: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0560: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
0570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0580: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0590: 3e 62 4f 42 53 61 74 21 3d 30 3b 0a 7d 0a 0a 2f  >bOBSat!=0;.}../
05a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
05b0: 56 44 42 45 20 61 64 64 72 65 73 73 20 6f 72 20  VDBE address or 
05c0: 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f  label to jump to
05d0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e   in order to con
05e0: 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61  tinue.** immedia
05f0: 74 65 6c 79 20 77 69 74 68 20 74 68 65 20 6e 65  tely with the ne
0600: 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48 45 52  xt row of a WHER
0610: 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74  E clause..*/.int
0620: 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e   sqlite3WhereCon
0630: 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65 72 65  tinueLabel(Where
0640: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
0650: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
0660: 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  iContinue;.}../*
0670: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56  .** Return the V
0680: 44 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c  DBE address or l
0690: 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20  abel to jump to 
06a0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61  in order to brea
06b0: 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48  k.** out of a WH
06c0: 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74  ERE loop..*/.int
06d0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
06e0: 61 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  akLabel(WhereInf
06f0: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
0700: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72  turn pWInfo->iBr
0710: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eak;.}../*.** Re
0720: 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20  turn TRUE if an 
0730: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
0740: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f   statement can o
0750: 70 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20  perate directly 
0760: 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73  on.** the rowids
0770: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57   returned by a W
0780: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65  HERE clause.  Re
0790: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f  turn FALSE if do
07a0: 69 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45  ing an.** UPDATE
07b0: 20 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74   or DELETE might
07c0: 20 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65   change subseque
07d0: 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  nt WHERE clause 
07e0: 72 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49  results..**.** I
07f0: 66 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70  f the ONEPASS op
0800: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73  timization is us
0810: 65 64 20 28 69 66 20 74 68 69 73 20 72 6f 75 74  ed (if this rout
0820: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65  ine returns true
0830: 29 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77  ).** then also w
0840: 72 69 74 65 20 74 68 65 20 69 6e 64 69 63 65 73  rite the indices
0850: 20 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72 73   of open cursors
0860: 20 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53 53   used by ONEPASS
0870: 0a 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b 30  .** into aiCur[0
0880: 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20  ] and aiCur[1]. 
0890: 20 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20 74   iaCur[0] gets t
08a0: 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65  he cursor of the
08b0: 20 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61   data.** table a
08c0: 6e 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74 73  nd iaCur[1] gets
08d0: 20 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64   the cursor used
08e0: 20 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79   by an auxiliary
08f0: 20 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65   index..** Eithe
0900: 72 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 2d  r value may be -
0910: 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  1, indicating th
0920: 61 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  at cursor is not
0930: 20 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75   used..** Any cu
0940: 72 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20 77  rsors returned w
0950: 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ill have been op
0960: 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  ened for writing
0970: 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d  ..**.** aiCur[0]
0980: 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62 6f   and aiCur[1] bo
0990: 74 68 20 67 65 74 20 2d 31 20 69 66 20 74 68 65  th get -1 if the
09a0: 20 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f   where-clause lo
09b0: 67 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65  gic is.** unable
09c0: 20 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45 50   to use the ONEP
09d0: 41 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ASS optimization
09e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
09f0: 57 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57  WhereOkOnePass(W
0a00: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
0a10: 2c 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20  , int *aiCur){. 
0a20: 20 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20 70   memcpy(aiCur, p
0a30: 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
0a40: 61 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  ass, sizeof(int)
0a50: 2a 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57  *2);.  return pW
0a60: 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b  Info->okOnePass;
0a70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
0a80: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53  he content of pS
0a90: 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f  rc into pDest.*/
0aa0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
0ab0: 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72  reOrMove(WhereOr
0ac0: 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72  Set *pDest, Wher
0ad0: 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20  eOrSet *pSrc){. 
0ae0: 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63   pDest->n = pSrc
0af0: 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44  ->n;.  memcpy(pD
0b00: 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c  est->a, pSrc->a,
0b10: 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66   pDest->n*sizeof
0b20: 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pDest->a[0]));.
0b30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
0b40: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65  insert a new pre
0b50: 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65  requisite/cost e
0b60: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68  ntry into the Wh
0b70: 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a  ereOrSet pSet..*
0b80: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74  *.** The new ent
0b90: 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ry might overwri
0ba0: 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  te an existing e
0bb0: 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  ntry, or it migh
0bc0: 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64  t be.** appended
0bd0: 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  , or it might be
0be0: 20 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20   discarded.  Do 
0bf0: 77 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20  whatever is the 
0c00: 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73  right thing.** s
0c10: 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70  o that pSet keep
0c20: 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20  s the N_OR_COST 
0c30: 62 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65  best entries see
0c40: 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61  n so far..*/.sta
0c50: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49  tic int whereOrI
0c60: 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72  nsert(.  WhereOr
0c70: 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20  Set *pSet,      
0c80: 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65  /* The WhereOrSe
0c90: 74 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  t to be updated 
0ca0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
0cb0: 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  req,        /* P
0cc0: 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20  rerequisites of 
0cd0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
0ce0: 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20  .  LogEst rRun, 
0cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e            /* Run
0d00: 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77  -cost of the new
0d10: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
0d20: 73 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20  st nOut         
0d30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0d40: 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20  outputs for the 
0d50: 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a  new entry */.){.
0d60: 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65    u16 i;.  Where
0d70: 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72  OrCost *p;.  for
0d80: 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53  (i=pSet->n, p=pS
0d90: 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  et->a; i>0; i--,
0da0: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72   p++){.    if( r
0db0: 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20  Run<=p->rRun && 
0dc0: 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65  (prereq & p->pre
0dd0: 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a  req)==prereq ){.
0de0: 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
0df0: 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20  OrInsert_done;. 
0e00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
0e10: 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70  rRun<=rRun && (p
0e20: 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65  ->prereq & prere
0e30: 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b  q)==p->prereq ){
0e40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
0e50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
0e60: 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f   pSet->n<N_OR_CO
0e70: 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  ST ){.    p = &p
0e80: 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b  Set->a[pSet->n++
0e90: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d  ];.    p->nOut =
0ea0: 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nOut;.  }else{.
0eb0: 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b      p = pSet->a;
0ec0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
0ed0: 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  pSet->n; i++){. 
0ee0: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e       if( p->rRun
0ef0: 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e  >pSet->a[i].rRun
0f00: 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b   ) p = pSet->a +
0f10: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
0f20: 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20  ( p->rRun<=rRun 
0f30: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
0f40: 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f  whereOrInsert_do
0f50: 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20  ne:.  p->prereq 
0f60: 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72  = prereq;.  p->r
0f70: 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66  Run = rRun;.  if
0f80: 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  ( p->nOut>nOut )
0f90: 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b   p->nOut = nOut;
0fa0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
0fb0: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
0fc0: 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
0fd0: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
0fe0: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
0ff0: 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73   void whereClaus
1000: 65 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c  eInit(.  WhereCl
1010: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
1020: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c    /* The WhereCl
1030: 61 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69  ause to be initi
1040: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alized */.  Wher
1050: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20  eInfo *pWInfo   
1060: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
1070: 45 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e  E processing con
1080: 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43  text */.){.  pWC
1090: 2d 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66  ->pWInfo = pWInf
10a0: 6f 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72  o;.  pWC->pOuter
10b0: 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65   = 0;.  pWC->nTe
10c0: 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e  rm = 0;.  pWC->n
10d0: 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65  Slot = ArraySize
10e0: 28 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a  (pWC->aStatic);.
10f0: 20 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e    pWC->a = pWC->
1100: 61 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46  aStatic;.}../* F
1110: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1120: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
1130: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
1140: 28 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a  (WhereClause*);.
1150: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
1160: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
1170: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57  ociated with a W
1180: 68 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63  hereOrInfo objec
1190: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
11a0: 64 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c  d whereOrInfoDel
11b0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
11c0: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29   WhereOrInfo *p)
11d0: 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43  {.  whereClauseC
11e0: 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20  lear(&p->wc);.  
11f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1200: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  , p);.}../*.** D
1210: 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65  eallocate all me
1220: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
1230: 77 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49  with a WhereAndI
1240: 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  nfo object..*/.s
1250: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
1260: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71  AndInfoDelete(sq
1270: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
1280: 41 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77  AndInfo *p){.  w
1290: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
12a0: 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74  &p->wc);.  sqlit
12b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
12c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
12d0: 63 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75  cate a WhereClau
12e0: 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  se structure.  T
12f0: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
1300: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65  tructure.** itse
1310: 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e  lf is not freed.
1320: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
1330: 73 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66  s the inverse of
1340: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
1350: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
1360: 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  id whereClauseCl
1370: 65 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20  ear(WhereClause 
1380: 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  *pWC){.  int i;.
1390: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a    WhereTerm *a;.
13a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
13b0: 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61  pWC->pWInfo->pPa
13c0: 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69  rse->db;.  for(i
13d0: 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61  =pWC->nTerm-1, a
13e0: 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69  =pWC->a; i>=0; i
13f0: 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66  --, a++){.    if
1400: 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  ( a->wtFlags & T
1410: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ERM_DYNAMIC ){. 
1420: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1430: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45  Delete(db, a->pE
1440: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xpr);.    }.    
1450: 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26  if( a->wtFlags &
1460: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a   TERM_ORINFO ){.
1470: 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66        whereOrInf
1480: 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75  oDelete(db, a->u
1490: 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  .pOrInfo);.    }
14a0: 65 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c  else if( a->wtFl
14b0: 61 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e  ags & TERM_ANDIN
14c0: 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72  FO ){.      wher
14d0: 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64  eAndInfoDelete(d
14e0: 62 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  b, a->u.pAndInfo
14f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
1500: 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e  f( pWC->a!=pWC->
1510: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73  aStatic ){.    s
1520: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1530: 20 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a   pWC->a);.  }.}.
1540: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e  ./*.** Add a sin
1550: 67 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72  gle new WhereTer
1560: 6d 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57  m entry to the W
1570: 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63  hereClause objec
1580: 74 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65  t pWC..** The ne
1590: 77 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65  w WhereTerm obje
15a0: 63 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65  ct is constructe
15b0: 64 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e  d from Expr p an
15c0: 64 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a  d with wtFlags..
15d0: 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20  ** The index in 
15e0: 70 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  pWC->a[] of the 
15f0: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73  new WhereTerm is
1600: 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
1610: 63 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65  cess..** 0 is re
1620: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65  turned if the ne
1630: 77 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c  w WhereTerm coul
1640: 64 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64  d not be added d
1650: 75 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a  ue to a memory.*
1660: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  * allocation err
1670: 6f 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20  or.  The memory 
1680: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75  allocation failu
1690: 72 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72  re will be recor
16a0: 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62  ded in.** the db
16b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
16c0: 6c 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68  lag so that high
16d0: 65 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f  er-level functio
16e0: 6e 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74  ns can detect it
16f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1700: 74 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61  tine will increa
1710: 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
1720: 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61  he pWC->a[] arra
1730: 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  y as necessary..
1740: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46  **.** If the wtF
1750: 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e  lags argument in
1760: 63 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41  cludes TERM_DYNA
1770: 4d 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e  MIC, then respon
1780: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20  sibility.** for 
1790: 66 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72  freeing the expr
17a0: 65 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75  ession p is assu
17b0: 6d 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65  med by the Where
17c0: 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57  Clause object pW
17d0: 43 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72  C..** This is tr
17e0: 75 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20  ue even if this 
17f0: 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f  routine fails to
1800: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
1810: 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a  WhereTerm..**.**
1820: 20 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20   WARNING:  This 
1830: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65  routine might re
1840: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61  allocate the spa
1850: 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ce used to store
1860: 0a 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20  .** WhereTerms. 
1870: 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f   All pointers to
1880: 20 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75   WhereTerms shou
1890: 6c 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  ld be invalidate
18a0: 64 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69  d after.** calli
18b0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
18c0: 20 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20    Such pointers 
18d0: 6d 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c  may be reinitial
18e0: 69 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63  ized by referenc
18f0: 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e  ing.** the pWC->
1900: 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  a[] array..*/.st
1910: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c  atic int whereCl
1920: 61 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65  auseInsert(Where
1930: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70  Clause *pWC, Exp
1940: 72 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73  r *p, u8 wtFlags
1950: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
1960: 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78  pTerm;.  int idx
1970: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74  ;.  testcase( wt
1980: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1990: 54 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57  TUAL );.  if( pW
19a0: 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e  C->nTerm>=pWC->n
19b0: 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72  Slot ){.    Wher
19c0: 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57  eTerm *pOld = pW
19d0: 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65  C->a;.    sqlite
19e0: 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49  3 *db = pWC->pWI
19f0: 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
1a00: 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71  .    pWC->a = sq
1a10: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1a20: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  (db, sizeof(pWC-
1a30: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f  >a[0])*pWC->nSlo
1a40: 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  t*2 );.    if( p
1a50: 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  WC->a==0 ){.    
1a60: 20 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20    if( wtFlags & 
1a70: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
1a80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a90: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29  xprDelete(db, p)
1aa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ab0: 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20  pWC->a = pOld;. 
1ac0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1ad0: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
1ae0: 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69  pWC->a, pOld, si
1af0: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
1b00: 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  pWC->nTerm);.   
1b10: 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e   if( pOld!=pWC->
1b20: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  aStatic ){.     
1b30: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1b40: 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a  b, pOld);.    }.
1b50: 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d      pWC->nSlot =
1b60: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1b70: 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Size(db, pWC->a)
1b80: 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30  /sizeof(pWC->a[0
1b90: 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20  ]);.  }.  pTerm 
1ba0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20  = &pWC->a[idx = 
1bb0: 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20  pWC->nTerm++];. 
1bc0: 20 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61   if( p && ExprHa
1bd0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
1be0: 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20  Unlikely) ){.   
1bf0: 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
1c00: 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  b = sqlite3LogEs
1c10: 74 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 39  t(p->iTable) - 9
1c20: 39 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  9;.  }else{.    
1c30: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c40: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 70 54 65   = -1;.  }.  pTe
1c50: 72 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69  rm->pExpr = sqli
1c60: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
1c70: 74 65 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e  te(p);.  pTerm->
1c80: 77 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67  wtFlags = wtFlag
1c90: 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20  s;.  pTerm->pWC 
1ca0: 3d 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e  = pWC;.  pTerm->
1cb0: 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20  iParent = -1;.  
1cc0: 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f  return idx;.}../
1cd0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1ce0: 65 20 69 64 65 6e 74 69 66 69 65 73 20 73 75 62  e identifies sub
1cf0: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
1d00: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1d10: 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75  where.** each su
1d20: 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
1d30: 65 70 61 72 61 74 65 64 20 62 79 20 74 68 65 20  eparated by the 
1d40: 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  AND operator or 
1d50: 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70  some other.** op
1d60: 65 72 61 74 6f 72 20 73 70 65 63 69 66 69 65 64  erator specified
1d70: 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d   in the op param
1d80: 65 74 65 72 2e 20 20 54 68 65 20 57 68 65 72 65  eter.  The Where
1d90: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
1da0: 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69  .** is filled wi
1db0: 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73  th pointers to s
1dc0: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  ubexpressions.  
1dd0: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
1de0: 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d  **    WHERE  a==
1df0: 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c  'hello' AND coal
1e00: 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e  esce(b,11)<10 AN
1e10: 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d  D (c+12!=d OR c=
1e20: 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =22).**         
1e30: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20    \________/    
1e40: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
1e50: 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  _/     \________
1e60: 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
1e70: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20          slot[0] 
1e80: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
1e90: 31 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1]              
1ea0: 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54   slot[2].**.** T
1eb0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52  he original WHER
1ec0: 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70  E clause in pExp
1ed0: 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20  r is unaltered. 
1ee0: 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e   All this routin
1ef0: 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b  e.** does is mak
1f00: 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73  e slot[] entries
1f10: 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72   point to substr
1f20: 75 63 74 75 72 65 20 77 69 74 68 69 6e 20 70 45  ucture within pE
1f30: 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  xpr..**.** In th
1f40: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
1f50: 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64  nce and in the d
1f60: 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22  iagram, "slot[]"
1f70: 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68   refers to.** th
1f80: 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b  e WhereClause.a[
1f90: 5d 20 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c  ] array.  The sl
1fa0: 6f 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73  ot[] array grows
1fb0: 20 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f   as needed to co
1fc0: 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72  ntain.** all ter
1fd0: 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
1fe0: 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  clause..*/.stati
1ff0: 63 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69  c void whereSpli
2000: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
2010: 57 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  WC, Expr *pExpr,
2020: 20 75 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e   u8 op){.  pWC->
2030: 6f 70 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70  op = op;.  if( p
2040: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
2050: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
2060: 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65  p!=op ){.    whe
2070: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
2080: 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  WC, pExpr, 0);. 
2090: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72   }else{.    wher
20a0: 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70  eSplit(pWC, pExp
20b0: 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20  r->pLeft, op);. 
20c0: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57     whereSplit(pW
20d0: 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  C, pExpr->pRight
20e0: 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  , op);.  }.}../*
20f0: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
2100: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62   WhereMaskSet ob
2110: 6a 65 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ject.*/.#define 
2120: 69 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20  initMaskSet(P)  
2130: 28 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20  (P)->n=0../*.** 
2140: 52 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61  Return the bitma
2150: 73 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  sk for the given
2160: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20   cursor number. 
2170: 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20   Return 0 if.** 
2180: 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69  iCursor is not i
2190: 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74  n the set..*/.st
21a0: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74  atic Bitmask get
21b0: 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65  Mask(WhereMaskSe
21c0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74  t *pMaskSet, int
21d0: 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74   iCursor){.  int
21e0: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   i;.  assert( pM
21f0: 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29  askSet->n<=(int)
2200: 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a  sizeof(Bitmask)*
2210: 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  8 );.  for(i=0; 
2220: 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69  i<pMaskSet->n; i
2230: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61  ++){.    if( pMa
2240: 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43  skSet->ix[i]==iC
2250: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72  ursor ){.      r
2260: 65 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29  eturn MASKBIT(i)
2270: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2280: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2290: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61   Create a new ma
22a0: 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43  sk for cursor iC
22b0: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
22c0: 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72  re is one cursor
22d0: 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68   per table in th
22e0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
22f0: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  The number of.**
2300: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
2310: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
2320: 6d 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20  mited by a test 
2330: 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20  early in the.** 
2340: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2350: 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f  n() routine.  So
2360: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
2370: 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d  e pMaskSet->ix[]
2380: 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e  .** array will n
2390: 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a  ever overflow..*
23a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72  /.static void cr
23b0: 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61  eateMask(WhereMa
23c0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
23d0: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
23e0: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
23f0: 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65  t->n < ArraySize
2400: 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29  (pMaskSet->ix) )
2410: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  ;.  pMaskSet->ix
2420: 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20  [pMaskSet->n++] 
2430: 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a  = iCursor;.}../*
2440: 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
2450: 65 73 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69  es walk (recursi
2460: 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73  vely) an express
2470: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e  ion tree and gen
2480: 65 72 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61  erate.** a bitma
2490: 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68  sk indicating wh
24a0: 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75  ich tables are u
24b0: 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72  sed in that expr
24c0: 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a  ession.** tree..
24d0: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
24e0: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
24f0: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
2500: 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  t*, ExprList*);.
2510: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
2520: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
2530: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
2540: 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61  *, Select*);.sta
2550: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
2560: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
2570: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
2580: 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42  t, Expr *p){.  B
2590: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
25a0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
25b0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
25c0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
25d0: 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74  {.    mask = get
25e0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
25f0: 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72  ->iTable);.    r
2600: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a  eturn mask;.  }.
2610: 20 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62    mask = exprTab
2620: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2630: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
2640: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
2650: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2660: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66   p->pLeft);.  if
2670: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
2680: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
2690: 74 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c  t) ){.    mask |
26a0: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
26b0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
26c0: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a   p->x.pSelect);.
26d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73    }else{.    mas
26e0: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
26f0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2700: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  , p->x.pList);. 
2710: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
2720: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
2730: 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  sk exprListTable
2740: 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53  Usage(WhereMaskS
2750: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78  et *pMaskSet, Ex
2760: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
2770: 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61    int i;.  Bitma
2780: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69  sk mask = 0;.  i
2790: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
27a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
27b0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
27c0: 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70       mask |= exp
27d0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
27e0: 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  kSet, pList->a[i
27f0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ].pExpr);.    }.
2800: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73    }.  return mas
2810: 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d  k;.}.static Bitm
2820: 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61  ask exprSelectTa
2830: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
2840: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
2850: 20 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20   Select *pS){.  
2860: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30  Bitmask mask = 0
2870: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b  ;.  while( pS ){
2880: 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
2890: 72 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  rc = pS->pSrc;. 
28a0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
28b0: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
28c0: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69  askSet, pS->pELi
28d0: 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  st);.    mask |=
28e0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
28f0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
2900: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
2910: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
2920: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
2930: 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72  kSet, pS->pOrder
2940: 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  By);.    mask |=
2950: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
2960: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57  pMaskSet, pS->pW
2970: 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20  here);.    mask 
2980: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
2990: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
29a0: 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66  pHaving);.    if
29b0: 28 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30  ( ALWAYS(pSrc!=0
29c0: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
29d0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
29e0: 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69   i<pSrc->nSrc; i
29f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73  ++){.        mas
2a00: 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54  k |= exprSelectT
2a10: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2a20: 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  et, pSrc->a[i].p
2a30: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
2a40: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
2a50: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2a60: 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e  , pSrc->a[i].pOn
2a70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2a80: 0a 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50  .    pS = pS->pP
2a90: 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rior;.  }.  retu
2aa0: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn mask;.}../*.*
2ab0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
2ac0: 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61   the given opera
2ad0: 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  tor is one of th
2ae0: 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  e operators that
2af0: 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66   is.** allowed f
2b00: 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20  or an indexable 
2b10: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
2b20: 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20  m.  The allowed 
2b30: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a  operators are.**
2b40: 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20   "=", "<", ">", 
2b50: 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22  "<=", ">=", "IN"
2b60: 2c 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a  , and "IS NULL".
2b70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
2b80: 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b  lowedOp(int op){
2b90: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54  .  assert( TK_GT
2ba0: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c  >TK_EQ && TK_GT<
2bb0: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
2bc0: 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26  t( TK_LT>TK_EQ &
2bd0: 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b  & TK_LT<TK_GE );
2be0: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45  .  assert( TK_LE
2bf0: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c  >TK_EQ && TK_LE<
2c00: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
2c10: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b  t( TK_GE==TK_EQ+
2c20: 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70  4 );.  return op
2c30: 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d  ==TK_IN || (op>=
2c40: 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f  TK_EQ && op<=TK_
2c50: 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53  GE) || op==TK_IS
2c60: 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  NULL;.}../*.** S
2c70: 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20  wap two objects 
2c80: 6f 66 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f  of type TYPE..*/
2c90: 0a 23 64 65 66 69 6e 65 20 53 57 41 50 28 54 59  .#define SWAP(TY
2ca0: 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d  PE,A,B) {TYPE t=
2cb0: 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f  A; A=B; B=t;}../
2cc0: 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63  *.** Commute a c
2cd0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
2ce0: 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73  or.  Expressions
2cf0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
2d00: 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e  op Y".** are con
2d10: 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f  verted into "Y o
2d20: 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c  p X"..**.** If l
2d30: 65 66 74 2f 72 69 67 68 74 20 70 72 65 63 65 64  eft/right preced
2d40: 65 6e 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20  ence rules come 
2d50: 69 6e 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64  into play when d
2d60: 65 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a  etermining the.*
2d70: 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * collating sequ
2d80: 65 6e 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c 41  ence, then COLLA
2d90: 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65  TE operators are
2da0: 20 61 64 6a 75 73 74 65 64 20 74 6f 20 65 6e 73   adjusted to ens
2db0: 75 72 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ure.** that the 
2dc0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
2dd0: 63 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e  ce does not chan
2de0: 67 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ge.  For example
2df0: 3a 0a 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65 20  :.** "Y collate 
2e00: 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62 65 63  NOCASE op X" bec
2e10: 6f 6d 65 73 20 22 58 20 6f 70 20 59 22 20 62 65  omes "X op Y" be
2e20: 63 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74  cause any collat
2e30: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a  ion sequence on.
2e40: 2a 2a 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64  ** the left hand
2e50: 20 73 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61   side of a compa
2e60: 72 69 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  rison overrides 
2e70: 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  any collation se
2e80: 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63  quence .** attac
2e90: 68 65 64 20 74 6f 20 74 68 65 20 72 69 67 68 74  hed to the right
2ea0: 2e 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72  . For the same r
2eb0: 65 61 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c  eason the EP_Col
2ec0: 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20  late flag.** is 
2ed0: 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f  not commuted..*/
2ee0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
2ef0: 72 43 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a  rCommute(Parse *
2f00: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
2f10: 78 70 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52  xpr){.  u16 expR
2f20: 69 67 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70  ight = (pExpr->p
2f30: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
2f40: 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31  P_Collate);.  u1
2f50: 36 20 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78  6 expLeft = (pEx
2f60: 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73  pr->pLeft->flags
2f70: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a   & EP_Collate);.
2f80: 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65    assert( allowe
2f90: 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26  dOp(pExpr->op) &
2fa0: 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  & pExpr->op!=TK_
2fb0: 49 4e 20 29 3b 0a 20 20 69 66 28 20 65 78 70 52  IN );.  if( expR
2fc0: 69 67 68 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b  ight==expLeft ){
2fd0: 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 58  .    /* Either X
2fe0: 20 61 6e 64 20 59 20 62 6f 74 68 20 68 61 76 65   and Y both have
2ff0: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
3000: 72 20 6f 72 20 6e 65 69 74 68 65 72 20 64 6f 20  r or neither do 
3010: 2a 2f 0a 20 20 20 20 69 66 28 20 65 78 70 52 69  */.    if( expRi
3020: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ght ){.      /* 
3030: 42 6f 74 68 20 58 20 61 6e 64 20 59 20 68 61 76  Both X and Y hav
3040: 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  e COLLATE operat
3050: 6f 72 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ors.  Make sure 
3060: 58 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20  X is always.    
3070: 20 20 2a 2a 20 75 73 65 64 20 62 79 20 63 6c 65    ** used by cle
3080: 61 72 69 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c  aring the EP_Col
3090: 6c 61 74 65 20 66 6c 61 67 20 66 72 6f 6d 20 59  late flag from Y
30a0: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72  . */.      pExpr
30b0: 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ->pRight->flags 
30c0: 26 3d 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a  &= ~EP_Collate;.
30d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
30e0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
30f0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
3100: 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20  pLeft)!=0 ){.   
3110: 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 58 20     /* Neither X 
3120: 6e 6f 72 20 59 20 68 61 76 65 20 43 4f 4c 4c 41  nor Y have COLLA
3130: 54 45 20 6f 70 65 72 61 74 6f 72 73 2c 20 62 75  TE operators, bu
3140: 74 20 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65  t X has a non-de
3150: 66 61 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63  fault.      ** c
3160: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
3170: 65 2e 20 20 53 6f 20 61 64 64 20 74 68 65 20 45  e.  So add the E
3180: 50 5f 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72  P_Collate marker
3190: 20 6f 6e 20 58 20 74 6f 20 63 61 75 73 65 0a 20   on X to cause. 
31a0: 20 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65       ** it to be
31b0: 20 73 65 61 72 63 68 65 64 20 66 69 72 73 74 2e   searched first.
31c0: 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
31d0: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d  >pLeft->flags |=
31e0: 20 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20   EP_Collate;.   
31f0: 20 7d 0a 20 20 7d 0a 20 20 53 57 41 50 28 45 78   }.  }.  SWAP(Ex
3200: 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68  pr*,pExpr->pRigh
3210: 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  t,pExpr->pLeft);
3220: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
3230: 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61  >=TK_GT ){.    a
3240: 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b  ssert( TK_LT==TK
3250: 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73  _GT+2 );.    ass
3260: 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c  ert( TK_GE==TK_L
3270: 45 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  E+2 );.    asser
3280: 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29  t( TK_GT>TK_EQ )
3290: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
32a0: 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  _GT<TK_LE );.   
32b0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
32c0: 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78  op>=TK_GT && pEx
32d0: 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b  pr->op<=TK_GE );
32e0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
32f0: 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f   ((pExpr->op-TK_
3300: 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20  GT)^2)+TK_GT;.  
3310: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  }.}../*.** Trans
3320: 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20  late from TK_xx 
3330: 6f 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78  operator to WO_x
3340: 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74  x bitmask..*/.st
3350: 61 74 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f  atic u16 operato
3360: 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20  rMask(int op){. 
3370: 20 75 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74   u16 c;.  assert
3380: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20  ( allowedOp(op) 
3390: 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
33a0: 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f  IN ){.    c = WO
33b0: 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _IN;.  }else if(
33c0: 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
33d0: 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e  {.    c = WO_ISN
33e0: 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
33f0: 20 20 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51    assert( (WO_EQ
3400: 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20  <<(op-TK_EQ)) < 
3410: 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20  0x7fff );.    c 
3420: 3d 20 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28  = (u16)(WO_EQ<<(
3430: 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a  op-TK_EQ));.  }.
3440: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
3450: 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f  _ISNULL || c==WO
3460: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73  _ISNULL );.  ass
3470: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c  ert( op!=TK_IN |
3480: 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20  | c==WO_IN );.  
3490: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45  assert( op!=TK_E
34a0: 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b  Q || c==WO_EQ );
34b0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
34c0: 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54  K_LT || c==WO_LT
34d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
34e0: 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f  !=TK_LE || c==WO
34f0: 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _LE );.  assert(
3500: 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d   op!=TK_GT || c=
3510: 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65  =WO_GT );.  asse
3520: 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c  rt( op!=TK_GE ||
3530: 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72   c==WO_GE );.  r
3540: 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn c;.}../*.*
3550: 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65  * Advance to the
3560: 20 6e 65 78 74 20 57 68 65 72 65 54 65 72 6d 20   next WhereTerm 
3570: 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 63 63  that matches acc
3580: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72  ording to the cr
3590: 69 74 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c  iteria.** establ
35a0: 69 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 70  ished when the p
35b0: 53 63 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20  Scan object was 
35c0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77  initialized by w
35d0: 68 65 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a  hereScanInit()..
35e0: 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
35f0: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  f there are no m
3600: 6f 72 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65  ore matching Whe
3610: 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74  reTerms..*/.stat
3620: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68  ic WhereTerm *wh
3630: 65 72 65 53 63 61 6e 4e 65 78 74 28 57 68 65 72  ereScanNext(Wher
3640: 65 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20  eScan *pScan){. 
3650: 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
3660: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
3670: 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f  sor on the LHS o
3680: 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20  f the term */.  
3690: 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  int iColumn;    
36a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75       /* The colu
36b0: 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66  mn on the LHS of
36c0: 20 74 68 65 20 74 65 72 6d 2e 20 20 2d 31 20 66   the term.  -1 f
36d0: 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72  or IPK */.  Expr
36e0: 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
36f0: 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f   /* An expressio
3700: 6e 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a  n being tested *
3710: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
3720: 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72  *pWC;    /* Shor
3730: 74 68 61 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d  thand for pScan-
3740: 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65 72 65 54  >pWC */.  WhereT
3750: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f  erm *pTerm;    /
3760: 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67  * The term being
3770: 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74   tested */.  int
3780: 20 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20   k = pScan->k;  
3790: 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74    /* Where to st
37a0: 61 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a  art scanning */.
37b0: 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d  .  while( pScan-
37c0: 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e  >iEquiv<=pScan->
37d0: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43  nEquiv ){.    iC
37e0: 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75  ur = pScan->aEqu
37f0: 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  iv[pScan->iEquiv
3800: 2d 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e  -2];.    iColumn
3810: 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76   = pScan->aEquiv
3820: 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31  [pScan->iEquiv-1
3830: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70  ];.    while( (p
3840: 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29  WC = pScan->pWC)
3850: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  !=0 ){.      for
3860: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b  (pTerm=pWC->a+k;
3870: 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b   k<pWC->nTerm; k
3880: 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
3890: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
38a0: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
38b0: 72 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 54  r.         && pT
38c0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
38d0: 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  n==iColumn.     
38e0: 20 20 20 20 26 26 20 28 70 53 63 61 6e 2d 3e 69      && (pScan->i
38f0: 45 71 75 69 76 3c 3d 32 20 7c 7c 20 21 45 78 70  Equiv<=2 || !Exp
3900: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
3910: 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
3920: 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 20  omJoin)).       
3930: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
3940: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
3950: 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21  tor & WO_EQUIV)!
3960: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
3970: 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41   pScan->nEquiv<A
3980: 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e  rraySize(pScan->
3990: 61 45 71 75 69 76 29 0a 20 20 20 20 20 20 20 20  aEquiv).        
39a0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
39b0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
39c0: 20 20 20 20 70 58 20 3d 20 73 71 6c 69 74 65 33      pX = sqlite3
39d0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
39e0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
39f0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
3a00: 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f     assert( pX->o
3a10: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
3a30: 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45  j=0; j<pScan->nE
3a40: 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20  quiv; j+=2){.   
3a50: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
3a60: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d  Scan->aEquiv[j]=
3a70: 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20  =pX->iTable.    
3a80: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 53             && pS
3a90: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d  can->aEquiv[j+1]
3aa0: 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  ==pX->iColumn ){
3ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3ac0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3ad0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3ae0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3af0: 20 20 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e      if( j==pScan
3b00: 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20  ->nEquiv ){.    
3b10: 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d            pScan-
3b20: 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58 2d  >aEquiv[j] = pX-
3b30: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
3b40: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45         pScan->aE
3b50: 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e  quiv[j+1] = pX->
3b60: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
3b70: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45         pScan->nE
3b80: 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20  quiv += 2;.     
3b90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3ba0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
3bb0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
3bc0: 61 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70  ator & pScan->op
3bd0: 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  Mask)!=0 ){.    
3be0: 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66          /* Verif
3bf0: 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 61  y the affinity a
3c00: 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nd collating seq
3c10: 75 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20  uence match */. 
3c20: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
3c30: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20  Scan->zCollName 
3c40: 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  && (pTerm->eOper
3c50: 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
3c60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
3c70: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
3c80: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
3c90: 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73      Parse *pPars
3ca0: 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d  e = pWC->pWInfo-
3cb0: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
3cc0: 20 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72         pX = pTer
3cd0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
3ce0: 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
3cf0: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
3d00: 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69  yOk(pX, pScan->i
3d10: 64 78 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20  dxaff) ){.      
3d20: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
3d30: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
3d40: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
3d50: 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65    assert(pX->pLe
3d60: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ft);.           
3d70: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
3d80: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
3d90: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20  ollSeq(pParse,. 
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e   pX->pLeft, pX->
3de0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
3df0: 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
3e00: 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50  ==0 ) pColl = pP
3e10: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
3e20: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
3e30: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
3e40: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
3e50: 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c  me, pScan->zColl
3e60: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
3e70: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
3e80: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
3e90: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
3ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
3eb0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3ec0: 6f 72 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20  or & WO_EQ)!=0. 
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
3ee0: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
3ef0: 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d  r->pRight)->op==
3f00: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
3f10: 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54         && pX->iT
3f20: 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71  able==pScan->aEq
3f30: 75 69 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20  uiv[0].         
3f40: 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75      && pX->iColu
3f50: 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69  mn==pScan->aEqui
3f60: 76 5b 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20  v[1].           
3f70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3f80: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
3f90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3fa0: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d        pScan->k =
3fb0: 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20   k+1;.          
3fc0: 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a    return pTerm;.
3fd0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3fe0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3ff0: 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d      pScan->pWC =
4000: 20 70 53 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75   pScan->pWC->pOu
4010: 74 65 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30  ter;.      k = 0
4020: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61  ;.    }.    pSca
4030: 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e  n->pWC = pScan->
4040: 70 4f 72 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d  pOrigWC;.    k =
4050: 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69   0;.    pScan->i
4060: 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a  Equiv += 2;.  }.
4070: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
4080: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
4090: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73  a WHERE clause s
40a0: 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20  canner object.  
40b0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
40c0: 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   to the.** first
40d0: 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20   match.  Return 
40e0: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
40f0: 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a  e no matches..**
4100: 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20  .** The scanner 
4110: 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e  will be searchin
4120: 67 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  g the WHERE clau
4130: 73 65 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c  se pWC.  It will
4140: 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72   look.** for ter
4150: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ms of the form "
4160: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77  X <op> <expr>" w
4170: 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e  here X is column
4180: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
4190: 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54 68 65 20  e.** iCur.  The 
41a0: 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65  <op> must be one
41b0: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
41c0: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 6f  s described by o
41d0: 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pMask..**.** If 
41e0: 74 68 65 20 73 65 61 72 63 68 20 69 73 20 66 6f  the search is fo
41f0: 72 20 58 20 61 6e 64 20 74 68 65 20 57 48 45 52  r X and the WHER
4200: 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
4210: 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  s terms of the.*
4220: 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20  * form X=Y then 
4230: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
4240: 68 74 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74  ht also return t
4250: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
4260: 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70  .** "Y <op> <exp
4270: 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  r>".  The number
4280: 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72   of levels of tr
4290: 61 6e 73 69 74 69 76 69 74 79 20 69 73 20 6c 69  ansitivity is li
42a0: 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73  mited,.** but is
42b0: 20 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c   enough to handl
42c0: 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20  e most commonly 
42d0: 6f 63 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74  occurring SQL st
42e0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
42f0: 49 66 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20  If X is not the 
4300: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
4310: 4b 45 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20  KEY then X must 
4320: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
4330: 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78  th.** index pIdx
4340: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
4350: 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e  eTerm *whereScan
4360: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53 63 61  Init(.  WhereSca
4370: 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20  n *pScan,       
4380: 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63 61 6e  /* The WhereScan
4390: 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e   object being in
43a0: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57  itialized */.  W
43b0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
43c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
43d0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
43e0: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e   scanned */.  in
43f0: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
4400: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
4410: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
4420: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
4430: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
4440: 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  mn to scan for *
4450: 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20  /.  u32 opMask, 
4460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4470: 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63  perator(s) to sc
4480: 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  an for */.  Inde
4490: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
44a0: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
44b0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
44c0: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a  his index */.){.
44d0: 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d    int j;..  /* m
44e0: 65 6d 73 65 74 28 70 53 63 61 6e 2c 20 30 2c 20  emset(pScan, 0, 
44f0: 73 69 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b  sizeof(*pScan));
4500: 20 2a 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72   */.  pScan->pOr
4510: 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53  igWC = pWC;.  pS
4520: 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a  can->pWC = pWC;.
4530: 20 20 69 66 28 20 70 49 64 78 20 26 26 20 69 43    if( pIdx && iC
4540: 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
4550: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20  pScan->idxaff = 
4560: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
4570: 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  ol[iColumn].affi
4580: 6e 69 74 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  nity;.    for(j=
4590: 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  0; pIdx->aiColum
45a0: 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a  n[j]!=iColumn; j
45b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4e  ++){.      if( N
45c0: 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 4b  EVER(j>=pIdx->nK
45d0: 65 79 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 20  eyCol) ) return 
45e0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63  0;.    }.    pSc
45f0: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20  an->zCollName = 
4600: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b  pIdx->azColl[j];
4610: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53  .  }else{.    pS
4620: 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b  can->idxaff = 0;
4630: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  .    pScan->zCol
4640: 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  lName = 0;.  }. 
4650: 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d   pScan->opMask =
4660: 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e   opMask;.  pScan
4670: 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e  ->k = 0;.  pScan
4680: 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d 20 69 43  ->aEquiv[0] = iC
4690: 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71  ur;.  pScan->aEq
46a0: 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e  uiv[1] = iColumn
46b0: 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69  ;.  pScan->nEqui
46c0: 76 20 3d 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e  v = 2;.  pScan->
46d0: 69 45 71 75 69 76 20 3d 20 32 3b 0a 20 20 72 65  iEquiv = 2;.  re
46e0: 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65  turn whereScanNe
46f0: 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a  xt(pScan);.}../*
4700: 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61  .** Search for a
4710: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
4720: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
4730: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
4740: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a   <op> <expr>".**
4750: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 72 65   where X is a re
4760: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69  ference to the i
4770: 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  Column of table 
4780: 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73  iCur and <op> is
4790: 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57   one of.** the W
47a0: 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f  O_xx operator co
47b0: 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62 79  des specified by
47c0: 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65   the op paramete
47d0: 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  r..** Return a p
47e0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65  ointer to the te
47f0: 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  rm.  Return 0 if
4800: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
4810: 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74 75 72  * The term retur
4820: 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59 3d 3c  ned might by Y=<
4830: 65 78 70 72 3e 20 69 66 20 74 68 65 72 65 20 69  expr> if there i
4840: 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72  s another constr
4850: 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57  aint in.** the W
4860: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
4870: 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20   specifies that 
4880: 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68 20 63  X=Y.  Any such c
4890: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
48a0: 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64  be.** identified
48b0: 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55 49 56   by the WO_EQUIV
48c0: 20 62 69 74 20 69 6e 20 74 68 65 20 70 54 65 72   bit in the pTer
48d0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66 69 65  m->eOperator fie
48e0: 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45 71 75  ld.  The.** aEqu
48f0: 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64 73  iv[] array holds
4900: 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65   X and all its e
4910: 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69 74 68  quivalents, with
4920: 20 65 61 63 68 20 53 51 4c 20 76 61 72 69 61 62   each SQL variab
4930: 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20  le.** taking up 
4940: 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61 45 71  two slots in aEq
4950: 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69 72 73  uiv[].  The firs
4960: 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20 74 68  t slot is for th
4970: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a  e cursor number.
4980: 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  ** and the secon
4990: 64 20 69 73 20 66 6f 72 20 74 68 65 20 63 6f 6c  d is for the col
49a0: 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  umn number.  The
49b0: 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74 73 20  re are 22 slots 
49c0: 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73  in aEquiv[].** s
49d0: 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  o that means we 
49e0: 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70  can look for X p
49f0: 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f 74 68  lus up to 10 oth
4a00: 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61  er equivalent va
4a10: 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61  lues..** Hence a
4a20: 20 73 65 61 72 63 68 20 66 6f 72 20 58 20 77 69   search for X wi
4a30: 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e  ll return <expr>
4a40: 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41 31 3d   if X=A1 and A1=
4a50: 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20  A2 and A2=A3.** 
4a60: 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41  and ... and A9=A
4a70: 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72  10 and A10=<expr
4a80: 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  >..**.** If ther
4a90: 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74  e are multiple t
4aa0: 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
4ab0: 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
4ac0: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
4ad0: 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79  pr>".** then try
4ae0: 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74   for the one wit
4af0: 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65  h no dependencie
4b00: 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e  s on <expr> - in
4b10: 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77 68 65   other words whe
4b20: 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20  re.** <expr> is 
4b30: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
4b40: 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69  ssion of some ki
4b50: 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e  nd.  Only return
4b60: 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74   entries of.** t
4b70: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
4b80: 59 22 20 77 68 65 72 65 20 59 20 69 73 20 61 20  Y" where Y is a 
4b90: 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65  column in anothe
4ba0: 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65  r table if no te
4bb0: 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f  rms of.** the fo
4bc0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73  rm "X <op> <cons
4bd0: 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20  t-expr>" exist. 
4be0: 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69    If no terms wi
4bf0: 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48  th a constant RH
4c00: 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20  S.** exist, try 
4c10: 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d  to return a term
4c20: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75   that does not u
4c30: 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a  se WO_EQUIV..*/.
4c40: 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72 6d  static WhereTerm
4c50: 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68   *findTerm(.  Wh
4c60: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
4c70: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
4c80: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65   clause to be se
4c90: 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20  arched */.  int 
4ca0: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
4cb0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
4cc0: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69  er of LHS */.  i
4cd0: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
4ce0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
4cf0: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
4d00: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
4d10: 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d  dy,     /* RHS m
4d20: 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20  ust not overlap 
4d30: 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a  with this mask *
4d40: 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20  /.  u32 op,     
4d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
4d60: 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65  k of WO_xx value
4d70: 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65  s describing ope
4d80: 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78  rator */.  Index
4d90: 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
4da0: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
4db0: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
4dc0: 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e   index, if not N
4dd0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ULL */.){.  Wher
4de0: 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d  eTerm *pResult =
4df0: 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   0;.  WhereTerm 
4e00: 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20  *p;.  WhereScan 
4e10: 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65  scan;..  p = whe
4e20: 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
4e30: 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f  , pWC, iCur, iCo
4e40: 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b  lumn, op, pIdx);
4e50: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
4e60: 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
4e70: 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64  qRight & notRead
4e80: 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  y)==0 ){.      i
4e90: 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69 67 68  f( p->prereqRigh
4ea0: 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70 65  t==0 && (p->eOpe
4eb0: 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20  rator&WO_EQ)!=0 
4ec0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
4ed0: 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n p;.      }.   
4ee0: 20 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d     if( pResult==
4ef0: 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b  0 ) pResult = p;
4f00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77  .    }.    p = w
4f10: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63  hereScanNext(&sc
4f20: 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  an);.  }.  retur
4f30: 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a  n pResult;.}../*
4f40: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
4f50: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
4f60: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72  d exprAnalyze(Sr
4f70: 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61  cList*, WhereCla
4f80: 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  use*, int);../*.
4f90: 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c  ** Call exprAnal
4fa0: 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  yze on all terms
4fb0: 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
4fc0: 73 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  se.  .*/.static 
4fd0: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
4fe0: 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  All(.  SrcList *
4ff0: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
5000: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
5010: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
5020: 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 20 20  use *pWC        
5030: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
5040: 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79  ause to be analy
5050: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  zed */.){.  int 
5060: 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  i;.  for(i=pWC->
5070: 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  nTerm-1; i>=0; i
5080: 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61  --){.    exprAna
5090: 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70  lyze(pTabList, p
50a0: 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  WC, i);.  }.}..#
50b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
50c0: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
50d0: 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  TION./*.** Check
50e0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67   to see if the g
50f0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
5100: 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f  is a LIKE or GLO
5110: 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a  B operator that.
5120: 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69  ** can be optimi
5130: 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61  zed using inequa
5140: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
5150: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
5160: 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e  f it is.** so an
5170: 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  d false if not..
5180: 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66  **.** In order f
5190: 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  or the operator 
51a0: 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c  to be optimizibl
51b0: 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74 20  e, the RHS must 
51c0: 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c  be a string.** l
51d0: 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73  iteral that does
51e0: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
51f0: 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f  a wildcard.  .*/
5200: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69  .static int isLi
5210: 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73  keOrGlob(.  Pars
5220: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
5230: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
5240: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
5250: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
5260: 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
5270: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
5280: 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  ion */.  Expr **
5290: 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f  ppPrefix,  /* Po
52a0: 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49  inter to TK_STRI
52b0: 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  NG expression wi
52c0: 74 68 20 70 61 74 74 65 72 6e 20 70 72 65 66 69  th pattern prefi
52d0: 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43  x */.  int *pisC
52e0: 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65  omplete, /* True
52f0: 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c   if the only wil
5300: 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74 68  dcard is % in th
5310: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
5320: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61   */.  int *pnoCa
5330: 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  se      /* True 
5340: 69 66 20 75 70 70 65 72 63 61 73 65 20 69 73 20  if uppercase is 
5350: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f  equivalent to lo
5360: 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20  wercase */.){.  
5370: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
5380: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  0;         /* St
5390: 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c  ring on RHS of L
53a0: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
53b0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
53c0: 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20  *pLeft;      /* 
53d0: 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73  Right and left s
53e0: 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72  ize of LIKE oper
53f0: 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ator */.  ExprLi
5400: 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  st *pList;      
5410: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
5420: 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20  operands to the 
5430: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
5440: 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20  .  int c;       
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5460: 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20 69   One character i
5470: 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63  n z[] */.  int c
5480: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
5490: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
54a0: 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20  of non-wildcard 
54b0: 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72  prefix character
54c0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33  s */.  char wc[3
54d0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
54e0: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68    /* Wildcard ch
54f0: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71  aracters */.  sq
5500: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
5510: 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
5520: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
5530: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
5540: 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20  ue *pVal = 0;.  
5550: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
5560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
5570: 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a  code of pRight *
5580: 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  /..  if( !sqlite
5590: 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28  3IsLikeFunction(
55a0: 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61  db, pExpr, pnoCa
55b0: 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72  se, wc) ){.    r
55c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66  eturn 0;.  }.#if
55d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49  def SQLITE_EBCDI
55e0: 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65  C.  if( *pnoCase
55f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
5600: 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45  dif.  pList = pE
5610: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
5620: 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61  pLeft = pList->a
5630: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [1].pExpr;.  if(
5640: 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43   pLeft->op!=TK_C
5650: 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c  OLUMN .   || sql
5660: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
5670: 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f  (pLeft)!=SQLITE_
5680: 41 46 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20  AFF_TEXT .   || 
5690: 49 73 56 69 72 74 75 61 6c 28 70 4c 65 66 74 2d  IsVirtual(pLeft-
56a0: 3e 70 54 61 62 29 0a 20 20 29 7b 0a 20 20 20 20  >pTab).  ){.    
56b0: 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d  /* IMP: R-02065-
56c0: 34 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68  49465 The left-h
56d0: 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
56e0: 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65  LIKE or GLOB ope
56f0: 72 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a  rator must.    *
5700: 2a 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  * be the name of
5710: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
5720: 6d 6e 20 77 69 74 68 20 54 45 58 54 20 61 66 66  mn with TEXT aff
5730: 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65  inity. */.    re
5740: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73  turn 0;.  }.  as
5750: 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f  sert( pLeft->iCo
5760: 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a  lumn!=(-1) ); /*
5770: 20 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76   Because IPK nev
5780: 65 72 20 68 61 73 20 41 46 46 5f 54 45 58 54 20  er has AFF_TEXT 
5790: 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 73  */..  pRight = s
57a0: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
57b0: 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 30  llate(pList->a[0
57c0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 6f 70 20 3d  ].pExpr);.  op =
57d0: 20 70 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69   pRight->op;.  i
57e0: 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42  f( op==TK_VARIAB
57f0: 4c 45 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  LE ){.    Vdbe *
5800: 70 52 65 70 72 65 70 61 72 65 20 3d 20 70 50 61  pReprepare = pPa
5810: 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 3b  rse->pReprepare;
5820: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  .    int iCol = 
5830: 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b  pRight->iColumn;
5840: 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  .    pVal = sqli
5850: 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56  te3VdbeGetBoundV
5860: 61 6c 75 65 28 70 52 65 70 72 65 70 61 72 65 2c  alue(pReprepare,
5870: 20 69 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46   iCol, SQLITE_AF
5880: 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28  F_NONE);.    if(
5890: 20 70 56 61 6c 20 26 26 20 73 71 6c 69 74 65 33   pVal && sqlite3
58a0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c  _value_type(pVal
58b0: 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29  )==SQLITE_TEXT )
58c0: 7b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61  {.      z = (cha
58d0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  r *)sqlite3_valu
58e0: 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a 20 20  e_text(pVal);.  
58f0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
5900: 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50  dbeSetVarmask(pP
5910: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f  arse->pVdbe, iCo
5920: 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
5930: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56  pRight->op==TK_V
5940: 41 52 49 41 42 4c 45 20 7c 7c 20 70 52 69 67 68  ARIABLE || pRigh
5950: 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  t->op==TK_REGIST
5960: 45 52 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ER );.  }else if
5970: 28 20 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20  ( op==TK_STRING 
5980: 29 7b 0a 20 20 20 20 7a 20 3d 20 70 52 69 67 68  ){.    z = pRigh
5990: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d  t->u.zToken;.  }
59a0: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
59b0: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  cnt = 0;.    whi
59c0: 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d  le( (c=z[cnt])!=
59d0: 30 20 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26  0 && c!=wc[0] &&
59e0: 20 63 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d   c!=wc[1] && c!=
59f0: 77 63 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20 63  wc[2] ){.      c
5a00: 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt++;.    }.    
5a10: 69 66 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35  if( cnt!=0 && 25
5a20: 35 21 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20  5!=(u8)z[cnt-1] 
5a30: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
5a40: 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70  Prefix;.      *p
5a50: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d  isComplete = c==
5a60: 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31  wc[0] && z[cnt+1
5a70: 5d 3d 3d 30 3b 0a 20 20 20 20 20 20 70 50 72 65  ]==0;.      pPre
5a80: 66 69 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70  fix = sqlite3Exp
5a90: 72 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c  r(db, TK_STRING,
5aa0: 20 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   z);.      if( p
5ab0: 50 72 65 66 69 78 20 29 20 70 50 72 65 66 69 78  Prefix ) pPrefix
5ac0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20  ->u.zToken[cnt] 
5ad0: 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70 70 50 72  = 0;.      *ppPr
5ae0: 65 66 69 78 20 3d 20 70 50 72 65 66 69 78 3b 0a  efix = pPrefix;.
5af0: 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b        if( op==TK
5b00: 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20  _VARIABLE ){.   
5b10: 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70       Vdbe *v = p
5b20: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
5b30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5b40: 65 53 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 70  eSetVarmask(v, p
5b50: 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  Right->iColumn);
5b60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 69  .        if( *pi
5b70: 73 43 6f 6d 70 6c 65 74 65 20 26 26 20 70 52 69  sComplete && pRi
5b80: 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d  ght->u.zToken[1]
5b90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
5ba0: 20 49 66 20 74 68 65 20 72 68 73 20 6f 66 20 74   If the rhs of t
5bb0: 68 65 20 4c 49 4b 45 20 65 78 70 72 65 73 73 69  he LIKE expressi
5bc0: 6f 6e 20 69 73 20 61 20 76 61 72 69 61 62 6c 65  on is a variable
5bd0: 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
5be0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76  t.          ** v
5bf0: 61 6c 75 65 20 6f 66 20 74 68 65 20 76 61 72 69  alue of the vari
5c00: 61 62 6c 65 20 6d 65 61 6e 73 20 74 68 65 72 65  able means there
5c10: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69   is no need to i
5c20: 6e 76 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20  nvoke the LIKE. 
5c30: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63           ** func
5c40: 74 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50  tion, then no OP
5c50: 5f 56 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62  _Variable will b
5c60: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70  e added to the p
5c70: 72 6f 67 72 61 6d 2e 0a 20 20 20 20 20 20 20 20  rogram..        
5c80: 20 20 2a 2a 20 54 68 69 73 20 63 61 75 73 65 73    ** This causes
5c90: 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68   problems for th
5ca0: 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  e sqlite3_bind_p
5cb0: 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a  arameter_name().
5cc0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 50 49            ** API
5cd0: 2e 20 54 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20  . To workaround 
5ce0: 74 68 65 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d  them, add a dumm
5cf0: 79 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 68 65  y OP_Variable he
5d00: 72 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  re..          */
5d10: 20 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20   .          int 
5d20: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
5d30: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
5d40: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5d50: 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
5d60: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
5d70: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  r1);.          s
5d80: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5d90: 50 33 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62  P3(v, sqlite3Vdb
5da0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d  eCurrentAddr(v)-
5db0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 0);.         
5dc0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5dd0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5de0: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
5df0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
5e00: 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20  .      z = 0;.  
5e10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
5e20: 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
5e30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 7a 21 3d  );.  return (z!=
5e40: 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  0);.}.#endif /* 
5e50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
5e60: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
5e70: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
5e80: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
5e90: 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  BLE./*.** Check 
5ea0: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69  to see if the gi
5eb0: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
5ec0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
5ed0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75  .**         colu
5ee0: 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a  mn MATCH expr.**
5ef0: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 74 68 65  .** If it is the
5f00: 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20  n return TRUE.  
5f10: 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46  If not, return F
5f20: 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ALSE..*/.static 
5f30: 69 6e 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c  int isMatchOfCol
5f40: 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78  umn(.  Expr *pEx
5f50: 70 72 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20  pr      /* Test 
5f60: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
5f70: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  */.){.  ExprList
5f80: 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20   *pList;..  if( 
5f90: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55  pExpr->op!=TK_FU
5fa0: 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65  NCTION ){.    re
5fb0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
5fc0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
5fd0: 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
5fe0: 2c 22 6d 61 74 63 68 22 29 21 3d 30 20 29 7b 0a  ,"match")!=0 ){.
5ff0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6000: 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  }.  pList = pExp
6010: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66  r->x.pList;.  if
6020: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  ( pList->nExpr!=
6030: 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
6040: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  0;.  }.  if( pLi
6050: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e  st->a[1].pExpr->
6060: 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20  op != TK_COLUMN 
6070: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6080: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
6090: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
60a0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
60b0: 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
60c0: 49 66 20 74 68 65 20 70 42 61 73 65 20 65 78 70  If the pBase exp
60d0: 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74  ression originat
60e0: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
60f0: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a  USING clause of.
6100: 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20  ** a join, then 
6110: 74 72 61 6e 73 66 65 72 20 74 68 65 20 61 70 70  transfer the app
6120: 72 6f 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67  ropriate marking
6130: 73 20 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65  s over to derive
6140: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
6150: 64 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61  d transferJoinMa
6160: 72 6b 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65  rkings(Expr *pDe
6170: 72 69 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61  rived, Expr *pBa
6180: 73 65 29 7b 0a 20 20 69 66 28 20 70 44 65 72 69  se){.  if( pDeri
6190: 76 65 64 20 29 7b 0a 20 20 20 20 70 44 65 72 69  ved ){.    pDeri
61a0: 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42  ved->flags |= pB
61b0: 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ase->flags & EP_
61c0: 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70 44  FromJoin;.    pD
61d0: 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f  erived->iRightJo
61e0: 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d  inTable = pBase-
61f0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
6200: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65  ;.  }.}..#if !de
6210: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6220: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
6230: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
6240: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
6250: 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ERY)./*.** Analy
6260: 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 63  ze a term that c
6270: 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f  onsists of two o
6280: 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63  r more OR-connec
6290: 74 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e  ted.** subterms.
62a0: 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20    So in:.**.**  
62b0: 20 20 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61     ... WHERE  (a
62c0: 3d 35 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20  =5) AND (b=7 OR 
62d0: 63 3d 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44  c=9 OR d=13) AND
62e0: 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20   (d=13).**      
62f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6300: 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e      ^^^^^^^^^^^^
6310: 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54  ^^^^^^^^.**.** T
6320: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c  his routine anal
6330: 79 7a 65 73 20 74 65 72 6d 73 20 73 75 63 68 20  yzes terms such 
6340: 61 73 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65  as the middle te
6350: 72 6d 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  rm in the above 
6360: 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68  example..** A Wh
6370: 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74  ereOrTerm object
6380: 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64   is computed and
6390: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
63a0: 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61   term under.** a
63b0: 6e 61 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c  nalysis, regardl
63c0: 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f  ess of the outco
63d0: 6d 65 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73  me of the analys
63e0: 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a  is.  Hence:.**.*
63f0: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
6400: 77 74 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45  wtFlags   |=  TE
6410: 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20  RM_ORINFO.**    
6420: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
6430: 49 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d  Info  =  a dynam
6440: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
6450: 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a   WhereOrTerm obj
6460: 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65  ect.**.** The te
6470: 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  rm being analyze
6480: 64 20 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20  d must have two 
6490: 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f  or more of OR-co
64a0: 6e 6e 65 63 74 65 64 20 73 75 62 74 65 72 6d 73  nnected subterms
64b0: 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75  ..** A single su
64c0: 62 74 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61  bterm might be a
64d0: 20 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e   set of AND-conn
64e0: 65 63 74 65 64 20 73 75 62 2d 73 75 62 74 65 72  ected sub-subter
64f0: 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20  ms..** Examples 
6500: 6f 66 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61  of terms under a
6510: 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  nalysis:.**.**  
6520: 20 20 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d     (A)     t1.x=
6530: 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e  t2.y OR t1.x=t2.
6540: 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20  z OR t1.y=15 OR 
6550: 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20  t1.z=t3.a+5.**  
6560: 20 20 20 28 42 29 20 20 20 20 20 78 3d 65 78 70     (B)     x=exp
6570: 72 31 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52  r1 OR expr2=x OR
6580: 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20   x=expr3.**     
6590: 28 43 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e  (C)     t1.x=t2.
65a0: 79 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20  y OR (t1.x=t2.z 
65b0: 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20  AND t1.y=15).** 
65c0: 20 20 20 20 28 44 29 20 20 20 20 20 78 3d 65 78      (D)     x=ex
65d0: 70 72 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44  pr1 OR (y>11 AND
65e0: 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45   y<22 AND z LIKE
65f0: 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20   '*hello*').**  
6600: 20 20 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d     (E)     (p.a=
6610: 31 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20  1 AND q.b=2 AND 
6620: 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34  r.c=3) OR (p.x=4
6630: 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72   AND q.y=5 AND r
6640: 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45  .z=6).**.** CASE
6650: 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c   1:.**.** If all
6660: 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66   subterms are of
6670: 20 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78   the form T.C=ex
6680: 70 72 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67  pr for some sing
6690: 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61  le column of C a
66a0: 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74  nd.** a single t
66b0: 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e  able T (as shown
66c0: 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62   in example B ab
66d0: 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61 74 65  ove) then create
66e0: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a   a new virtual.*
66f0: 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 61  * term that is a
6700: 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20  n equivalent IN 
6710: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20  expression.  In 
6720: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
6730: 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e  the term.** bein
6740: 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a  g analyzed is:.*
6750: 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78  *.**      x = ex
6760: 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d  pr1  OR  expr2 =
6770: 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72   x  OR  x = expr
6780: 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65  3.**.** then cre
6790: 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61  ate a new virtua
67a0: 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73  l term like this
67b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49  :.**.**      x I
67c0: 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65  N (expr1,expr2,e
67d0: 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45  xpr3).**.** CASE
67e0: 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c   2:.**.** If all
67f0: 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e   subterms are in
6800: 64 65 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e  dexable by a sin
6810: 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65  gle table T, the
6820: 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20  n set.**.**     
6830: 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61  WhereTerm.eOpera
6840: 74 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  tor             
6850: 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20   =  WO_OR.**    
6860: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
6870: 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
6880: 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20   |=  the cursor 
6890: 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65  number for table
68a0: 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65   T.**.** A subte
68b0: 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65  rm is "indexable
68c0: 22 20 69 66 20 69 74 20 69 73 20 6f 66 20 74 68  " if it is of th
68d0: 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c  e form.** "T.C <
68e0: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72  op> <expr>" wher
68f0: 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d  e C is any colum
6900: 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64  n of table T and
6910: 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65   .** <op> is one
6920: 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c   of "=", "<", "<
6930: 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22  =", ">", ">=", "
6940: 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e  IS NULL", or "IN
6950: 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20  "..** A subterm 
6960: 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c  is also indexabl
6970: 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e  e if it is an AN
6980: 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  D of two or more
6990: 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20  .** subsubterms 
69a0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20  at least one of 
69b0: 77 68 69 63 68 20 69 73 20 69 6e 64 65 78 61 62  which is indexab
69c0: 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41  le.  Indexable A
69d0: 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20  ND .** subterms 
69e0: 68 61 76 65 20 74 68 65 69 72 20 65 4f 70 65 72  have their eOper
69f0: 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41  ator set to WO_A
6a00: 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61 76 65  ND and they have
6a10: 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73  .** u.pAndInfo s
6a20: 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61  et to a dynamica
6a30: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
6a40: 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63  ereAndTerm objec
6a50: 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e  t..**.** From an
6a60: 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76  other point of v
6a70: 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22  iew, "indexable"
6a80: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
6a90: 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a  subterm could.**
6aa0: 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20   potentially be 
6ab0: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
6ac0: 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72  ex if an appropr
6ad0: 69 61 74 65 20 69 6e 64 65 78 20 65 78 69 73 74  iate index exist
6ae0: 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79  s..** This analy
6af0: 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  sis does not con
6b00: 73 69 64 65 72 20 77 68 65 74 68 65 72 20 6f 72  sider whether or
6b10: 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65   not the index e
6b20: 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69  xists; that.** i
6b30: 73 20 64 65 63 69 64 65 64 20 65 6c 73 65 77 68  s decided elsewh
6b40: 65 72 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79  ere.  This analy
6b50: 73 69 73 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61  sis only looks a
6b60: 74 20 77 68 65 74 68 65 72 20 73 75 62 74 65 72  t whether subter
6b70: 6d 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  ms.** appropriat
6b80: 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65  e for indexing e
6b90: 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  xist..**.** All 
6ba0: 65 78 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75  examples A throu
6bb0: 67 68 20 45 20 61 62 6f 76 65 20 73 61 74 69 73  gh E above satis
6bc0: 66 79 20 63 61 73 65 20 32 2e 20 20 42 75 74 20  fy case 2.  But 
6bd0: 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73  if a term.** als
6be0: 6f 20 73 74 61 74 69 73 66 69 65 73 20 63 61 73  o statisfies cas
6bf0: 65 20 31 20 28 73 75 63 68 20 61 73 20 42 29 20  e 1 (such as B) 
6c00: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
6c10: 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a   optimizer will.
6c20: 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66 65 72  ** always prefer
6c30: 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e 20 74   case 1, so in t
6c40: 68 61 74 20 63 61 73 65 20 77 65 20 70 72 65 74  hat case we pret
6c50: 65 6e 64 20 74 68 61 74 20 63 61 73 65 20 32 20  end that case 2 
6c60: 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66  is not.** satisf
6c70: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69  ied..**.** It mi
6c80: 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ght be the case 
6c90: 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 74 61  that multiple ta
6ca0: 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78 61 62  bles are indexab
6cb0: 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  le.  For example
6cc0: 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65 20 69  ,.** (E) above i
6cd0: 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74  s indexable on t
6ce0: 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64 20  ables P, Q, and 
6cf0: 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74  R..**.** Terms t
6d00: 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65  hat satisfy case
6d10: 20 32 20 61 72 65 20 63 61 6e 64 69 64 61 74 65   2 are candidate
6d20: 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20  s for lookup by 
6d30: 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74  using.** separat
6d40: 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66 69 6e  e indices to fin
6d50: 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65 61 63  d rowids for eac
6d60: 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20 63 6f  h subterm and co
6d70: 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75  mposing.** the u
6d80: 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69  nion of all rowi
6d90: 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77 53 65  ds using a RowSe
6da0: 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  t object.  This 
6db0: 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f  is similar.** to
6dc0: 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63 65 73   "bitmap indices
6dd0: 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74 61 62  " in other datab
6de0: 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a  ase engines..**.
6df0: 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a  ** OTHERWISE:.**
6e00: 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 63  .** If neither c
6e10: 61 73 65 20 31 20 6e 6f 72 20 63 61 73 65 20 32  ase 1 nor case 2
6e20: 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61   apply, then lea
6e30: 76 65 20 74 68 65 20 65 4f 70 65 72 61 74 6f 72  ve the eOperator
6e40: 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e   set to.** zero.
6e50: 20 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 6e    This term is n
6e60: 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65  ot useful for se
6e70: 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  arch..*/.static 
6e80: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
6e90: 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c 69 73  OrTerm(.  SrcLis
6ea0: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20  t *pSrc,        
6eb0: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
6ec0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
6ed0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
6ee0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d        /* the com
6ef0: 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61 75  plete WHERE clau
6f00: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54  se */.  int idxT
6f10: 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
6f20: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
6f30: 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65 20  e OR-term to be 
6f40: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20  analyzed */.){. 
6f50: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
6f60: 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  fo = pWC->pWInfo
6f70: 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52  ;        /* WHER
6f80: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
6f90: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
6fa0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
6fb0: 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
6fd0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
6fe0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
6ff0: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
7000: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
7010: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
7020: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
7030: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
7040: 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54  dxTerm];    /* T
7050: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
7060: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72  alyzed */.  Expr
7070: 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
7080: 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  >pExpr;         
7090: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
70a0: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 72  ssion of the ter
70b0: 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  m */.  int i;   
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
70e0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
70f0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
7100: 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20 20 2f   *pOrWc;       /
7110: 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70 54 65  * Breakup of pTe
7120: 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  rm into subterms
7130: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
7140: 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20 20 20  *pOrTerm;       
7150: 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20 77 69  /* A Sub-term wi
7160: 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63 20 2a  thin the pOrWc *
7170: 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20  /.  WhereOrInfo 
7180: 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a  *pOrInfo;     /*
7190: 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   Additional info
71a0: 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69 61 74  rmation associat
71b0: 65 64 20 77 69 74 68 20 70 54 65 72 6d 20 2a 2f  ed with pTerm */
71c0: 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e 67 54  .  Bitmask chngT
71d0: 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  oIN;         /* 
71e0: 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68  Tables that migh
71f0: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 31  t satisfy case 1
7200: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e   */.  Bitmask in
7210: 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20 20  dexable;        
7220: 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 61  /* Tables that a
7230: 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20 73 61  re indexable, sa
7240: 74 69 73 66 79 69 6e 67 20 63 61 73 65 20 32 20  tisfying case 2 
7250: 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72  */..  /*.  ** Br
7260: 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61 75 73  eak the OR claus
7270: 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70 61 72  e into its separ
7280: 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20 20 54  ate subterms.  T
7290: 68 65 20 73 75 62 74 65 72 6d 73 20 61 72 65 0a  he subterms are.
72a0: 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61    ** stored in a
72b0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
72c0: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
72d0: 67 20 77 69 74 68 69 6e 20 74 68 65 20 57 68 65  g within the Whe
72e0: 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62  reOrInfo.  ** ob
72f0: 6a 65 63 74 20 74 68 61 74 20 69 73 20 61 74 74  ject that is att
7300: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f 72 69  ached to the ori
7310: 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65 20  ginal OR clause 
7320: 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  term..  */.  ass
7330: 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ert( (pTerm->wtF
7340: 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44 59 4e  lags & (TERM_DYN
7350: 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f  AMIC|TERM_ORINFO
7360: 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d  |TERM_ANDINFO))=
7370: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
7380: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  pExpr->op==TK_OR
7390: 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70   );.  pTerm->u.p
73a0: 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f  OrInfo = pOrInfo
73b0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
73c0: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
73d0: 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20  f(*pOrInfo));.  
73e0: 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29  if( pOrInfo==0 )
73f0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d   return;.  pTerm
7400: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
7410: 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57  M_ORINFO;.  pOrW
7420: 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63  c = &pOrInfo->wc
7430: 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49  ;.  whereClauseI
7440: 6e 69 74 28 70 4f 72 57 63 2c 20 70 57 49 6e 66  nit(pOrWc, pWInf
7450: 6f 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74  o);.  whereSplit
7460: 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c 20 54  (pOrWc, pExpr, T
7470: 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e 61  K_OR);.  exprAna
7480: 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f  lyzeAll(pSrc, pO
7490: 72 57 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  rWc);.  if( db->
74a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
74b0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
74c0: 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32   pOrWc->nTerm>=2
74d0: 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43   );..  /*.  ** C
74e0: 6f 6d 70 75 74 65 20 74 68 65 20 73 65 74 20 6f  ompute the set o
74f0: 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69  f tables that mi
7500: 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65  ght satisfy case
7510: 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20  s 1 or 2..  */. 
7520: 20 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28 42   indexable = ~(B
7530: 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67  itmask)0;.  chng
7540: 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b  ToIN = ~(Bitmask
7550: 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57  )0;.  for(i=pOrW
7560: 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54  c->nTerm-1, pOrT
7570: 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e  erm=pOrWc->a; i>
7580: 3d 30 20 26 26 20 69 6e 64 65 78 61 62 6c 65 3b  =0 && indexable;
7590: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
75a0: 7b 0a 20 20 20 20 69 66 28 20 28 70 4f 72 54 65  {.    if( (pOrTe
75b0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
75c0: 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b  WO_SINGLE)==0 ){
75d0: 0a 20 20 20 20 20 20 57 68 65 72 65 41 6e 64 49  .      WhereAndI
75e0: 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20  nfo *pAndInfo;. 
75f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4f       assert( (pO
7600: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
7610: 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54   (TERM_ANDINFO|T
7620: 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20  ERM_ORINFO))==0 
7630: 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f 49  );.      chngToI
7640: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 6e  N = 0;.      pAn
7650: 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  dInfo = sqlite3D
7660: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
7670: 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29  izeof(*pAndInfo)
7680: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e  );.      if( pAn
7690: 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  dInfo ){.       
76a0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41   WhereClause *pA
76b0: 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68  ndWC;.        Wh
76c0: 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72  ereTerm *pAndTer
76d0: 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  m;.        int j
76e0: 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  ;.        Bitmas
76f0: 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  k b = 0;.       
7700: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64   pOrTerm->u.pAnd
7710: 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b  Info = pAndInfo;
7720: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
7730: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
7740: 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20  M_ANDINFO;.     
7750: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65     pOrTerm->eOpe
7760: 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a  rator = WO_AND;.
7770: 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d          pAndWC =
7780: 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a   &pAndInfo->wc;.
7790: 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c 61          whereCla
77a0: 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c 20  useInit(pAndWC, 
77b0: 70 57 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20 20  pWC->pWInfo);.  
77c0: 20 20 20 20 20 20 77 68 65 72 65 53 70 6c 69 74        whereSplit
77d0: 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d  (pAndWC, pOrTerm
77e0: 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29  ->pExpr, TK_AND)
77f0: 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e  ;.        exprAn
7800: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70  alyzeAll(pSrc, p
7810: 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20  AndWC);.        
7820: 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d  pAndWC->pOuter =
7830: 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65   pWC;.        te
7840: 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c  stcase( db->mall
7850: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
7860: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
7870: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
7880: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
7890: 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d  pAndTerm=pAndWC-
78a0: 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54  >a; j<pAndWC->nT
78b0: 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65  erm; j++, pAndTe
78c0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
78d0: 20 20 20 61 73 73 65 72 74 28 20 70 41 6e 64 54     assert( pAndT
78e0: 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  erm->pExpr );.  
78f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 6c            if( al
7900: 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d  lowedOp(pAndTerm
7910: 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a  ->pExpr->op) ){.
7920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 20                b 
7930: 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e  |= getMask(&pWIn
7940: 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 41  fo->sMaskSet, pA
7950: 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  ndTerm->leftCurs
7960: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  or);.           
7970: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
7980: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7990: 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b   indexable &= b;
79a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
79b0: 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
79c0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
79d0: 4f 50 49 45 44 20 29 7b 0a 20 20 20 20 20 20 2f  OPIED ){.      /
79e0: 2a 20 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d  * Skip this term
79f0: 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72 65   for now.  We re
7a00: 76 69 73 69 74 20 69 74 20 77 68 65 6e 20 77 65  visit it when we
7a10: 20 70 72 6f 63 65 73 73 20 74 68 65 0a 20 20 20   process the.   
7a20: 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64     ** correspond
7a30: 69 6e 67 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  ing TERM_VIRTUAL
7a40: 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c   term */.    }el
7a50: 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  se{.      Bitmas
7a60: 6b 20 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 67  k b;.      b = g
7a70: 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
7a80: 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72  sMaskSet, pOrTer
7a90: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a  m->leftCursor);.
7aa0: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
7ab0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
7ac0: 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20  M_VIRTUAL ){.   
7ad0: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
7ae0: 70 4f 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d  pOther = &pOrWc-
7af0: 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72  >a[pOrTerm->iPar
7b00: 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20  ent];.        b 
7b10: 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e  |= getMask(&pWIn
7b20: 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f  fo->sMaskSet, pO
7b30: 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72  ther->leftCursor
7b40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7b50: 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b   indexable &= b;
7b60: 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54  .      if( (pOrT
7b70: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7b80: 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20 20   WO_EQ)==0 ){.  
7b90: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d        chngToIN =
7ba0: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
7bb0: 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49  .        chngToI
7bc0: 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a  N &= b;.      }.
7bd0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
7be0: 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20    ** Record the 
7bf0: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
7c00: 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20  at satisfy case 
7c10: 32 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67 68  2.  The set migh
7c20: 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e  t be.  ** empty.
7c30: 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d  .  */.  pOrInfo-
7c40: 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64  >indexable = ind
7c50: 65 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d  exable;.  pTerm-
7c60: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64  >eOperator = ind
7c70: 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20  exable==0 ? 0 : 
7c80: 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  WO_OR;..  /*.  *
7c90: 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73  * chngToIN holds
7ca0: 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73   a set of tables
7cb0: 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61   that *might* sa
7cc0: 74 69 73 66 79 20 63 61 73 65 20 31 2e 20 20 42  tisfy case 1.  B
7cd0: 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20  ut.  ** we have 
7ce0: 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74  to do some addit
7cf0: 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74  ional checking t
7d00: 6f 20 73 65 65 20 69 66 20 63 61 73 65 20 31 20  o see if case 1 
7d10: 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73  really.  ** is s
7d20: 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20  atisfied..  **. 
7d30: 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c   ** chngToIN wil
7d40: 6c 20 68 6f 6c 64 20 65 69 74 68 65 72 20 30 2c  l hold either 0,
7d50: 20 31 2c 20 6f 72 20 32 20 62 69 74 73 2e 20 20   1, or 2 bits.  
7d60: 54 68 65 20 30 2d 62 69 74 20 63 61 73 65 20 6d  The 0-bit case m
7d70: 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 74  eans.  ** that t
7d80: 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 73 69  here is no possi
7d90: 62 69 6c 69 74 79 20 6f 66 20 74 72 61 6e 73 66  bility of transf
7da0: 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52 20 63 6c  orming the OR cl
7db0: 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a  ause into an.  *
7dc0: 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 62 65  * IN operator be
7dd0: 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72  cause one or mor
7de0: 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  e terms in the O
7df0: 52 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  R clause contain
7e00: 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20  .  ** something 
7e10: 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e  other than == on
7e20: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
7e30: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20   single table.  
7e40: 54 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63  The 1-bit.  ** c
7e50: 61 73 65 20 6d 65 61 6e 73 20 74 68 61 74 20 65  ase means that e
7e60: 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65  very term of the
7e70: 20 4f 52 20 63 6c 61 75 73 65 20 69 73 20 6f 66   OR clause is of
7e80: 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22   the form.  ** "
7e90: 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70  table.column=exp
7ea0: 72 22 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67  r" for some sing
7eb0: 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6f  le table.  The o
7ec0: 6e 65 20 62 69 74 20 74 68 61 74 20 69 73 20 73  ne bit that is s
7ed0: 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72  et.  ** will cor
7ee0: 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 63  respond to the c
7ef0: 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65  ommon table.  We
7f00: 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63   still need to c
7f10: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a  heck to make.  *
7f20: 2a 20 73 75 72 65 20 74 68 65 20 73 61 6d 65 20  * sure the same 
7f30: 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 6f  column is used o
7f40: 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68  n all terms.  Th
7f50: 65 20 32 2d 62 69 74 20 63 61 73 65 20 69 73 20  e 2-bit case is 
7f60: 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c  when.  ** the al
7f70: 6c 20 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74  l terms are of t
7f80: 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e  he form "table1.
7f90: 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f  column=table2.co
7fa0: 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20  lumn".  It.  ** 
7fb0: 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c  might be possibl
7fc0: 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20  e to form an IN 
7fd0: 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 65 69  operator with ei
7fe0: 74 68 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75  ther table1.colu
7ff0: 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65  mn.  ** or table
8000: 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20  2.column as the 
8010: 4c 48 53 20 69 66 20 65 69 74 68 65 72 20 69 73  LHS if either is
8020: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79   common to every
8030: 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68   term of.  ** th
8040: 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a  e OR clause..  *
8050: 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  *.  ** Note that
8060: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
8070: 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e  rm "table.column
8080: 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22  1=table.column2"
8090: 20 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20   (the.  ** same 
80a0: 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69  table on both si
80b0: 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d 29 20 63  zes of the ==) c
80c0: 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a  annot be optimiz
80d0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ed..  */.  if( c
80e0: 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69  hngToIN ){.    i
80f0: 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  nt okToChngToIN 
8100: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  = 0;     /* True
8110: 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69   if the conversi
8120: 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61 6c 69  on to IN is vali
8130: 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f  d */.    int iCo
8140: 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20  lumn = -1;      
8150: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64     /* Column ind
8160: 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20  ex on lhs of IN 
8170: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
8180: 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20 2d 31  int iCursor = -1
8190: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ;         /* Tab
81a0: 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e  le cursor common
81b0: 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f   to all terms */
81c0: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20  .    int j = 0; 
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
81e0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
81f0: 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  /..    /* Search
8200: 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61 6e 64   for a table and
8210: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70 70   column that app
8220: 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65  ears on one side
8230: 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   or the.    ** o
8240: 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f  ther of the == o
8250: 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65 72 79  perator in every
8260: 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61 74 20   subterm.  That 
8270: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
8280: 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  .    ** will be 
8290: 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43 75 72  recorded in iCur
82a0: 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e  sor and iColumn.
82b0: 20 20 54 68 65 72 65 20 6d 69 67 68 74 20 6e 6f    There might no
82c0: 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20  t be any.    ** 
82d0: 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64 20 63  such table and c
82e0: 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f  olumn.  Set okTo
82f0: 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20 61  ChngToIN if an a
8300: 70 70 72 6f 70 72 69 61 74 65 20 74 61 62 6c 65  ppropriate table
8310: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75  .    ** and colu
8320: 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20  mn is found but 
8330: 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f  leave okToChngTo
8340: 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20  IN false if not 
8350: 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  found..    */.  
8360: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26    for(j=0; j<2 &
8370: 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b  & !okToChngToIN;
8380: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72   j++){.      pOr
8390: 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b  Term = pOrWc->a;
83a0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72  .      for(i=pOr
83b0: 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d  Wc->nTerm-1; i>=
83c0: 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  0; i--, pOrTerm+
83d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
83e0: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  rt( pOrTerm->eOp
83f0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29  erator & WO_EQ )
8400: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
8410: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54  m->wtFlags &= ~T
8420: 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20  ERM_OR_OK;.     
8430: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
8440: 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
8450: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
8460: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
8470: 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64 20 77  2-bit case and w
8480: 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73 65 63  e are on the sec
8490: 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 61 6e  ond iteration an
84a0: 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  d.          ** c
84b0: 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20 66  urrent term is f
84c0: 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 69 74  rom the first it
84d0: 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69  eration.  So ski
84e0: 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a  p this term. */.
84f0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
8500: 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( j==1 );.      
8510: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
8520: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8530: 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20  if( (chngToIN & 
8540: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
8550: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65  >sMaskSet, pOrTe
8560: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 29  rm->leftCursor))
8570: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8580: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 6d 75   /* This term mu
8590: 73 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  st be of the for
85a0: 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65  m t1.a==t2.b whe
85b0: 72 65 20 74 32 20 69 73 20 69 6e 20 74 68 65 0a  re t2 is in the.
85c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68 6e            ** chn
85d0: 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20 74 31  gToIN set but t1
85e0: 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73 20 74   is not.  This t
85f0: 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69 74 68  erm will be eith
8600: 65 72 20 70 72 65 63 65 65 64 65 64 0a 20 20 20  er preceeded.   
8610: 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c         ** or fol
8620: 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76 65 72  lwed by an inver
8630: 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d  ted copy (t2.b==
8640: 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74 68 69  t1.a).  Skip thi
8650: 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20 20 20  s term .        
8660: 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69 74 73    ** and use its
8670: 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20   inversion. */. 
8680: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
8690: 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  e( pOrTerm->wtFl
86a0: 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45  ags & TERM_COPIE
86b0: 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  D );.          t
86c0: 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d  estcase( pOrTerm
86d0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
86e0: 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
86f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
8700: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
8710: 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45   (TERM_COPIED|TE
8720: 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a 20  RM_VIRTUAL) );. 
8730: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
8740: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
8750: 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70       iColumn = p
8760: 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  OrTerm->u.leftCo
8770: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 43  lumn;.        iC
8780: 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d  ursor = pOrTerm-
8790: 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20  >leftCursor;.   
87a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
87b0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c    }.      if( i<
87c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
87d0: 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74 61 62  No candidate tab
87e0: 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f  le+column was fo
87f0: 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e 20 6f  und.  This can o
8800: 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20 20 20  nly occur.      
8810: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f    ** on the seco
8820: 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a  nd iteration */.
8830: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8840: 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  j==1 );.        
8850: 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f  assert( IsPowerO
8860: 66 54 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29  fTwo(chngToIN) )
8870: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
8880: 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d  ( chngToIN==getM
8890: 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
88a0: 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72 29 20  skSet, iCursor) 
88b0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
88c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
88d0: 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31 20 29  testcase( j==1 )
88e0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68  ;..      /* We h
88f0: 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61 6e 64  ave found a cand
8900: 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e 64 20  idate table and 
8910: 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74  column.  Check t
8920: 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a 20 20  o see if that.  
8930: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64      ** table and
8940: 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f   column is commo
8950: 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  n to every term 
8960: 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  in the OR clause
8970: 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68   */.      okToCh
8980: 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20  ngToIN = 1;.    
8990: 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20    for(; i>=0 && 
89a0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d  okToChngToIN; i-
89b0: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
89c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
89d0: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
89e0: 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
89f0: 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
8a00: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43  ->leftCursor!=iC
8a10: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
8a20: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c     pOrTerm->wtFl
8a30: 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f  ags &= ~TERM_OR_
8a40: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OK;.        }els
8a50: 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75  e if( pOrTerm->u
8a60: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f  .leftColumn!=iCo
8a70: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
8a80: 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d    okToChngToIN =
8a90: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
8aa0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
8ab0: 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69 67   affLeft, affRig
8ac0: 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ht;.          /*
8ad0: 20 49 66 20 74 68 65 20 72 69 67 68 74 2d 68 61   If the right-ha
8ae0: 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f 20  nd side is also 
8af0: 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74  a column, then t
8b00: 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a 20 20  he affinities.  
8b10: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f          ** of bo
8b20: 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66  th right and lef
8b30: 74 20 73 69 64 65 73 20 6d 75 73 74 20 62 65 20  t sides must be 
8b40: 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70  such that no typ
8b50: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
8b60: 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72  onversions are r
8b70: 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72  equired on the r
8b80: 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23  ight.  (Ticket #
8b90: 32 32 34 39 29 0a 20 20 20 20 20 20 20 20 20 20  2249).          
8ba0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  */.          aff
8bb0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
8bc0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54  xprAffinity(pOrT
8bd0: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
8be0: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ht);.          a
8bf0: 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  ffLeft = sqlite3
8c00: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72  ExprAffinity(pOr
8c10: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  Term->pExpr->pLe
8c20: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ft);.          i
8c30: 66 28 20 61 66 66 52 69 67 68 74 21 3d 30 20 26  f( affRight!=0 &
8c40: 26 20 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c  & affRight!=affL
8c50: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eft ){.         
8c60: 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20     okToChngToIN 
8c70: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
8c80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
8c90: 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61    pOrTerm->wtFla
8ca0: 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b  gs |= TERM_OR_OK
8cb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8cc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8cd0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
8ce0: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54   this point, okT
8cf0: 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74 72 75  oChngToIN is tru
8d00: 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20 70 54  e if original pT
8d10: 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a 20 20  erm satisfies.  
8d20: 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20 49 6e    ** case 1.  In
8d30: 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f 6e 73   that case, cons
8d40: 74 72 75 63 74 20 61 20 6e 65 77 20 76 69 72 74  truct a new virt
8d50: 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20 69 73  ual term that is
8d60: 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d 20 63   .    ** pTerm c
8d70: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e  onverted into an
8d80: 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   IN operator..  
8d90: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54    */.    if( okT
8da0: 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20  oChngToIN ){.   
8db0: 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20 20     Expr *pDup;  
8dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
8dd0: 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69 63 61  ransient duplica
8de0: 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  te expression */
8df0: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
8e00: 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a  *pList = 0;   /*
8e10: 20 54 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   The RHS of the 
8e20: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
8e30: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
8e40: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54   = 0;       /* T
8e50: 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
8e60: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
8e70: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20     Expr *pNew;  
8e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
8e90: 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65   complete IN ope
8ea0: 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20  rator */..      
8eb0: 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65  for(i=pOrWc->nTe
8ec0: 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f  rm-1, pOrTerm=pO
8ed0: 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  rWc->a; i>=0; i-
8ee0: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
8ef0: 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54         if( (pOrT
8f00: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
8f10: 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20  ERM_OR_OK)==0 ) 
8f20: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
8f30: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
8f40: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
8f50: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
8f60: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
8f70: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
8f80: 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20  rsor );.        
8f90: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
8fa0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69  >u.leftColumn==i
8fb0: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20  Column );.      
8fc0: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
8fd0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 72 54  ExprDup(db, pOrT
8fe0: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
8ff0: 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
9000: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
9010: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 57  xprListAppend(pW
9020: 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4c  Info->pParse, pL
9030: 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  ist, pDup);.    
9040: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54      pLeft = pOrT
9050: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
9060: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
9070: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d   assert( pLeft!=
9080: 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20  0 );.      pDup 
9090: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
90a0: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a  (db, pLeft, 0);.
90b0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
90c0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
90d0: 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30  , TK_IN, pDup, 0
90e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
90f0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
9100: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
9110: 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e      transferJoin
9120: 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70  Markings(pNew, p
9130: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61  Expr);.        a
9140: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
9150: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
9160: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
9170: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
9180: 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  List = pList;.  
9190: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
91a0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
91b0: 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d  (pWC, pNew, TERM
91c0: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
91d0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20  NAMIC);.        
91e0: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
91f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 65  ==0 );.        e
9200: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
9210: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20   pWC, idxNew);. 
9220: 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
9230: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
9240: 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  .        pWC->a[
9250: 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20  idxNew].iParent 
9260: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
9270: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
9280: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
9290: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
92a0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
92b0: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
92c0: 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d     }.      pTerm
92d0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
92e0: 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20  _NOOP;  /* case 
92f0: 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32 20  1 trumps case 2 
9300: 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  */.    }.  }.}.#
9310: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
9320: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
9330: 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45  ATION && !SQLITE
9340: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
9350: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70  /../*.** The inp
9360: 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ut to this routi
9370: 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54 65  ne is an WhereTe
9380: 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69 74  rm structure wit
9390: 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70  h only the.** "p
93a0: 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c  Expr" field fill
93b0: 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20  ed in.  The job 
93c0: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
93d0: 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68  is to analyze th
93e0: 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69  e.** subexpressi
93f0: 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  on and populate 
9400: 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69  all the other fi
9410: 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65 72  elds of the Wher
9420: 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75  eTerm.** structu
9430: 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  re..**.** If the
9440: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
9450: 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70  f the form "<exp
9460: 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65  r> <op> X" it ge
9470: 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74  ts commuted.** t
9480: 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 66  o the standard f
9490: 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c  orm of "X <op> <
94a0: 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66  expr>"..**.** If
94b0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
94c0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
94d0: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
94e0: 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72 65  both X and Y are
94f0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  .** columns, the
9500: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65  n the original e
9510: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63  xpression is unc
9520: 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77  hanged and a new
9530: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d   virtual.** term
9540: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20   of the form "Y 
9550: 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65 64  <op> X" is added
9560: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
9570: 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c  ause and.** anal
9580: 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  yzed separately.
9590: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
95a0: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
95b0: 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a  th TERM_COPIED.*
95c0: 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65  * and the new te
95d0: 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74  rm is marked wit
95e0: 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28  h TERM_DYNAMIC (
95f0: 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45 78  because it's pEx
9600: 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62  pr.** needs to b
9610: 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68 65  e freed with the
9620: 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e   WhereClause) an
9630: 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28  d TERM_VIRTUAL (
9640: 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73  because it.** is
9650: 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79   a commuted copy
9660: 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d   of a prior term
9670: 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .)  The original
9680: 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64   term has nChild
9690: 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f  =1.** and the co
96a0: 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e 74  py has idxParent
96b0: 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
96c0: 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  x of the origina
96d0: 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69  l term..*/.stati
96e0: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
96f0: 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ze(.  SrcList *p
9700: 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Src,            
9710: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
9720: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
9730: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
9740: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
9750: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
9760: 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  dxTerm          
9770: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
9780: 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
9790: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20  analyzed */.){. 
97a0: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
97b0: 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  fo = pWC->pWInfo
97c0: 3b 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73  ; /* WHERE claus
97d0: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e  e processing con
97e0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  text */.  WhereT
97f0: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
9800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9810: 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  e term to be ana
9820: 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lyzed */.  Where
9830: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
9840: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  t;          /* S
9850: 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65  et of table inde
9860: 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70  x masks */.  Exp
9870: 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20  r *pExpr;       
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9890: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
98a0: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
98b0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
98c0: 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  eqLeft;         
98d0: 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65       /* Prereque
98e0: 73 69 74 65 73 20 6f 66 20 74 68 65 20 70 45 78  sites of the pEx
98f0: 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42  pr->pLeft */.  B
9900: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c  itmask prereqAll
9910: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9920: 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73  /* Prerequesites
9930: 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42   of pExpr */.  B
9940: 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68  itmask extraRigh
9950: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
9960: 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64 65  /* Extra depende
9970: 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f  ncies on LEFT JO
9980: 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53  IN */.  Expr *pS
9990: 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tr1 = 0;        
99a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20           /* RHS 
99b0: 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65  of LIKE/GLOB ope
99c0: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  rator */.  int i
99d0: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20  sComplete = 0;  
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
99f0: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
9a00: 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63 61  ends with wildca
9a10: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61  rd */.  int noCa
9a20: 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  se = 0;         
9a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45           /* LIKE
9a40: 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73  /GLOB distinguis
9a50: 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e  hes case */.  in
9a60: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9a80: 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72  * Top-level oper
9a90: 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70  ator.  pExpr->op
9aa0: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
9ab0: 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
9ac0: 61 72 73 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e  arse;  /* Parsin
9ad0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
9ae0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
9af0: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
9b00: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
9b10: 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28  ection */..  if(
9b20: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
9b30: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
9b40: 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26  .  }.  pTerm = &
9b50: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
9b60: 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70  .  pMaskSet = &p
9b70: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b  WInfo->sMaskSet;
9b80: 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d  .  pExpr = pTerm
9b90: 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ->pExpr;.  asser
9ba0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
9bb0: 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  _AS && pExpr->op
9bc0: 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a  !=TK_COLLATE );.
9bd0: 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65    prereqLeft = e
9be0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
9bf0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
9c00: 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45  Left);.  op = pE
9c10: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
9c20: 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  p==TK_IN ){.    
9c30: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
9c40: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
9c50: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
9c60: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
9c70: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
9c80: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
9c90: 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63  ight = exprSelec
9ca0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
9cb0: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  kSet, pExpr->x.p
9cc0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c  Select);.    }el
9cd0: 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  se{.      pTerm-
9ce0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
9cf0: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
9d00: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
9d10: 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
9d20: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f   }.  }else if( o
9d30: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
9d40: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
9d50: 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65  qRight = 0;.  }e
9d60: 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  lse{.    pTerm->
9d70: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78  prereqRight = ex
9d80: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
9d90: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52  skSet, pExpr->pR
9da0: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65  ight);.  }.  pre
9db0: 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62  reqAll = exprTab
9dc0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
9dd0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
9de0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9df0: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
9e00: 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  in) ){.    Bitma
9e10: 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70  sk x = getMask(p
9e20: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
9e30: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29  iRightJoinTable)
9e40: 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20  ;.    prereqAll 
9e50: 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52  |= x;.    extraR
9e60: 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20  ight = x-1;  /* 
9e70: 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  ON clause terms 
9e80: 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20  may not be used 
9e90: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20  with an index.  
9ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9eb0: 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20       ** on left 
9ec0: 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
9ed0: 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33  JOIN.  Ticket #3
9ee0: 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65  015 */.  }.  pTe
9ef0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
9f00: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65  prereqAll;.  pTe
9f10: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
9f20: 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50   -1;.  pTerm->iP
9f30: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54  arent = -1;.  pT
9f40: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
9f50: 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65   0;.  if( allowe
9f60: 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20 20 45  dOp(op) ){.    E
9f70: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c  xpr *pLeft = sql
9f80: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
9f90: 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ate(pExpr->pLeft
9fa0: 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  );.    Expr *pRi
9fb0: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
9fc0: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78  rSkipCollate(pEx
9fd0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
9fe0: 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28 70   u16 opMask = (p
9ff0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
a000: 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d  t & prereqLeft)=
a010: 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f  =0 ? WO_ALL : WO
a020: 5f 45 51 55 49 56 3b 0a 20 20 20 20 69 66 28 20  _EQUIV;.    if( 
a030: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pLeft->op==TK_CO
a040: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54  LUMN ){.      pT
a050: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
a060: 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
a070: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e  .      pTerm->u.
a080: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
a090: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
a0a0: 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
a0b0: 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61  tor = operatorMa
a0c0: 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b 3b  sk(op) & opMask;
a0d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
a0e0: 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74 2d  Right && pRight-
a0f0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
a100: 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
a110: 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45  m *pNew;.      E
a120: 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20  xpr *pDup;.     
a130: 20 75 31 36 20 65 45 78 74 72 61 4f 70 20 3d 20   u16 eExtraOp = 
a140: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74  0;        /* Ext
a150: 72 61 20 62 69 74 73 20 66 6f 72 20 70 4e 65 77  ra bits for pNew
a160: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ->eOperator */. 
a170: 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
a180: 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b  leftCursor>=0 ){
a190: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78  .        int idx
a1a0: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75  New;.        pDu
a1b0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
a1c0: 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29  up(db, pExpr, 0)
a1d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  ;.        if( db
a1e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
a1f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
a200: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
a210: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20  , pDup);.       
a220: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
a230: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78     }.        idx
a240: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
a250: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75  eInsert(pWC, pDu
a260: 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  p, TERM_VIRTUAL|
a270: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
a280: 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e 65         if( idxNe
a290: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  w==0 ) return;. 
a2a0: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70         pNew = &p
a2b0: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
a2c0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61         pNew->iPa
a2d0: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
a2e0: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
a2f0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
a300: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
a310: 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20  >nChild = 1;.   
a320: 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
a330: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49  ags |= TERM_COPI
a340: 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ED;.        if( 
a350: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
a360: 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78  .         && !Ex
a370: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
a380: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
a390: 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70  ).         && Op
a3a0: 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
a3b0: 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 54 72 61  d(db, SQLITE_Tra
a3c0: 6e 73 69 74 69 76 65 29 0a 20 20 20 20 20 20 20  nsitive).       
a3d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
a3e0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c  erm->eOperator |
a3f0: 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  = WO_EQUIV;.    
a400: 20 20 20 20 20 20 65 45 78 74 72 61 4f 70 20 3d        eExtraOp =
a410: 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20   WO_EQUIV;.     
a420: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
a430: 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  {.        pDup =
a440: 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
a450: 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pNew = pTerm;.  
a460: 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72      }.      expr
a470: 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20  Commute(pParse, 
a480: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65  pDup);.      pLe
a490: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
a4a0: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 75 70  SkipCollate(pDup
a4b0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
a4c0: 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72  pNew->leftCursor
a4d0: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
a4e0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
a4f0: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
a500: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
a510: 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 72     testcase( (pr
a520: 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61  ereqLeft | extra
a530: 52 69 67 68 74 29 20 21 3d 20 70 72 65 72 65 71  Right) != prereq
a540: 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70 4e  Left );.      pN
a550: 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  ew->prereqRight 
a560: 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65  = prereqLeft | e
a570: 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20 20  xtraRight;.     
a580: 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c   pNew->prereqAll
a590: 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20   = prereqAll;.  
a5a0: 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61      pNew->eOpera
a5b0: 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f 72 4d  tor = (operatorM
a5c0: 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b 20  ask(pDup->op) + 
a5d0: 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70 4d 61  eExtraOp) & opMa
a5e0: 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  sk;.    }.  }..#
a5f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a600: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d  IT_BETWEEN_OPTIM
a610: 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20  IZATION.  /* If 
a620: 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42 45  a term is the BE
a630: 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20  TWEEN operator, 
a640: 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76  create two new v
a650: 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a  irtual terms.  *
a660: 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74 68  * that define th
a670: 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68 65  e range that the
a680: 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65   BETWEEN impleme
a690: 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  nts.  For exampl
a6a0: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
a6b0: 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e    a BETWEEN b AN
a6c0: 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73  D c.  **.  ** is
a6d0: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a   converted into:
a6e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
a6f0: 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44  (a BETWEEN b AND
a700: 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41   c) AND (a>=b) A
a710: 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20  ND (a<=c).  **. 
a720: 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20   ** The two new 
a730: 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20  terms are added 
a740: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
a750: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
a760: 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65  object..  ** The
a770: 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 22   new terms are "
a780: 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65  dynamic" and are
a790: 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65   children of the
a7a0: 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45   original BETWEE
a7b0: 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68  N.  ** term.  Th
a7c0: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  at means that if
a7d0: 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 65 72   the BETWEEN ter
a7e0: 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20  m is coded, the 
a7f0: 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a  children are.  *
a800: 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20  * skipped.  Or, 
a810: 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20  if the children 
a820: 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62 79  are satisfied by
a830: 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f   an index, the o
a840: 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54  riginal.  ** BET
a850: 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69  WEEN term is ski
a860: 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
a870: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
a880: 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70  =TK_BETWEEN && p
a890: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
a8a0: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
a8b0: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
a8c0: 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  .pList;.    int 
a8d0: 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  i;.    static co
a8e0: 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b  nst u8 ops[] = {
a8f0: 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20  TK_GE, TK_LE};. 
a900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
a910: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
a920: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  t( pList->nExpr=
a930: 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  =2 );.    for(i=
a940: 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
a950: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
a960: 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64  pr;.      int id
a970: 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77  xNew;.      pNew
a980: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
a990: 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b  xpr(pParse, ops[
a9a0: 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  i], .           
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
a9d0: 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  (db, pExpr->pLef
a9e0: 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20  t, 0),.         
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa00: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
aa10: 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  up(db, pList->a[
aa20: 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29  i].pExpr, 0), 0)
aa30: 3b 0a 20 20 20 20 20 20 74 72 61 6e 73 66 65 72  ;.      transfer
aa40: 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65  JoinMarkings(pNe
aa50: 77 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20  wExpr, pExpr);. 
aa60: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
aa70: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
aa80: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54  pWC, pNewExpr, T
aa90: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
aaa0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
aab0: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
aac0: 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  w==0 );.      ex
aad0: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
aae0: 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20  pWC, idxNew);.  
aaf0: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
ab00: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
ab10: 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
ab20: 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  w].iParent = idx
ab30: 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Term;.    }.    
ab40: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
ab50: 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  2;.  }.#endif /*
ab60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54   SQLITE_OMIT_BET
ab70: 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  WEEN_OPTIMIZATIO
ab80: 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  N */..#if !defin
ab90: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ed(SQLITE_OMIT_O
aba0: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20  R_OPTIMIZATION) 
abb0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
abc0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
abd0: 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61  ).  /* Analyze a
abe0: 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 63 6f   term that is co
abf0: 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f 72  mposed of two or
ac00: 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73 20 63   more subterms c
ac10: 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 2a 2a  onnected by.  **
ac20: 20 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e   an OR operator.
ac30: 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28  .  */.  else if(
ac40: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f   pExpr->op==TK_O
ac50: 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  R ){.    assert(
ac60: 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44   pWC->op==TK_AND
ac70: 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c   );.    exprAnal
ac80: 79 7a 65 4f 72 54 65 72 6d 28 70 53 72 63 2c 20  yzeOrTerm(pSrc, 
ac90: 70 57 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20  pWC, idxTerm);. 
aca0: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
acb0: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d  >a[idxTerm];.  }
acc0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
acd0: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
ace0: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64  ZATION */..#ifnd
acf0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
ad00: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
ad10: 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72  .  /* Add constr
ad20: 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20  aints to reduce 
ad30: 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
ad40: 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c   on a LIKE or GL
ad50: 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  OB.  ** operator
ad60: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69  ..  **.  ** A li
ad70: 6b 65 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68  ke pattern of th
ad80: 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27  e form "x LIKE '
ad90: 61 62 63 25 27 22 20 69 73 20 63 68 61 6e 67 65  abc%'" is change
ada0: 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e  d into constrain
adb0: 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  ts.  **.  **    
adc0: 20 20 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41        x>='abc' A
add0: 4e 44 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78  ND x<'abd' AND x
ade0: 20 4c 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a   LIKE 'abc%'.  *
adf0: 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20  *.  ** The last 
ae00: 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
ae10: 20 70 72 65 66 69 78 20 22 61 62 63 22 20 69 73   prefix "abc" is
ae20: 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20   incremented to 
ae30: 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65  form the.  ** te
ae40: 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74  rmination condit
ae50: 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a  ion "abd"..  */.
ae60: 20 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54    if( pWC->op==T
ae70: 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20 69 73 4c  K_AND .   && isL
ae80: 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 65  ikeOrGlob(pParse
ae90: 2c 20 70 45 78 70 72 2c 20 26 70 53 74 72 31 2c  , pExpr, &pStr1,
aea0: 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e   &isComplete, &n
aeb0: 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20 20 20 20  oCase).  ){.    
aec0: 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20  Expr *pLeft;    
aed0: 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b     /* LHS of LIK
aee0: 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
aef0: 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74  */.    Expr *pSt
af00: 72 32 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  r2;       /* Cop
af10: 79 20 6f 66 20 70 53 74 72 31 20 2d 20 52 48 53  y of pStr1 - RHS
af20: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70   of LIKE/GLOB op
af30: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78  erator */.    Ex
af40: 70 72 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20  pr *pNewExpr1;. 
af50: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
af60: 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e  r2;.    int idxN
af70: 65 77 31 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  ew1;.    int idx
af80: 4e 65 77 32 3b 0a 20 20 20 20 54 6f 6b 65 6e 20  New2;.    Token 
af90: 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 2f  sCollSeqName;  /
afa0: 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74  * Name of collat
afb0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ing sequence */.
afc0: 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78  .    pLeft = pEx
afd0: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
afe0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74  ].pExpr;.    pSt
aff0: 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
b000: 44 75 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30  Dup(db, pStr1, 0
b010: 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  );.    if( !db->
b020: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
b030: 20 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b        u8 c, *pC;
b040: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63         /* Last c
b050: 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20  haracter before 
b060: 74 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 61  the first wildca
b070: 72 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d  rd */.      pC =
b080: 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e   (u8*)&pStr2->u.
b090: 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74  zToken[sqlite3St
b0a0: 72 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e  rlen30(pStr2->u.
b0b0: 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20  zToken)-1];.    
b0c0: 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20    c = *pC;.     
b0d0: 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20   if( noCase ){. 
b0e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
b0f0: 69 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d  int is to increm
b100: 65 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68 61  ent the last cha
b110: 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
b120: 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20  e first.        
b130: 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75  ** wildcard.  Bu
b140: 74 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e  t if we incremen
b150: 74 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c  t '@', that will
b160: 20 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68   push it into th
b170: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70  e.        ** alp
b180: 68 61 62 65 74 69 63 20 72 61 6e 67 65 20 77 68  habetic range wh
b190: 65 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73  ere case convers
b1a0: 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75  ions will mess u
b1b0: 70 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  p the .        *
b1c0: 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54  * inequality.  T
b1d0: 6f 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61  o avoid this, ma
b1e0: 6b 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20  ke sure to also 
b1f0: 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20  run the full.   
b200: 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20       ** LIKE on 
b210: 61 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78  all candidate ex
b220: 70 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65  pressions by cle
b230: 61 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70  aring the isComp
b240: 6c 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20  lete flag.      
b250: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
b260: 20 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f   c=='A'-1 ) isCo
b270: 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20  mplete = 0;.    
b280: 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55      c = sqlite3U
b290: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a  pperToLower[c];.
b2a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
b2b0: 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d  C = c + 1;.    }
b2c0: 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d  .    sCollSeqNam
b2d0: 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22  e.z = noCase ? "
b2e0: 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52  NOCASE" : "BINAR
b2f0: 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71  Y";.    sCollSeq
b300: 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20  Name.n = 6;.    
b310: 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69  pNewExpr1 = sqli
b320: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
b330: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e  Left, 0);.    pN
b340: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
b350: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
b360: 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20  K_GE, .         
b370: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64    sqlite3ExprAdd
b380: 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61  CollateToken(pPa
b390: 72 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73  rse,pNewExpr1,&s
b3a0: 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20  CollSeqName),.  
b3b0: 20 20 20 20 20 20 20 20 20 70 53 74 72 31 2c 20           pStr1, 
b3c0: 30 29 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72  0);.    transfer
b3d0: 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65  JoinMarkings(pNe
b3e0: 77 45 78 70 72 31 2c 20 70 45 78 70 72 29 3b 0a  wExpr1, pExpr);.
b3f0: 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68      idxNew1 = wh
b400: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
b410: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20  pWC, pNewExpr1, 
b420: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
b430: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
b440: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
b450: 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72  1==0 );.    expr
b460: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
b470: 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20  C, idxNew1);.   
b480: 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c   pNewExpr2 = sql
b490: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
b4a0: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70  pLeft, 0);.    p
b4b0: 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74  NewExpr2 = sqlit
b4c0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
b4d0: 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20  TK_LT,.         
b4e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64    sqlite3ExprAdd
b4f0: 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61  CollateToken(pPa
b500: 72 73 65 2c 70 4e 65 77 45 78 70 72 32 2c 26 73  rse,pNewExpr2,&s
b510: 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20  CollSeqName),.  
b520: 20 20 20 20 20 20 20 20 20 70 53 74 72 32 2c 20           pStr2, 
b530: 30 29 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72  0);.    transfer
b540: 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65  JoinMarkings(pNe
b550: 77 45 78 70 72 32 2c 20 70 45 78 70 72 29 3b 0a  wExpr2, pExpr);.
b560: 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68      idxNew2 = wh
b570: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
b580: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20  pWC, pNewExpr2, 
b590: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
b5a0: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
b5b0: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
b5c0: 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72  2==0 );.    expr
b5d0: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
b5e0: 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20  C, idxNew2);.   
b5f0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
b600: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69  [idxTerm];.    i
b610: 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b  f( isComplete ){
b620: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64  .      pWC->a[id
b630: 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d  xNew1].iParent =
b640: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
b650: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e  pWC->a[idxNew2].
b660: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
b670: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  m;.      pTerm->
b680: 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20  nChild = 2;.    
b690: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
b6a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
b6b0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
b6c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b6d0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
b6e0: 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57 4f  LE.  /* Add a WO
b6f0: 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72 79  _MATCH auxiliary
b700: 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e   term to the con
b710: 73 74 72 61 69 6e 74 20 73 65 74 20 69 66 20 74  straint set if t
b720: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
b730: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
b740: 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75   the form:  colu
b750: 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a 20  mn MATCH expr.. 
b760: 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61   ** This informa
b770: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
b780: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d  the xBestIndex m
b790: 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76  ethods of.  ** v
b7a0: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20  irtual tables.  
b7b0: 54 68 65 20 6e 61 74 69 76 65 20 71 75 65 72 79  The native query
b7c0: 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73 20   optimizer does 
b7d0: 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a  not attempt.  **
b7e0: 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20   to do anything 
b7f0: 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63 74  with MATCH funct
b800: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
b810: 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e   isMatchOfColumn
b820: 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69  (pExpr) ){.    i
b830: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 45  nt idxNew;.    E
b840: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c  xpr *pRight, *pL
b850: 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65  eft;.    WhereTe
b860: 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20  rm *pNewTerm;.  
b870: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
b880: 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78  Column, prereqEx
b890: 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74 20  pr;..    pRight 
b8a0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
b8b0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
b8c0: 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
b8d0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
b8e0: 45 78 70 72 3b 0a 20 20 20 20 70 72 65 72 65 71  Expr;.    prereq
b8f0: 45 78 70 72 20 3d 20 65 78 70 72 54 61 62 6c 65  Expr = exprTable
b900: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
b910: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70 72 65  pRight);.    pre
b920: 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72  reqColumn = expr
b930: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
b940: 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  Set, pLeft);.   
b950: 20 69 66 28 20 28 70 72 65 72 65 71 45 78 70 72   if( (prereqExpr
b960: 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29   & prereqColumn)
b970: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  ==0 ){.      Exp
b980: 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20  r *pNewExpr;.   
b990: 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71     pNewExpr = sq
b9a0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
b9b0: 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20  e, TK_MATCH, .  
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73              0, s
b9e0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
b9f0: 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20 30 29  , pRight, 0), 0)
ba00: 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d  ;.      idxNew =
ba10: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
ba20: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
ba30: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
ba40: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
ba50: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
ba60: 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  xNew==0 );.     
ba70: 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43   pNewTerm = &pWC
ba80: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
ba90: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65     pNewTerm->pre
baa0: 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65  reqRight = prere
bab0: 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  qExpr;.      pNe
bac0: 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  wTerm->leftCurso
bad0: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
bae0: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  e;.      pNewTer
baf0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  m->u.leftColumn 
bb00: 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
bb10: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
bb20: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
bb30: 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70 4e  _MATCH;.      pN
bb40: 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20  ewTerm->iParent 
bb50: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
bb60: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
bb70: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
bb80: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
bb90: 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   1;.      pTerm-
bba0: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
bbb0: 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70  _COPIED;.      p
bbc0: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  NewTerm->prereqA
bbd0: 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  ll = pTerm->prer
bbe0: 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  eqAll;.    }.  }
bbf0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
bc00: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
bc10: 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  BLE */..#ifdef S
bc20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
bc30: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 2f 2a  T3_OR_STAT4.  /*
bc40: 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61   When sqlite_sta
bc50: 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  t3 histogram dat
bc60: 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61  a is available a
bc70: 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68  n operator of th
bc80: 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49  e.  ** form "x I
bc90: 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20  S NOT NULL" can 
bca0: 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61  sometimes be eva
bcb0: 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69  luated more effi
bcc0: 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20  ciently.  ** as 
bcd0: 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73  "x>NULL" if x is
bce0: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
bcf0: 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f  PRIMARY KEY.  So
bd00: 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a   construct a.  *
bd10: 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f  * virtual term o
bd20: 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a  f that form..  *
bd30: 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  *.  ** Note that
bd40: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 65 72   the virtual ter
bd50: 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67 65 64  m must be tagged
bd60: 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c   with TERM_VNULL
bd70: 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52  .  This.  ** TER
bd80: 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c  M_VNULL tag will
bd90: 20 73 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f   suppress the no
bda0: 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20  t-null check at 
bdb0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  the beginning.  
bdc0: 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  ** of the loop. 
bdd0: 20 57 69 74 68 6f 75 74 20 74 68 65 20 54 45 52   Without the TER
bde0: 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68  M_VNULL flag, th
bdf0: 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b  e not-null check
be00: 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61   at.  ** the sta
be10: 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77  rt of the loop w
be20: 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20  ill prevent any 
be30: 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69  results from bei
be40: 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a  ng returned..  *
be50: 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  /.  if( pExpr->o
be60: 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20  p==TK_NOTNULL.  
be70: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   && pExpr->pLeft
be80: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
be90: 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65     && pExpr->pLe
bea0: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20  ft->iColumn>=0. 
beb0: 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
bec0: 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
bed0: 49 54 45 5f 53 74 61 74 33 29 0a 20 20 29 7b 0a  ITE_Stat3).  ){.
bee0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
bef0: 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  pr;.    Expr *pL
bf00: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
bf10: 66 74 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e  ft;.    int idxN
bf20: 65 77 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  ew;.    WhereTer
bf30: 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20  m *pNewTerm;..  
bf40: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
bf50: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
bf60: 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20  , TK_GT,.       
bf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf80: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
bf90: 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30  Dup(db, pLeft, 0
bfa0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
bfc0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
bfd0: 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20  se, TK_NULL, 0, 
bfe0: 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20  0, 0), 0);..    
bff0: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
c000: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
c010: 70 4e 65 77 45 78 70 72 2c 0a 20 20 20 20 20 20  pNewExpr,.      
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 20 20 20 20 20 54 45 52 4d 5f 56 49 52          TERM_VIR
c040: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
c050: 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20  C|TERM_VNULL);. 
c060: 20 20 20 69 66 28 20 69 64 78 4e 65 77 20 29 7b     if( idxNew ){
c070: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20  .      pNewTerm 
c080: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
c090: 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  ];.      pNewTer
c0a0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
c0b0: 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   0;.      pNewTe
c0c0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
c0d0: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
c0e0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
c0f0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
c100: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
c110: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65       pNewTerm->e
c120: 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54  Operator = WO_GT
c130: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c140: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ->iParent = idxT
c150: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
c160: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
c170: 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  rm];.      pTerm
c180: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
c190: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
c1a0: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
c1b0: 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  D;.      pNewTer
c1c0: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
c1d0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b  Term->prereqAll;
c1e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
c1f0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
c200: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
c210: 34 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65  4 */..  /* Preve
c220: 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72  nt ON clause ter
c230: 6d 73 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  ms of a LEFT JOI
c240: 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65  N from being use
c250: 64 20 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20  d to drive.  ** 
c260: 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62  an index for tab
c270: 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
c280: 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a  of the join..  *
c290: 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  /.  pTerm->prere
c2a0: 71 52 69 67 68 74 20 7c 3d 20 65 78 74 72 61 52  qRight |= extraR
c2b0: 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ight;.}../*.** T
c2c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61  his function sea
c2d0: 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20  rches pList for 
c2e0: 61 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74  a entry that mat
c2f0: 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d 74 68  ches the iCol-th
c300: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e   column.** of in
c310: 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20  dex pIdx..**.** 
c320: 49 66 20 73 75 63 68 20 61 6e 20 65 78 70 72 65  If such an expre
c330: 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20  ssion is found, 
c340: 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  its index in pLi
c350: 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72  st->a[] is retur
c360: 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78  ned. If.** no ex
c370: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e  pression is foun
c380: 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  d, -1 is returne
c390: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
c3a0: 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20   findIndexCol(. 
c3b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3d0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
c3e0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
c3f0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
c400: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
c410: 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61  sion list to sea
c420: 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61  rch */.  int iBa
c430: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
c440: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
c450: 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73  or for table ass
c460: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64  ociated with pId
c470: 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  x */.  Index *pI
c480: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
c490: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
c4a0: 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20  to match column 
c4b0: 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  of */.  int iCol
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
c4e0: 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61  n of index to ma
c4f0: 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tch */.){.  int 
c500: 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
c510: 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61  *zColl = pIdx->a
c520: 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20  zColl[iCol];..  
c530: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
c540: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
c550: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
c560: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
c570: 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ate(pList->a[i].
c580: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
c590: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
c5a0: 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c  .     && p->iCol
c5b0: 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn==pIdx->aiCol
c5c0: 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26  umn[iCol].     &
c5d0: 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61  & p->iTable==iBa
c5e0: 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  se.    ){.      
c5f0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
c600: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
c610: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73  Seq(pParse, pLis
c620: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
c630: 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
c640: 28 70 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71  (pColl) && 0==sq
c650: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
c660: 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c  ll->zName, zColl
c670: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
c680: 75 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20  urn i;.      }. 
c690: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
c6a0: 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
c6b0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
c6c0: 68 65 20 44 49 53 54 49 4e 43 54 20 65 78 70 72  he DISTINCT expr
c6d0: 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73  ession-list pass
c6e0: 65 64 20 61 73 20 74 68 65 20 74 68 69 72 64 20  ed as the third 
c6f0: 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72  argument.** is r
c700: 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20  edundant..**.** 
c710: 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20  A DISTINCT list 
c720: 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69 66 20  is redundant if 
c730: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
c740: 74 61 69 6e 73 20 73 6f 6d 65 20 73 75 62 73 65  tains some subse
c750: 74 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  t of.** columns 
c760: 74 68 61 74 20 61 72 65 20 75 6e 69 71 75 65 20  that are unique 
c770: 61 6e 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f  and non-null..*/
c780: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 44 69  .static int isDi
c790: 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28  stinctRedundant(
c7a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c7b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
c7c0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
c7d0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
c7e0: 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  abList,        /
c7f0: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
c800: 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
c810: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
c820: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
c830: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
c840: 73 74 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20  st *pDistinct   
c850: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
c860: 74 20 73 65 74 20 74 68 61 74 20 6e 65 65 64 73  t set that needs
c870: 20 74 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20   to be DISTINCT 
c880: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
c890: 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
c8a0: 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  dx;.  int i;    
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61        .  int iBa
c8d0: 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  se;..  /* If the
c8e0: 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  re is more than 
c8f0: 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62  one table or sub
c900: 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46  -select in the F
c910: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20  ROM clause of.  
c920: 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c 20 74  ** this query, t
c930: 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  hen it will not 
c940: 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73  be possible to s
c950: 68 6f 77 20 74 68 61 74 20 74 68 65 20 44 49 53  how that the DIS
c960: 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75  TINCT .  ** clau
c970: 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  se is redundant.
c980: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69   */.  if( pTabLi
c990: 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  st->nSrc!=1 ) re
c9a0: 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20  turn 0;.  iBase 
c9b0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  = pTabList->a[0]
c9c0: 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62  .iCursor;.  pTab
c9d0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30   = pTabList->a[0
c9e0: 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66  ].pTab;..  /* If
c9f0: 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72   any of the expr
ca00: 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50  essions is an IP
ca10: 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c  K column on tabl
ca20: 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65  e iBase, then re
ca30: 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e  turn .  ** true.
ca40: 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69   Note: The (p->i
ca50: 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61  Table==iBase) pa
ca60: 72 74 20 6f 66 20 74 68 69 73 20 74 65 73 74 20  rt of this test 
ca70: 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69 66 20  may be false if 
ca80: 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
ca90: 20 53 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72   SELECT is a cor
caa0: 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72  related sub-quer
cab0: 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
cac0: 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e  0; i<pDistinct->
cad0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
cae0: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
caf0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
cb00: 65 28 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69  e(pDistinct->a[i
cb10: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
cb20: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
cb30: 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d  MN && p->iTable=
cb40: 3d 69 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f  =iBase && p->iCo
cb50: 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20  lumn<0 ) return 
cb60: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f  1;.  }..  /* Loo
cb70: 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e  p through all in
cb80: 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62  dices on the tab
cb90: 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63  le, checking eac
cba0: 68 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d  h to see if it m
cbb0: 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49  akes.  ** the DI
cbc0: 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
cbd0: 20 72 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64   redundant. It d
cbe0: 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a  oes so if:.  **.
cbf0: 20 20 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e    **   1. The in
cc00: 64 65 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e  dex is itself UN
cc10: 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20  IQUE, and.  **. 
cc20: 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20   **   2. All of 
cc30: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  the columns in t
cc40: 68 65 20 69 6e 64 65 78 20 61 72 65 20 65 69 74  he index are eit
cc50: 68 65 72 20 70 61 72 74 20 6f 66 20 74 68 65 20  her part of the 
cc60: 70 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20  pDistinct.  **  
cc70: 20 20 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73      list, or els
cc80: 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
cc90: 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65  se contains a te
cca0: 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rm of the form "
ccb0: 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20  col=X",.  **    
ccc0: 20 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63    where X is a c
ccd0: 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54  onstant value. T
cce0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
ccf0: 75 65 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20  uences of the.  
cd00: 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73  **      comparis
cd10: 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69  on and select-li
cd20: 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d  st expressions m
cd30: 75 73 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20  ust match those 
cd40: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  of the index..  
cd50: 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c  **.  **   3. All
cd60: 20 6f 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20   of those index 
cd70: 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63  columns for whic
cd80: 68 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  h the WHERE clau
cd90: 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a  se does not.  **
cda0: 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20        contain a 
cdb0: 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65  "col=X" term are
cdc0: 20 73 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f   subject to a NO
cdd0: 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  T NULL constrain
cde0: 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49  t..  */.  for(pI
cdf0: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
ce00: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
ce10: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
ce20: 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
ce30: 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69  =OE_None ) conti
ce40: 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  nue;.    for(i=0
ce50: 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; i<pIdx->nKeyCo
ce60: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
ce70: 31 36 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  16 iCol = pIdx->
ce80: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
ce90: 20 20 20 69 66 28 20 30 3d 3d 66 69 6e 64 54 65     if( 0==findTe
cea0: 72 6d 28 70 57 43 2c 20 69 42 61 73 65 2c 20 69  rm(pWC, iBase, i
ceb0: 43 6f 6c 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30  Col, ~(Bitmask)0
cec0: 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 20 29  , WO_EQ, pIdx) )
ced0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 49  {.        int iI
cee0: 64 78 43 6f 6c 20 3d 20 66 69 6e 64 49 6e 64 65  dxCol = findInde
cef0: 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69  xCol(pParse, pDi
cf00: 73 74 69 6e 63 74 2c 20 69 42 61 73 65 2c 20 70  stinct, iBase, p
cf10: 49 64 78 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  Idx, i);.       
cf20: 20 69 66 28 20 69 49 64 78 43 6f 6c 3c 30 20 7c   if( iIdxCol<0 |
cf30: 7c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  | pTab->aCol[iCo
cf40: 6c 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b  l].notNull==0 ){
cf50: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
cf60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
cf70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
cf80: 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  ( i==pIdx->nKeyC
cf90: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ol ){.      /* T
cfa0: 68 69 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65  his index implie
cfb0: 73 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49  s that the DISTI
cfc0: 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 69 73  NCT qualifier is
cfd0: 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20   redundant. */. 
cfe0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
cff0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
d000: 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
d010: 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 67  Estimate the log
d020: 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e  arithm of the in
d030: 70 75 74 20 76 61 6c 75 65 20 74 6f 20 62 61 73  put value to bas
d040: 65 20 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  e 2..*/.static L
d050: 6f 67 45 73 74 20 65 73 74 4c 6f 67 28 4c 6f 67  ogEst estLog(Log
d060: 45 73 74 20 4e 29 7b 0a 20 20 4c 6f 67 45 73 74  Est N){.  LogEst
d070: 20 78 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45   x = sqlite3LogE
d080: 73 74 28 4e 29 3b 0a 20 20 72 65 74 75 72 6e 20  st(N);.  return 
d090: 78 3e 33 33 20 3f 20 78 20 2d 20 33 33 20 3a 20  x>33 ? x - 33 : 
d0a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20  0;.}../*.** Two 
d0b0: 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69  routines for pri
d0c0: 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  nting the conten
d0d0: 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f  t of an sqlite3_
d0e0: 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74  index_info.** st
d0f0: 72 75 63 74 75 72 65 2e 20 20 55 73 65 64 20 66  ructure.  Used f
d100: 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
d110: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20  ebugging only.  
d120: 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51  If neither.** SQ
d130: 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c  LITE_TEST or SQL
d140: 49 54 45 5f 44 45 42 55 47 20 61 72 65 20 64 65  ITE_DEBUG are de
d150: 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73  fined, then thes
d160: 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72  e routines.** ar
d170: 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66  e no-ops..*/.#if
d180: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d190: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
d1a0: 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 57  LE) && defined(W
d1b0: 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
d1c0: 44 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54  D).static void T
d1d0: 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
d1e0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
d1f0: 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  fo *p){.  int i;
d200: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57  .  if( !sqlite3W
d210: 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75  hereTrace ) retu
d220: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
d230: 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
d240: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
d250: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
d260: 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a   constraint[%d]:
d270: 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25   col=%d termid=%
d280: 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d  d op=%d usabled=
d290: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
d2a0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
d2b0: 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d  traint[i].iColum
d2c0: 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  n,.       p->aCo
d2d0: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72  nstraint[i].iTer
d2e0: 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20  mOffset,.       
d2f0: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
d300: 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e  ].op,.       p->
d310: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75  aConstraint[i].u
d320: 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f  sable);.  }.  fo
d330: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64  r(i=0; i<p->nOrd
d340: 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
d350: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
d360: 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64  tf("  orderby[%d
d370: 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25  ]: col=%d desc=%
d380: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
d390: 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72         p->aOrder
d3a0: 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20  By[i].iColumn,. 
d3b0: 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42        p->aOrderB
d3c0: 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a  y[i].desc);.  }.
d3d0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52  }.static void TR
d3e0: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
d3f0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
d400: 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  fo *p){.  int i;
d410: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57  .  if( !sqlite3W
d420: 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75  hereTrace ) retu
d430: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
d440: 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
d450: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
d460: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
d470: 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76   usage[%d]: argv
d480: 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e  Idx=%d omit=%d\n
d490: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
d4a0: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
d4b0: 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49  ntUsage[i].argvI
d4c0: 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e  ndex,.       p->
d4d0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
d4e0: 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20  [i].omit);.  }. 
d4f0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d500: 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64  ntf("  idxNum=%d
d510: 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b  \n", p->idxNum);
d520: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
d530: 72 69 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d  rintf("  idxStr=
d540: 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72  %s\n", p->idxStr
d550: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
d560: 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72  gPrintf("  order
d570: 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22  ByConsumed=%d\n"
d580: 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  , p->orderByCons
d590: 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  umed);.  sqlite3
d5a0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65  DebugPrintf("  e
d5b0: 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c  stimatedCost=%g\
d5c0: 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64  n", p->estimated
d5d0: 43 6f 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cost);.  sqlite3
d5e0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65  DebugPrintf("  e
d5f0: 73 74 69 6d 61 74 65 64 52 6f 77 73 3d 25 6c 6c  stimatedRows=%ll
d600: 64 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74  d\n", p->estimat
d610: 65 64 52 6f 77 73 29 3b 0a 7d 0a 23 65 6c 73 65  edRows);.}.#else
d620: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
d630: 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65  DX_INPUTS(A).#de
d640: 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f  fine TRACE_IDX_O
d650: 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66  UTPUTS(A).#endif
d660: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d670: 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
d680: 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75  INDEX./*.** Retu
d690: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 57  rn TRUE if the W
d6a0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
d6b0: 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66   pTerm is of a f
d6c0: 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20  orm where it.** 
d6d0: 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 77 69  could be used wi
d6e0: 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61  th an index to a
d6f0: 63 63 65 73 73 20 70 53 72 63 2c 20 61 73 73 75  ccess pSrc, assu
d700: 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69  ming an appropri
d710: 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69  ate.** index exi
d720: 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sted..*/.static 
d730: 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65  int termCanDrive
d740: 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 54 65  Index(.  WhereTe
d750: 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20  rm *pTerm,      
d760: 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
d770: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
d780: 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63  check */.  struc
d790: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
d7a0: 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62  pSrc,     /* Tab
d7b0: 6c 65 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  le we are trying
d7c0: 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20   to access */.  
d7d0: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d7f0: 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65  * Tables in oute
d800: 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a  r loops of the j
d810: 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  oin */.){.  char
d820: 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72   aff;.  if( pTer
d830: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70  m->leftCursor!=p
d840: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72  Src->iCursor ) r
d850: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
d860: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
d870: 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20 72   & WO_EQ)==0 ) r
d880: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
d890: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
d8a0: 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d  ht & notReady)!=
d8b0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
d8c0: 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  if( pTerm->u.lef
d8d0: 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  tColumn<0 ) retu
d8e0: 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53  rn 0;.  aff = pS
d8f0: 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  rc->pTab->aCol[p
d900: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
d910: 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
d920: 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
d930: 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72  xAffinityOk(pTer
d940: 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29  m->pExpr, aff) )
d950: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
d960: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
d970: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d980: 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
d990: 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  INDEX./*.** Gene
d9a0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e  rate code to con
d9b0: 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78  struct the Index
d9c0: 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61   object for an a
d9d0: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a  utomatic index.*
d9e0: 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20  * and to set up 
d9f0: 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f  the WhereLevel o
da00: 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20  bject pLevel so 
da10: 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 67 65  that the code ge
da20: 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73  nerator.** makes
da30: 20 75 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f   use of the auto
da40: 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a  matic index..*/.
da50: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73  static void cons
da60: 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e  tructAutomaticIn
da70: 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
da80: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
da90: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
daa0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
dab0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
dac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
dad0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
dae0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
daf0: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
db00: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
db10: 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74  se term to get t
db20: 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f  he next index */
db30: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
db40: 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ady,           /
db50: 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
db60: 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
db70: 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68  vailable */.  Wh
db80: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
db90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
dba0: 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72  te new index her
dbb0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b  e */.){.  int nK
dbc0: 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  eyCol;          
dbd0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
dbe0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
dbf0: 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
dc00: 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  dex */.  WhereTe
dc10: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
dc20: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
dc30: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
dc40: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
dc50: 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64  hereTerm *pWCEnd
dc60: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  ;          /* En
dc70: 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f  d of pWC->a[] */
dc80: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dca0: 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62  * Object describ
dcb0: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ing the transien
dcc0: 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62  t index */.  Vdb
dcd0: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
dce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70           /* Prep
dcf0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75  ared statement u
dd00: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
dd10: 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49  n */.  int addrI
dd20: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
dd30: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
dd40: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
dd50: 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20  ion bypass jump 
dd60: 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
dd70: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
dd80: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65   /* The table be
dd90: 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20  ing indexed */. 
dda0: 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ddc0: 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78  Top of the index
ddd0: 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20   fill loop */.  
dde0: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20  int regRecord;  
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
de00: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
de10: 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  an index record 
de20: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de40: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74   /* Column count
de50: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  er */.  int i;  
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
de80: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42  ter */.  int mxB
de90: 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  itCol;          
dea0: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
deb0: 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e  column in pSrc->
dec0: 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c  colUsed */.  Col
ded0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
dee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
def0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
df00: 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f  o on a column */
df10: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
df20: 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oop;           /
df30: 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65 63  * The Loop objec
df40: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 6f  t */.  char *zNo
df50: 74 55 73 65 64 3b 20 20 20 20 20 20 20 20 20 20  tUsed;          
df60: 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63     /* Extra spac
df70: 65 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20  e on the end of 
df80: 70 49 64 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73  pIdx */.  Bitmas
df90: 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20  k idxCols;      
dfa0: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20        /* Bitmap 
dfb0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20  of columns used 
dfc0: 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a  for indexing */.
dfd0: 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43    Bitmask extraC
dfe0: 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ols;          /*
dff0: 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74   Bitmap of addit
e000: 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f  ional columns */
e010: 0a 20 20 75 38 20 73 65 6e 74 57 61 72 6e 69 6e  .  u8 sentWarnin
e020: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  g = 0;         /
e030: 2a 20 54 72 75 65 20 69 66 20 61 20 77 61 72 6e  * True if a warn
e040: 6e 69 6e 67 20 68 61 73 20 62 65 65 6e 20 69 73  ning has been is
e050: 73 75 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65  sued */..  /* Ge
e060: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73  nerate code to s
e070: 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63 72 65  kip over the cre
e080: 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61  ation and initia
e090: 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  lization of the.
e0a0: 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69    ** transient i
e0b0: 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20  ndex on 2nd and 
e0c0: 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61  subsequent itera
e0d0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f  tions of the loo
e0e0: 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72  p. */.  v = pPar
e0f0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
e100: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61  ert( v!=0 );.  a
e110: 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  ddrInit = sqlite
e120: 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
e130: 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  );..  /* Count t
e140: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
e150: 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
e160: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  e added to the i
e170: 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73  ndex.  ** and us
e180: 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52  ed to match WHER
e190: 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
e1a0: 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f  ints */.  nKeyCo
e1b0: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20  l = 0;.  pTable 
e1c0: 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
e1d0: 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61  pWCEnd = &pWC->a
e1e0: 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  [pWC->nTerm];.  
e1f0: 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
e200: 70 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c  pWLoop;.  idxCol
e210: 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65  s = 0;.  for(pTe
e220: 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  rm=pWC->a; pTerm
e230: 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  <pWCEnd; pTerm++
e240: 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43  ){.    if( termC
e250: 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
e260: 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  rm, pSrc, notRea
e270: 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  dy) ){.      int
e280: 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75   iCol = pTerm->u
e290: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
e2a0: 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b     Bitmask cMask
e2b0: 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d   = iCol>=BMS ? M
e2c0: 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20  ASKBIT(BMS-1) : 
e2d0: 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20  MASKBIT(iCol);. 
e2e0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
e2f0: 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
e300: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
e310: 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
e320: 20 69 66 28 20 21 73 65 6e 74 57 61 72 6e 69 6e   if( !sentWarnin
e330: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
e340: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
e350: 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45  WARNING_AUTOINDE
e360: 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  X,.            "
e370: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
e380: 6f 6e 20 25 73 28 25 73 29 22 2c 20 70 54 61 62  on %s(%s)", pTab
e390: 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  le->zName,.     
e3a0: 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61         pTable->a
e3b0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
e3c0: 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 74 57 61  ;.        sentWa
e3d0: 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  rning = 1;.     
e3e0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69 64   }.      if( (id
e3f0: 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
e400: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
e410: 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
e420: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f  (pParse->db, pLo
e430: 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29  op, nKeyCol+1) )
e440: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
e450: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e   pLoop->aLTerm[n
e460: 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72  KeyCol++] = pTer
e470: 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f  m;.        idxCo
e480: 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20  ls |= cMask;.   
e490: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
e4a0: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c   assert( nKeyCol
e4b0: 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75  >0 );.  pLoop->u
e4c0: 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f  .btree.nEq = pLo
e4d0: 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65  op->nLTerm = nKe
e4e0: 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77  yCol;.  pLoop->w
e4f0: 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
e500: 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45  OLUMN_EQ | WHERE
e510: 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
e520: 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20  E_INDEXED.      
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
e540: 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
e550: 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  X;..  /* Count t
e560: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64  he number of add
e570: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
e580: 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65  needed to create
e590: 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67   a.  ** covering
e5a0: 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65   index.  A "cove
e5b0: 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61  ring index" is a
e5c0: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  n index that con
e5d0: 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63  tains all.  ** c
e5e0: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20  olumns that are 
e5f0: 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75  needed by the qu
e600: 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76  ery.  With a cov
e610: 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65  ering index, the
e620: 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
e630: 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73  able never needs
e640: 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e   to be accessed.
e650: 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69    Automatic indi
e660: 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ces must.  ** be
e670: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
e680: 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e  x because the in
e690: 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  dex will not be 
e6a0: 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20  updated if the. 
e6b0: 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
e6c0: 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74  le changes and t
e6d0: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
e6e0: 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62  le cannot both b
e6f0: 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74  e used.  ** if t
e700: 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79  hey go out of sy
e710: 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61  nc..  */.  extra
e720: 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  Cols = pSrc->col
e730: 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73  Used & (~idxCols
e740: 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   | MASKBIT(BMS-1
e750: 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d  ));.  mxBitCol =
e760: 20 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e   (pTable->nCol >
e770: 3d 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31  = BMS-1) ? BMS-1
e780: 20 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   : pTable->nCol;
e790: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
e7a0: 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31  ble->nCol==BMS-1
e7b0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
e7c0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d  pTable->nCol==BM
e7d0: 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  S-2 );.  for(i=0
e7e0: 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b  ; i<mxBitCol; i+
e7f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72  +){.    if( extr
e800: 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28  aCols & MASKBIT(
e810: 69 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a  i) ) nKeyCol++;.
e820: 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
e830: 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49  colUsed & MASKBI
e840: 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20  T(BMS-1) ){.    
e850: 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c  nKeyCol += pTabl
e860: 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20  e->nCol - BMS + 
e870: 31 3b 0a 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e  1;.  }.  pLoop->
e880: 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
e890: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45  _COLUMN_EQ | WHE
e8a0: 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20  RE_IDX_ONLY;..  
e8b0: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  /* Construct the
e8c0: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f   Index object to
e8d0: 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20 69   describe this i
e8e0: 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d  ndex */.  pIdx =
e8f0: 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65   sqlite3Allocate
e900: 49 6e 64 65 78 4f 62 6a 65 63 74 28 70 50 61 72  IndexObject(pPar
e910: 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b  se->db, nKeyCol+
e920: 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29  1, 0, &zNotUsed)
e930: 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20  ;.  if( pIdx==0 
e940: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 6f  ) return;.  pLoo
e950: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
e960: 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78  x = pIdx;.  pIdx
e970: 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d  ->zName = "auto-
e980: 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e  index";.  pIdx->
e990: 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  pTable = pTable;
e9a0: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43  .  n = 0;.  idxC
e9b0: 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  ols = 0;.  for(p
e9c0: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65  Term=pWC->a; pTe
e9d0: 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
e9e0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72  ++){.    if( ter
e9f0: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
ea00: 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52  Term, pSrc, notR
ea10: 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69  eady) ){.      i
ea20: 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d  nt iCol = pTerm-
ea30: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
ea40: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61       Bitmask cMa
ea50: 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f  sk = iCol>=BMS ?
ea60: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
ea70: 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b  : MASKBIT(iCol);
ea80: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ea90: 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a   iCol==BMS-1 );.
eaa0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
eab0: 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  iCol==BMS );.   
eac0: 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20     if( (idxCols 
ead0: 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  & cMask)==0 ){. 
eae0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20         Expr *pX 
eaf0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
eb00: 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20          idxCols 
eb10: 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20  |= cMask;.      
eb20: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
eb30: 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  [n] = pTerm->u.l
eb40: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
eb50: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
eb60: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
eb70: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
eb80: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
eb90: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70  ight);.        p
eba0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
ebb0: 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f   ALWAYS(pColl) ?
ebc0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20   pColl->zName : 
ebd0: 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
ebe0: 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    n++;.      }. 
ebf0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
ec00: 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70  t( (u32)n==pLoop
ec10: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b  ->u.btree.nEq );
ec20: 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74  ..  /* Add addit
ec30: 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65  ional columns ne
ec40: 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  eded to make the
ec50: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
ec60: 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76   into.  ** a cov
ec70: 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  ering index */. 
ec80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69   for(i=0; i<mxBi
ec90: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
eca0: 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20  if( extraCols & 
ecb0: 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20 20  MASKBIT(i) ){.  
ecc0: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
ecd0: 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[n] = i;.     
ece0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
ecf0: 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20   = "BINARY";.   
ed00: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
ed10: 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f  }.  if( pSrc->co
ed20: 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28  lUsed & MASKBIT(
ed30: 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f  BMS-1) ){.    fo
ed40: 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61  r(i=BMS-1; i<pTa
ed50: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  ble->nCol; i++){
ed60: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43  .      pIdx->aiC
ed70: 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20  olumn[n] = i;.  
ed80: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
ed90: 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  [n] = "BINARY";.
eda0: 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d        n++;.    }
edb0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
edc0: 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70  ==nKeyCol );.  p
edd0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
ede0: 20 3d 20 2d 31 3b 0a 20 20 70 49 64 78 2d 3e 61   = -1;.  pIdx->a
edf0: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41  zColl[n] = "BINA
ee00: 52 59 22 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  RY";..  /* Creat
ee10: 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
ee20: 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72  index */.  asser
ee30: 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  t( pLevel->iIdxC
ee40: 75 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65  ur>=0 );.  pLeve
ee50: 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61  l->iIdxCur = pPa
ee60: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
ee70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ee80: 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69  (v, OP_OpenAutoi
ee90: 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  ndex, pLevel->iI
eea0: 64 78 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31  dxCur, nKeyCol+1
eeb0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
eec0: 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
eed0: 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 56 64  rse, pIdx);.  Vd
eee0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
eef0: 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e  or %s", pTable->
ef00: 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46  zName));..  /* F
ef10: 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ill the automati
ef20: 63 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e  c index with con
ef30: 74 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f  tent */.  addrTo
ef40: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
ef50: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
ef60: 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  nd, pLevel->iTab
ef70: 43 75 72 29 3b 0a 20 20 72 65 67 52 65 63 6f 72  Cur);.  regRecor
ef80: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
ef90: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
efa0: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
efb0: 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
efc0: 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69   pIdx, pLevel->i
efd0: 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72  TabCur, regRecor
efe0: 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d, 0, 0, 0, 0);.
eff0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f000: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
f010: 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert, pLevel->iId
f020: 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29  xCur, regRecord)
f030: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
f040: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
f050: 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
f060: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
f070: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
f080: 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
f090: 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20  r, addrTop+1);. 
f0a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
f0b0: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53  geP5(v, SQLITE_S
f0c0: 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e  TMTSTATUS_AUTOIN
f0d0: 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  DEX);.  sqlite3V
f0e0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
f0f0: 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74  ddrTop);.  sqlit
f100: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
f110: 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
f120: 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d  rd);.  .  /* Jum
f130: 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70  p here when skip
f140: 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
f150: 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  ization */.  sql
f160: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
f170: 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 7d  (v, addrInit);.}
f180: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
f190: 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
f1a0: 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64  _INDEX */..#ifnd
f1b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
f1c0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
f1d0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70  * Allocate and p
f1e0: 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74  opulate an sqlit
f1f0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
f200: 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 74  ructure. It is t
f210: 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  he .** responsib
f220: 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
f230: 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
f240: 79 20 72 65 6c 65 61 73 65 20 74 68 65 20 73 74  y release the st
f250: 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61  ructure.** by pa
f260: 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65  ssing the pointe
f270: 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
f280: 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73  is function to s
f290: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
f2a0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
f2b0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c  _index_info *all
f2c0: 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a  ocateIndexInfo(.
f2d0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
f2e0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
f2f0: 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53 72  pWC,.  struct Sr
f300: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
f310: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ,.  ExprList *pO
f320: 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20  rderBy.){.  int 
f330: 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72  i, j;.  int nTer
f340: 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  m;.  struct sqli
f350: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
f360: 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
f370: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
f380: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a  _index_orderby *
f390: 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73  pIdxOrderBy;.  s
f3a0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
f3b0: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
f3c0: 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20  sage *pUsage;.  
f3d0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
f3e0: 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  ;.  int nOrderBy
f3f0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
f400: 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
f410: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
f420: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73  e number of poss
f430: 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73  ible WHERE claus
f440: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65  e constraints re
f450: 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  ferring.  ** to 
f460: 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62  this virtual tab
f470: 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54  le */.  for(i=nT
f480: 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  erm=0, pTerm=pWC
f490: 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
f4a0: 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
f4b0: 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
f4c0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
f4d0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
f4e0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
f4f0: 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
f500: 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  o(pTerm->eOperat
f510: 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20  or & ~WO_EQUIV) 
f520: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
f530: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
f540: 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
f550: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
f560: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
f570: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
f580: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
f590: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
f5a0: 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  LL );.    if( (p
f5b0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
f5c0: 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f  & ~(WO_ISNULL|WO
f5d0: 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20 63 6f  _EQUIV))==0 ) co
f5e0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
f5f0: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
f600: 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
f610: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72  ntinue;.    nTer
f620: 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  m++;.  }..  /* I
f630: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
f640: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f  lause contains o
f650: 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  nly columns in t
f660: 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a  he current .  **
f670: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
f680: 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  hen allocate spa
f690: 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65  ce for the aOrde
f6a0: 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a  rBy part of.  **
f6b0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
f6c0: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
f6d0: 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72  e..  */.  nOrder
f6e0: 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f  By = 0;.  if( pO
f6f0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e  rderBy ){.    in
f700: 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  t n = pOrderBy->
f710: 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
f720: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
f730: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
f740: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
f750: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
f760: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
f770: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72  _COLUMN || pExpr
f780: 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e  ->iTable!=pSrc->
f790: 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b  iCursor ) break;
f7a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
f7b0: 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64  ==n){.      nOrd
f7c0: 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a  erBy = n;.    }.
f7d0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
f7e0: 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  te the sqlite3_i
f7f0: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
f800: 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49  ure.  */.  pIdxI
f810: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
f820: 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
f830: 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49  ->db, sizeof(*pI
f840: 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20  dxInfo).        
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f860: 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49     + (sizeof(*pI
f870: 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66  dxCons) + sizeof
f880: 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d  (*pUsage))*nTerm
f890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69              + si
f8b0: 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42  zeof(*pIdxOrderB
f8c0: 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20  y)*nOrderBy );. 
f8d0: 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
f8e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
f8f0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
f900: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29  "out of memory")
f910: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
f920: 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
f930: 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75  lize the structu
f940: 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  re.  The sqlite3
f950: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
f960: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20  cture contains. 
f970: 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20   ** many fields 
f980: 74 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65  that are declare
f990: 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65  d "const" to pre
f9a0: 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20  vent xBestIndex 
f9b0: 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69  from.  ** changi
f9c0: 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76  ng them.  We hav
f9d0: 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e  e to do some fun
f9e0: 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72  ky casting in or
f9f0: 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74  der to.  ** init
fa00: 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65  ialize those fie
fa10: 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78  lds..  */.  pIdx
fa20: 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73  Cons = (struct s
fa30: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
fa40: 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e  straint*)&pIdxIn
fa50: 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64  fo[1];.  pIdxOrd
fa60: 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73  erBy = (struct s
fa70: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
fa80: 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b  erby*)&pIdxCons[
fa90: 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65  nTerm];.  pUsage
faa0: 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
fab0: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
fac0: 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78  int_usage*)&pIdx
fad0: 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79  OrderBy[nOrderBy
fae0: 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  ];.  *(int*)&pId
faf0: 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
fb00: 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28  nt = nTerm;.  *(
fb10: 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
fb20: 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65  nOrderBy = nOrde
fb30: 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  rBy;.  *(struct 
fb40: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
fb50: 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
fb60: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
fb70: 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20  t = pIdxCons;.  
fb80: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
fb90: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a  _index_orderby**
fba0: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64  )&pIdxInfo->aOrd
fbb0: 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72  erBy = pIdxOrder
fbc0: 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
fbd0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
fbe0: 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29  straint_usage**)
fbf0: 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
fc00: 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20  traintUsage =.  
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc50: 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28   pUsage;..  for(
fc60: 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  i=j=0, pTerm=pWC
fc70: 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
fc80: 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
fc90: 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20  {.    u8 op;.   
fca0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
fcb0: 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e  Cursor != pSrc->
fcc0: 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e  iCursor ) contin
fcd0: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
fce0: 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65  IsPowerOfTwo(pTe
fcf0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
fd00: 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20  ~WO_EQUIV) );.  
fd10: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
fd20: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
fd30: 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IN );.    test
fd40: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
fd50: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
fd60: 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  LL );.    testca
fd70: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
fd80: 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b  ator & WO_ALL );
fd90: 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
fda0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57  >eOperator & ~(W
fdb0: 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49  O_ISNULL|WO_EQUI
fdc0: 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  V))==0 ) continu
fdd0: 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
fde0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
fdf0: 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  _VNULL ) continu
fe00: 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  e;.    pIdxCons[
fe10: 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65  j].iColumn = pTe
fe20: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
fe30: 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a  ;.    pIdxCons[j
fe40: 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20  ].iTermOffset = 
fe50: 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75 38 29  i;.    op = (u8)
fe60: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
fe70: 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69   & WO_ALL;.    i
fe80: 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f  f( op==WO_IN ) o
fe90: 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20 70  p = WO_EQ;.    p
fea0: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20  IdxCons[j].op = 
feb0: 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64  op;.    /* The d
fec0: 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74  irect assignment
fed0: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
fee0: 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c   line is possibl
fef0: 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20  e only because. 
ff00: 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e     ** the WO_ an
ff10: 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  d SQLITE_INDEX_C
ff20: 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73  ONSTRAINT_ codes
ff30: 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20   are identical. 
ff40: 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c   The.    ** foll
ff50: 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65  owing asserts ve
ff60: 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20  rify this fact. 
ff70: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  */.    assert( W
ff80: 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_EQ==SQLITE_IND
ff90: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51  EX_CONSTRAINT_EQ
ffa0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ffb0: 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LT==SQLITE_IN
ffc0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
ffd0: 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
ffe0: 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49   WO_LE==SQLITE_I
fff0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
10000 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LE );.    assert
10010 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_GT==SQLITE_
10020 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
10030 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _GT );.    asser
10040 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45  t( WO_GE==SQLITE
10050 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
10060 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65  T_GE );.    asse
10070 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51  rt( WO_MATCH==SQ
10080 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
10090 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20  RAINT_MATCH );. 
100a0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
100b0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
100c0 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54  O_IN|WO_EQ|WO_LT
100d0 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_LE|WO_GT|WO_
100e0 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a  GE|WO_MATCH) );.
100f0 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66      j++;.  }.  f
10100 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
10110 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  By; i++){.    Ex
10120 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
10130 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
10140 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42  ;.    pIdxOrderB
10150 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  y[i].iColumn = p
10160 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
10170 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
10180 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42  ].desc = pOrderB
10190 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
101a0 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
101b0 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a   pIdxInfo;.}../*
101c0 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62  .** The table ob
101d0 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20 70  ject reference p
101e0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
101f0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
10200 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
10210 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74 20   must represent 
10220 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
10230 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
10240 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74  nvokes the xBest
10250 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f  Index().** metho
10260 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  d of the virtual
10270 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
10280 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
10290 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  fo object that.*
102a0 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74 68  * comes in as th
102b0 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74  e 3rd argument t
102c0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
102d0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
102e0 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73  or occurs, pPars
102f0 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  e is populated w
10300 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ith an error mes
10310 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f  sage and a.** no
10320 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20  n-zero value is 
10330 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
10340 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e  ise, 0 is return
10350 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75  ed and the outpu
10360 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65  t.** part of the
10370 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
10380 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
10390 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e   left populated.
103a0 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
103b0 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69  r not an error i
103c0 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69  s returned, it i
103d0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
103e0 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63  lity of the.** c
103f0 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
10400 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53  lly free p->idxS
10410 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46  tr if p->needToF
10420 72 65 65 49 64 78 53 74 72 20 69 6e 64 69 63 61  reeIdxStr indica
10430 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73  tes.** that this
10440 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f   is required..*/
10450 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62  .static int vtab
10460 42 65 73 74 49 6e 64 65 78 28 50 61 72 73 65 20  BestIndex(Parse 
10470 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
10480 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pTab, sqlite3_in
10490 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20  dex_info *p){.  
104a0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
104b0 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74  tab = sqlite3Get
104c0 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  VTable(pParse->d
104d0 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b  b, pTab)->pVtab;
104e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
104f0 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44 58  rc;..  TRACE_IDX
10500 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63  _INPUTS(p);.  rc
10510 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c   = pVtab->pModul
10520 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56  e->xBestIndex(pV
10530 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45  tab, p);.  TRACE
10540 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b  _IDX_OUTPUTS(p);
10550 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
10560 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
10570 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
10580 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  M ){.      pPars
10590 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
105a0 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  led = 1;.    }el
105b0 73 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a  se if( !pVtab->z
105c0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
105d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
105e0 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71  pParse, "%s", sq
105f0 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 29  lite3ErrStr(rc))
10600 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10610 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
10620 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
10630 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29   pVtab->zErrMsg)
10640 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
10650 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62  lite3_free(pVtab
10660 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56  ->zErrMsg);.  pV
10670 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
10680 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
10690 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
106a0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70  i++){.    if( !p
106b0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
106c0 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43  .usable && p->aC
106d0 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
106e0 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b  ].argvIndex>0 ){
106f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
10700 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
10710 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65            "table
10720 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20   %s: xBestIndex 
10730 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61  returned an inva
10740 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d  lid plan", pTab-
10750 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
10760 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61   }..  return pPa
10770 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e  rse->nErr;.}.#en
10780 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
10790 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
107a0 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 0a 23  UALTABLE) */...#
107b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
107c0 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
107d0 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  T4./*.** Estimat
107e0 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  e the location o
107f0 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b  f a particular k
10800 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79  ey among all key
10810 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78  s in an.** index
10820 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  .  Store the res
10830 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61 73  ults in aStat as
10840 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
10850 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20     aStat[0]     
10860 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
10870 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70  rows less than p
10880 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b  Val.**    aStat[
10890 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d  1]      Est. num
108a0 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61  ber of rows equa
108b0 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20  l to pVal.**.** 
108c0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
108d0 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a   on success..*/.
108e0 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
108f0 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61 72  eKeyStats(.  Par
10900 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
10910 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
10920 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
10930 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
10940 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10950 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e   /* Index to con
10960 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20  sider domain of 
10970 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
10980 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20 20  ord *pRec,      
10990 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76 61   /* Vector of va
109a0 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65 72  lues to consider
109b0 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55   */.  int roundU
109c0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
109d0 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66    /* Round up if
109e0 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f   true.  Round do
109f0 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20  wn if false */. 
10a00 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20   tRowcnt *aStat 
10a10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10a20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74 74  OUT: stats writt
10a30 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  en here */.){.  
10a40 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61  IndexSample *aSa
10a50 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61  mple = pIdx->aSa
10a60 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  mple;.  int iCol
10a70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10a80 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
10a90 72 65 71 75 69 72 65 64 20 73 74 61 74 73 20 69  required stats i
10aa0 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f  n anEq[] etc. */
10ab0 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b  .  int iMin = 0;
10ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10ad0 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c  * Smallest sampl
10ae0 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64  e not yet tested
10af0 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 49   */.  int i = pI
10b00 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 20 20 20  dx->nSample;    
10b10 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61    /* Smallest sa
10b20 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e  mple larger than
10b30 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65   or equal to pRe
10b40 63 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73 74  c */.  int iTest
10b50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10b60 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c     /* Next sampl
10b70 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69  e to test */.  i
10b80 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20  nt res;         
10b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10ba0 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73  sult of comparis
10bb0 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
10bc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10bd0 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50  DEBUG.  UNUSED_P
10be0 41 52 41 4d 45 54 45 52 28 20 70 50 61 72 73 65  ARAMETER( pParse
10bf0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
10c00 65 72 74 28 20 70 52 65 63 21 3d 30 20 29 3b 0a  ert( pRec!=0 );.
10c10 20 20 69 43 6f 6c 20 3d 20 70 52 65 63 2d 3e 6e    iCol = pRec->n
10c20 46 69 65 6c 64 20 2d 20 31 3b 0a 20 20 61 73 73  Field - 1;.  ass
10c30 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70  ert( pIdx->nSamp
10c40 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  le>0 );.  assert
10c50 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30  ( pRec->nField>0
10c60 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e   && iCol<pIdx->n
10c70 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 20 20 64  SampleCol );.  d
10c80 6f 7b 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28  o{.    iTest = (
10c90 69 4d 69 6e 2b 69 29 2f 32 3b 0a 20 20 20 20 72  iMin+i)/2;.    r
10ca0 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
10cb0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
10cc0 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 6e 2c 20  ample[iTest].n, 
10cd0 61 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 70  aSample[iTest].p
10ce0 2c 20 70 52 65 63 29 3b 0a 20 20 20 20 69 66 28  , pRec);.    if(
10cf0 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20   res<0 ){.      
10d00 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a  iMin = iTest+1;.
10d10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10d20 20 69 20 3d 20 69 54 65 73 74 3b 0a 20 20 20 20   i = iTest;.    
10d30 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 65 73 20  }.  }while( res 
10d40 26 26 20 69 4d 69 6e 3c 69 20 29 3b 0a 0a 23 69  && iMin<i );..#i
10d50 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
10d60 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  G.  /* The follo
10d70 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74  wing assert stat
10d80 65 6d 65 6e 74 73 20 63 68 65 63 6b 20 74 68 61  ements check tha
10d90 74 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61  t the binary sea
10da0 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20 61 62  rch code.  ** ab
10db0 6f 76 65 20 66 6f 75 6e 64 20 74 68 65 20 72 69  ove found the ri
10dc0 67 68 74 20 61 6e 73 77 65 72 2e 20 54 68 69 73  ght answer. This
10dd0 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 6e 6f   block serves no
10de0 20 70 75 72 70 6f 73 65 20 6f 74 68 65 72 0a 20   purpose other. 
10df0 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e 76 6f   ** than to invo
10e00 6b 65 20 74 68 65 20 61 73 73 65 72 74 73 2e 20  ke the asserts. 
10e10 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d 30   */.  if( res==0
10e20 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 28 72   ){.    /* If (r
10e30 65 73 3d 3d 30 29 20 69 73 20 74 72 75 65 2c 20  es==0) is true, 
10e40 74 68 65 6e 20 73 61 6d 70 6c 65 20 24 69 20 6d  then sample $i m
10e50 75 73 74 20 62 65 20 65 71 75 61 6c 20 74 6f 20  ust be equal to 
10e60 70 52 65 63 20 2a 2f 0a 20 20 20 20 61 73 73 65  pRec */.    asse
10e70 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d  rt( i<pIdx->nSam
10e80 70 6c 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ple );.    asser
10e90 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 56 64 62  t( 0==sqlite3Vdb
10ea0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
10eb0 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61  Sample[i].n, aSa
10ec0 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29  mple[i].p, pRec)
10ed0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61  .         || pPa
10ee0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
10ef0 61 69 6c 65 64 20 29 3b 0a 20 20 7d 65 6c 73 65  ailed );.  }else
10f00 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69  {.    /* Otherwi
10f10 73 65 2c 20 70 52 65 63 20 6d 75 73 74 20 62 65  se, pRec must be
10f20 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 73 61   smaller than sa
10f30 6d 70 6c 65 20 24 69 20 61 6e 64 20 6c 61 72 67  mple $i and larg
10f40 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 73  er than.    ** s
10f50 61 6d 70 6c 65 20 28 24 69 2d 31 29 2e 20 20 2a  ample ($i-1).  *
10f60 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d  /.    assert( i=
10f70 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 0a  =pIdx->nSample .
10f80 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
10f90 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
10fa0 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e  pare(aSample[i].
10fb0 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c  n, aSample[i].p,
10fc0 20 70 52 65 63 29 3e 30 0a 20 20 20 20 20 20 20   pRec)>0.       
10fd0 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
10fe0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
10ff0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d  .    assert( i==
11000 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71  0.         || sq
11010 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
11020 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
11030 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  -1].n, aSample[i
11040 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30 0a 20  -1].p, pRec)<0. 
11050 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
11060 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
11070 6c 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  led );.  }.#endi
11080 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54  f /* ifdef SQLIT
11090 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 20 20 2f 2a  E_DEBUG */..  /*
110a0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
110b0 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68  aSample[i] is th
110c0 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 74  e first sample t
110d0 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
110e0 68 61 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61  han.  ** or equa
110f0 6c 20 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69  l to pVal.  Or i
11100 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  f i==pIdx->nSamp
11110 6c 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d  le, then all sam
11120 70 6c 65 73 20 61 72 65 20 6c 65 73 73 0a 20 20  ples are less.  
11130 2a 2a 20 74 68 61 6e 20 70 56 61 6c 2e 20 20 49  ** than pVal.  I
11140 66 20 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56  f aSample[i]==pV
11150 61 6c 2c 20 74 68 65 6e 20 72 65 73 3d 3d 30 2e  al, then res==0.
11160 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 3d  .  */.  if( res=
11170 3d 30 20 29 7b 0a 20 20 20 20 61 53 74 61 74 5b  =0 ){.    aStat[
11180 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  0] = aSample[i].
11190 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  anLt[iCol];.    
111a0 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70  aStat[1] = aSamp
111b0 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d  le[i].anEq[iCol]
111c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
111d0 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69  Rowcnt iLower, i
111e0 55 70 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20  Upper, iGap;.   
111f0 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20   if( i==0 ){.   
11200 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20     iLower = 0;. 
11210 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 53       iUpper = aS
11220 61 6d 70 6c 65 5b 30 5d 2e 61 6e 4c 74 5b 69 43  ample[0].anLt[iC
11230 6f 6c 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ol];.    }else{.
11240 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 69        iUpper = i
11250 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  >=pIdx->nSample 
11260 3f 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74  ? pIdx->aiRowEst
11270 5b 30 5d 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d  [0] : aSample[i]
11280 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20  .anLt[iCol];.   
11290 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d     iLower = aSam
112a0 70 6c 65 5b 69 2d 31 5d 2e 61 6e 45 71 5b 69 43  ple[i-1].anEq[iC
112b0 6f 6c 5d 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d  ol] + aSample[i-
112c0 31 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20  1].anLt[iCol];. 
112d0 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 31     }.    aStat[1
112e0 5d 20 3d 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43  ] = (pIdx->nKeyC
112f0 6f 6c 3e 69 43 6f 6c 20 3f 20 70 49 64 78 2d 3e  ol>iCol ? pIdx->
11300 61 41 76 67 45 71 5b 69 43 6f 6c 5d 20 3a 20 31  aAvgEq[iCol] : 1
11310 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65  );.    if( iLowe
11320 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20  r>=iUpper ){.   
11330 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20     iGap = 0;.   
11340 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
11350 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c  ap = iUpper - iL
11360 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ower;.    }.    
11370 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20  if( roundUp ){. 
11380 20 20 20 20 20 69 47 61 70 20 3d 20 28 69 47 61       iGap = (iGa
11390 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73  p*2)/3;.    }els
113a0 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  e{.      iGap = 
113b0 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20  iGap/3;.    }.  
113c0 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f    aStat[0] = iLo
113d0 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a  wer + iGap;.  }.
113e0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
113f0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
11400 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a  OR_STAT4 */../*.
11410 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11420 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69   is used to esti
11430 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
11440 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
11450 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20  l be visited.** 
11460 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69  by scanning an i
11470 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65  ndex for a range
11480 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20   of values. The 
11490 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61  range may have a
114a0 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64  n upper.** bound
114b0 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c  , a lower bound,
114c0 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48   or both. The WH
114d0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
114e0 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70   that set the up
114f0 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72  per.** and lower
11500 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72   bounds are repr
11510 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65  esented by pLowe
11520 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73  r and pUpper res
11530 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a  pectively. For.*
11540 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  * example, assum
11550 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70  ing that index p
11560 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a   is on t1(a):.**
11570 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
11580 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
11590 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20  D a < ? ....**  
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115b0 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f    |_____|   |___
115c0 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __|.**          
115d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
115e0 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
115f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11600 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72  pLower    pUpper
11610 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
11620 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72   of the upper or
11630 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20   lower bound is 
11640 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
11650 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64  n NULL is passed
11660 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20   in.** place of 
11670 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
11680 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  g WhereTerm..**.
11690 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20  ** The value in 
116a0 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d  (pBuilder->pNew-
116b0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73  >u.btree.nEq) is
116c0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
116d0 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d  e index.** colum
116e0 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  n subject to the
116f0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
11700 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e  t. Or, equivalen
11710 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  tly, the number 
11720 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63  of.** equality c
11730 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d  onstraints optim
11740 69 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f 70  ized by the prop
11750 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e  osed index scan.
11760 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a   For example,.**
11770 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20   assuming index 
11780 70 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29  p is on t1(a, b)
11790 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75  , and the SQL qu
117a0 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery is:.**.**   
117b0 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
117c0 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20  E a = ? AND b > 
117d0 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a  ? AND b < ? ....
117e0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69  **.** then nEq i
117f0 73 20 73 65 74 20 74 6f 20 31 20 28 61 73 20 74  s set to 1 (as t
11800 68 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63  he range restric
11810 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69  ted column, b, i
11820 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  s the second .**
11830 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
11840 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e  n of the index).
11850 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65 72   Or, if the quer
11860 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
11870 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
11880 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20  a > ? AND a < ? 
11890 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e  ....**.** then n
118a0 45 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a  Eq is set to 0..
118b0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
118c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
118d0 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65  ed, *pnOut is se
118e0 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  t to the sqlite3
118f0 4c 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a  LogEst() of the.
11900 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
11910 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78  s that the index
11920 20 73 63 61 6e 20 69 73 20 65 78 70 65 63 74 65   scan is expecte
11930 64 20 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f  d to visit witho
11940 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69  ut .** consideri
11950 6e 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e  ng the range con
11960 73 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71  straints. If nEq
11970 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 74   is 0, this is t
11980 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a  he number of .**
11990 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64   rows in the ind
119a0 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20  ex. Assuming no 
119b0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
119c0 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65 64  nOut is adjusted
119d0 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f   (reduced).** to
119e0 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
119f0 20 72 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74   range contraint
11a00 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  s pLower and pUp
11a10 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74  per..** .** In t
11a20 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71  he absence of sq
11a30 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c 59  lite_stat4 ANALY
11a40 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20 73  ZE data, or if s
11a50 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74 20  uch data cannot 
11a60 62 65 0a 2a 2a 20 75 73 65 64 2c 20 65 61 63 68  be.** used, each
11a70 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74   range inequalit
11a80 79 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65  y reduces the se
11a90 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20  arch space by a 
11aa0 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a  factor of 4. .**
11ab0 20 48 65 6e 63 65 20 61 20 70 61 69 72 20 6f 66   Hence a pair of
11ac0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e   constraints (x>
11ad0 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63  ? AND x<?) reduc
11ae0 65 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  es the expected 
11af0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77  number of.** row
11b00 73 20 76 69 73 69 74 65 64 20 62 79 20 61 20 66  s visited by a f
11b10 61 63 74 6f 72 20 6f 66 20 31 36 2e 0a 2a 2f 0a  actor of 16..*/.
11b20 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
11b30 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20  RangeScanEst(.  
11b40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
11b50 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
11b60 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
11b70 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
11b80 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
11b90 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 57 68 65  *pBuilder,.  Whe
11ba0 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20  reTerm *pLower, 
11bb0 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64    /* Lower bound
11bc0 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
11bd0 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74  x: "x>123" Might
11be0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
11bf0 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c  ereTerm *pUpper,
11c00 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e     /* Upper boun
11c10 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
11c20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68  ex: "x<455" Migh
11c30 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
11c40 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
11c50 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68      /* Modify th
11c60 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62  e .nOut and mayb
11c70 65 20 2e 72 52 75 6e 20 66 69 65 6c 64 73 20 2a  e .rRun fields *
11c80 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
11c90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
11ca0 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e   nOut = pLoop->n
11cb0 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e  Out;.  LogEst nN
11cc0 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ew;..#ifdef SQLI
11cd0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
11ce0 4f 52 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78  OR_STAT4.  Index
11cf0 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62   *p = pLoop->u.b
11d00 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
11d10 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  nt nEq = pLoop->
11d20 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20  u.btree.nEq;..  
11d30 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30  if( p->nSample>0
11d40 0a 20 20 20 26 26 20 6e 45 71 3d 3d 70 42 75 69  .   && nEq==pBui
11d50 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 0a  lder->nRecValid.
11d60 20 20 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61     && nEq<p->nSa
11d70 6d 70 6c 65 43 6f 6c 0a 20 20 20 26 26 20 4f 70  mpleCol.   && Op
11d80 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
11d90 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  d(pParse->db, SQ
11da0 4c 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20 29  LITE_Stat3) .  )
11db0 7b 0a 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65  {.    UnpackedRe
11dc0 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75  cord *pRec = pBu
11dd0 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20  ilder->pRec;.   
11de0 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20   tRowcnt a[2];. 
11df0 20 20 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20     u8 aff;..    
11e00 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77  /* Variable iLow
11e10 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  er will be set t
11e20 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f  o the estimate o
11e30 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
11e40 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20  rows in .    ** 
11e50 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61  the index that a
11e60 72 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  re less than the
11e70 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20   lower bound of 
11e80 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
11e90 20 54 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 77 65   The.    ** lowe
11ea0 72 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68  r bound being th
11eb0 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20  e concatenation 
11ec0 6f 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68  of $P and $L, wh
11ed0 65 72 65 20 24 50 20 69 73 20 74 68 65 0a 20 20  ere $P is the.  
11ee0 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20    ** key-prefix 
11ef0 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45  formed by the nE
11f00 71 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64  q values matched
11f10 20 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71   against the nEq
11f20 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 2a   left-most.    *
11f30 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  * columns of the
11f40 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69   index, and $L i
11f50 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  s the value in p
11f60 4c 6f 77 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20  Lower..    **.  
11f70 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77    ** Or, if pLow
11f80 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c  er is NULL or $L
11f90 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
11fa0 63 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65  cted from it (be
11fb0 63 61 75 73 65 20 69 74 0a 20 20 20 20 2a 2a 20  cause it.    ** 
11fc0 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20  is not a simple 
11fd0 76 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65  variable or lite
11fe0 72 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20  ral value), the 
11ff0 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  lower bound of t
12000 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  he.    ** range 
12010 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20  is $P. Due to a 
12020 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79  quirk in the way
12030 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
12040 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20   works, even.   
12050 20 2a 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61   ** if $L is ava
12060 69 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79  ilable, whereKey
12070 53 74 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65  Stats() is calle
12080 64 20 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20  d for both ($P) 
12090 61 6e 64 20 0a 20 20 20 20 2a 2a 20 28 24 50 3a  and .    ** ($P:
120a0 24 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67  $L) and the larg
120b0 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65  er of the two re
120c0 74 75 72 6e 65 64 20 76 61 6c 75 65 73 20 75 73  turned values us
120d0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
120e0 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70  * Similarly, iUp
120f0 70 65 72 20 69 73 20 74 6f 20 62 65 20 73 65 74  per is to be set
12100 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65   to the estimate
12110 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
12120 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 6c 65  f rows.    ** le
12130 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65  ss than the uppe
12140 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72  r bound of the r
12150 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68 65 72  ange query. Wher
12160 65 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  e the upper boun
12170 64 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68  d.    ** is eith
12180 65 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24  er ($P) or ($P:$
12190 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20  U). Again, even 
121a0 69 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62  if $U is availab
121b0 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a  le, both values.
121c0 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65 72      ** of iUpper
121d0 20 61 72 65 20 72 65 71 75 65 73 74 65 64 20 6f   are requested o
121e0 66 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  f whereKeyStats(
121f0 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65  ) and the smalle
12200 72 20 75 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  r used..    */. 
12210 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
12220 72 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69  r;.    tRowcnt i
12230 55 70 70 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Upper;..    if( 
12240 6e 45 71 3d 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20  nEq==p->nKeyCol 
12250 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
12260 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
12270 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  R;.    }else{.  
12280 20 20 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61      aff = p->pTa
12290 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43  ble->aCol[p->aiC
122a0 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69  olumn[nEq]].affi
122b0 6e 69 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nity;.    }.    
122c0 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f  /* Determine iLo
122d0 77 65 72 20 61 6e 64 20 69 55 70 70 65 72 20 75  wer and iUpper u
122e0 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20  sing ($P) only. 
122f0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d  */.    if( nEq==
12300 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65  0 ){.      iLowe
12310 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70  r = 0;.      iUp
12320 70 65 72 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73  per = p->aiRowEs
12330 74 5b 30 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  t[0];.    }else{
12340 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20  .      /* Note: 
12350 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20  this call could 
12360 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61  be optimized awa
12370 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61  y - since the sa
12380 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a  me values must .
12390 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65        ** have be
123a0 65 6e 20 72 65 71 75 65 73 74 65 64 20 77 68 65  en requested whe
123b0 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50  n testing key $P
123c0 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63   in whereEqualSc
123d0 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20  anEst().  */.   
123e0 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73     whereKeyStats
123f0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
12400 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 69  , 0, a);.      i
12410 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20  Lower = a[0];.  
12420 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30      iUpper = a[0
12430 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 7d 0a  ] + a[1];.    }.
12440 0a 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69  .    /* If possi
12450 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20  ble, improve on 
12460 74 68 65 20 69 4c 6f 77 65 72 20 65 73 74 69 6d  the iLower estim
12470 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24 4c  ate using ($P:$L
12480 29 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c  ). */.    if( pL
12490 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 69 6e  ower ){.      in
124a0 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20  t bOk;          
124b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
124c0 65 20 69 66 20 76 61 6c 75 65 20 69 73 20 65 78  e if value is ex
124d0 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78  tracted from pEx
124e0 70 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  pr */.      Expr
124f0 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72   *pExpr = pLower
12500 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
12510 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
12520 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pLower->eOperato
12530 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  r & (WO_GT|WO_GE
12540 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ))!=0 );.      r
12550 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34  c = sqlite3Stat4
12560 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50  ProbeSetValue(pP
12570 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20  arse, p, &pRec, 
12580 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c  pExpr, aff, nEq,
12590 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 69 66   &bOk);.      if
125a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
125b0 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20  && bOk ){.      
125c0 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a    tRowcnt iNew;.
125d0 20 20 20 20 20 20 20 20 77 68 65 72 65 4b 65 79          whereKey
125e0 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
125f0 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20   pRec, 0, a);.  
12600 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30        iNew = a[0
12610 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f  ] + ((pLower->eO
12620 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 54 29  perator & WO_GT)
12630 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20   ? a[1] : 0);.  
12640 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69        if( iNew>i
12650 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d  Lower ) iLower =
12660 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 6e   iNew;.        n
12670 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  Out--;.      }. 
12680 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
12690 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76  possible, improv
126a0 65 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20  e on the iUpper 
126b0 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28  estimate using (
126c0 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 69  $P:$U). */.    i
126d0 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20  f( pUpper ){.   
126e0 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20     int bOk;     
126f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12700 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65 20  * True if value 
12710 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
12720 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20  m pExpr */.     
12730 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
12740 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Upper->pExpr->pR
12750 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65  ight;.      asse
12760 72 74 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70  rt( (pUpper->eOp
12770 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c  erator & (WO_LT|
12780 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20  WO_LE))!=0 );.  
12790 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
127a0 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c  Stat4ProbeSetVal
127b0 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70  ue(pParse, p, &p
127c0 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c  Rec, pExpr, aff,
127d0 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20   nEq, &bOk);.   
127e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
127f0 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20  E_OK && bOk ){. 
12800 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69         tRowcnt i
12810 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 77 68 65  New;.        whe
12820 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
12830 65 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c 20 61  e, p, pRec, 1, a
12840 29 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 77 20  );.        iNew 
12850 3d 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65  = a[0] + ((pUppe
12860 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  r->eOperator & W
12870 4f 5f 4c 45 29 20 3f 20 61 5b 31 5d 20 3a 20 30  O_LE) ? a[1] : 0
12880 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
12890 4e 65 77 3c 69 55 70 70 65 72 20 29 20 69 55 70  New<iUpper ) iUp
128a0 70 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20  per = iNew;.    
128b0 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20      nOut--;.    
128c0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
128d0 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20  Builder->pRec = 
128e0 70 52 65 63 3b 0a 20 20 20 20 69 66 28 20 72 63  pRec;.    if( rc
128f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12900 20 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3e       if( iUpper>
12910 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20  iLower ){.      
12920 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    nNew = sqlite3
12930 4c 6f 67 45 73 74 28 69 55 70 70 65 72 20 2d 20  LogEst(iUpper - 
12940 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 7d  iLower);.      }
12950 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 4e  else{.        nN
12960 65 77 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20  ew = 10;        
12970 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69  assert( 10==sqli
12980 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a  te3LogEst(2) );.
12990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
129a0 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20  ( nNew<nOut ){. 
129b0 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4e         nOut = nN
129c0 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ew;.      }.    
129d0 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20    pLoop->nOut = 
129e0 28 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20  (LogEst)nOut;.  
129f0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
12a00 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73 63 61  x10, ("range sca
12a10 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25  n regions: %u..%
12a20 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20  u  est=%d\n",.  
12a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a40 20 20 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77         (u32)iLow
12a50 65 72 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c  er, (u32)iUpper,
12a60 20 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 72   nOut));.      r
12a70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12a80 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
12a90 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
12aa0 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55  TER(pParse);.  U
12ab0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12ac0 70 42 75 69 6c 64 65 72 29 3b 0a 23 65 6e 64 69  pBuilder);.#endi
12ad0 66 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77  f.  assert( pLow
12ae0 65 72 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a  er || pUpper );.
12af0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 45 61    /* TUNING:  Ea
12b00 63 68 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  ch inequality co
12b10 6e 73 74 72 61 69 6e 74 20 72 65 64 75 63 65 73  nstraint reduces
12b20 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
12b30 65 20 34 2d 66 6f 6c 64 2e 0a 20 20 2a 2a 20 41  e 4-fold..  ** A
12b40 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f   BETWEEN operato
12b50 72 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 72 65  r, therefore, re
12b60 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68  duces the search
12b70 20 73 70 61 63 65 20 31 36 2d 66 6f 6c 64 20 2a   space 16-fold *
12b80 2f 0a 20 20 6e 4e 65 77 20 3d 20 6e 4f 75 74 3b  /.  nNew = nOut;
12b90 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26  .  if( pLower &&
12ba0 20 28 70 4c 6f 77 65 72 2d 3e 77 74 46 6c 61 67   (pLower->wtFlag
12bb0 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
12bc0 3d 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d  =0 ){.    nNew -
12bd0 3d 20 32 30 3b 20 20 20 20 20 20 20 20 61 73 73  = 20;        ass
12be0 65 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33  ert( 20==sqlite3
12bf0 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20  LogEst(4) );.   
12c00 20 6e 4f 75 74 2d 2d 3b 0a 20 20 7d 0a 20 20 69   nOut--;.  }.  i
12c10 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20  f( pUpper ){.   
12c20 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20 20 20 20   nNew -= 20;    
12c30 20 20 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d      assert( 20==
12c40 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29  sqlite3LogEst(4)
12c50 20 29 3b 0a 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a   );.    nOut--;.
12c60 20 20 7d 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31    }.  if( nNew<1
12c70 30 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20  0 ) nNew = 10;. 
12c80 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29   if( nNew<nOut )
12c90 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20   nOut = nNew;.  
12ca0 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c  pLoop->nOut = (L
12cb0 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65  ogEst)nOut;.  re
12cc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
12cd0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
12ce0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
12cf0 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
12d00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
12d10 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
12d20 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
12d30 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20  .** an equality 
12d40 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c  constraint x=VAL
12d50 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61  UE and where tha
12d60 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69  t VALUE occurs i
12d70 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72  n.** the histogr
12d80 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f  am data.  This o
12d90 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78  nly works when x
12da0 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   is the left-mos
12db0 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  t.** column of a
12dc0 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69  n index and sqli
12dd0 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72  te_stat3 histogr
12de0 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  am data is avail
12df0 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74  able.** for that
12e00 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45   index.  When pE
12e10 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  xpr==NULL that m
12e20 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61  eans the constra
12e30 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20  int is.** "x IS 
12e40 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66  NULL" instead of
12e50 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a   "x=VALUE"..**.*
12e60 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69  * Write the esti
12e70 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20  mated row count 
12e80 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20  into *pnRow and 
12e90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12ea0 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20  . .** If unable 
12eb0 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d  to make an estim
12ec0 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f  ate, leave *pnRo
12ed0 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  w unchanged and 
12ee0 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
12ef0 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ro..**.** This r
12f00 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20  outine can fail 
12f10 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20  if it is unable 
12f20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74  to load a collat
12f30 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ing sequence.** 
12f40 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72  required for str
12f50 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ing comparison, 
12f60 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  or if unable to 
12f70 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a  allocate memory.
12f80 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e  ** for a UTF con
12f90 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64  version required
12fa0 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   for comparison.
12fb0 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73    The error is s
12fc0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  tored.** in the 
12fd0 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
12fe0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12ff0 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
13000 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
13010 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
13020 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
13030 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
13040 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
13050 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
13060 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
13070 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
13080 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69  sion for VALUE i
13090 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f  n the x=VALUE co
130a0 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52  nstraint */.  tR
130b0 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20  owcnt *pnRow    
130c0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
130d0 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69  revised row esti
130e0 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  mate here */.){.
130f0 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75    Index *p = pBu
13100 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
13110 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
13120 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64 65  nt nEq = pBuilde
13130 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
13140 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64  .nEq;.  Unpacked
13150 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70  Record *pRec = p
13160 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20  Builder->pRec;. 
13170 20 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20   u8 aff;        
13180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
13190 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f  lumn affinity */
131a0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
131b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
131c0 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  Subfunction retu
131d0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f  rn code */.  tRo
131e0 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20  wcnt a[2];      
131f0 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73         /* Statis
13200 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f  tics */.  int bO
13210 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 45  k;..  assert( nE
13220 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  q>=1 );.  assert
13230 28 20 6e 45 71 3c 3d 28 70 2d 3e 6e 4b 65 79 43  ( nEq<=(p->nKeyC
13240 6f 6c 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72  ol+1) );.  asser
13250 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30  t( p->aSample!=0
13260 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
13270 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20  >nSample>0 );.  
13280 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
13290 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71 20  ->nRecValid<nEq 
132a0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75  );..  /* If valu
132b0 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  es are not avail
132c0 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69 65  able for all fie
132d0 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  lds of the index
132e0 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a   to the left.  *
132f0 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e  * of this one, n
13300 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e 20 62  o estimate can b
13310 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e 20 53  e made. Return S
13320 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20  QLITE_NOTFOUND. 
13330 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
13340 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45  r->nRecValid<(nE
13350 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  q-1) ){.    retu
13360 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
13370 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ND;.  }..  /* Th
13380 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
13390 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20  ation only. The 
133a0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53  call to sqlite3S
133b0 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
133c0 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77  e().  ** below w
133d0 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68 65 20  ould return the 
133e0 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a  same value.  */.
133f0 20 20 69 66 28 20 6e 45 71 3e 70 2d 3e 6e 4b 65    if( nEq>p->nKe
13400 79 43 6f 6c 20 29 7b 0a 20 20 20 20 2a 70 6e 52  yCol ){.    *pnR
13410 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ow = 1;.    retu
13420 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13430 7d 0a 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54  }..  aff = p->pT
13440 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69  able->aCol[p->ai
13450 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61  Column[nEq-1]].a
13460 66 66 69 6e 69 74 79 3b 0a 20 20 72 63 20 3d 20  ffinity;.  rc = 
13470 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
13480 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
13490 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
134a0 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20 26  r, aff, nEq-1, &
134b0 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72  bOk);.  pBuilder
134c0 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20  ->pRec = pRec;. 
134d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
134e0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
134f0 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72    if( bOk==0 ) r
13500 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
13510 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65  FOUND;.  pBuilde
13520 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
13530 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53  Eq;..  whereKeyS
13540 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
13550 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57  pRec, 0, a);.  W
13560 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
13570 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72  "equality scan r
13580 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28  egions: %d\n", (
13590 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70  int)a[1]));.  *p
135a0 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a  nRow = a[1];.  .
135b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
135c0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
135d0 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
135e0 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66  STAT4 */..#ifdef
135f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
13600 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a  TAT3_OR_STAT4./*
13610 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
13620 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
13630 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
13640 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a  urned based on.*
13650 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  * an IN constrai
13660 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67  nt where the rig
13670 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
13680 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
13690 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ** is a list of 
136a0 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65  values.  Example
136b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57  :.**.**        W
136c0 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33  HERE x IN (1,2,3
136d0 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  ,4).**.** Write 
136e0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
136f0 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
13700 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
13710 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
13720 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
13730 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
13740 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
13750 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
13760 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
13770 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
13780 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
13790 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
137a0 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
137b0 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
137c0 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
137d0 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
137e0 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
137f0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
13800 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
13810 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
13820 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
13830 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
13840 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
13850 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
13860 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53  tic int whereInS
13870 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
13880 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
13890 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
138a0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
138b0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
138c0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
138d0 64 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  der,.  ExprList 
138e0 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54  *pList,     /* T
138f0 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e  he value list on
13900 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20 49   the RHS of "x I
13910 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29  N (v1,v2,v3,...)
13920 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a  " */.  tRowcnt *
13930 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57  pnRow       /* W
13940 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
13950 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
13960 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
13970 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e   *p = pBuilder->
13980 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
13990 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 52 65 63  ndex;.  int nRec
139a0 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72  Valid = pBuilder
139b0 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69  ->nRecValid;.  i
139c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
139d0 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e  K;     /* Subfun
139e0 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
139f0 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  e */.  tRowcnt n
13a00 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Est;           /
13a10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
13a20 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65   for a single te
13a30 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  rm */.  tRowcnt 
13a40 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20  nRowEst = 0;    
13a50 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20  /* New estimate 
13a60 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
13a70 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69   rows */.  int i
13a80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13a90 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
13aa0 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
13ab0 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29   p->aSample!=0 )
13ac0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
13ad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
13ae0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
13af0 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 70  +){.    nEst = p
13b00 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20  ->aiRowEst[0];. 
13b10 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
13b20 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
13b30 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73  , pBuilder, pLis
13b40 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26  t->a[i].pExpr, &
13b50 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45  nEst);.    nRowE
13b60 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20  st += nEst;.    
13b70 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
13b80 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
13b90 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
13ba0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13bb0 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 70   if( nRowEst > p
13bc0 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 20  ->aiRowEst[0] ) 
13bd0 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52  nRowEst = p->aiR
13be0 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70  owEst[0];.    *p
13bf0 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a  nRow = nRowEst;.
13c00 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
13c10 78 31 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74  x10,("IN row est
13c20 69 6d 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e 22  imate: est=%g\n"
13c30 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d  , nRowEst));.  }
13c40 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c  .  assert( pBuil
13c50 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d  der->nRecValid==
13c60 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72  nRecValid );.  r
13c70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
13c80 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
13c90 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
13ca0 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  T4 */../*.** Dis
13cb0 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74  able a term in t
13cc0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
13cd0 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74    Except, do not
13ce0 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 72   disable the ter
13cf0 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72  m.** if it contr
13d00 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52  ols a LEFT OUTER
13d10 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64   JOIN and it did
13d20 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69   not originate i
13d30 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55  n the ON.** or U
13d40 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74  SING clause of t
13d50 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  hat join..**.** 
13d60 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65 72  Consider the ter
13d70 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74  m t2.z='ok' in t
13d80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65  he following que
13d90 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  ries:.**.**   (1
13da0 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
13db0 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
13dc0 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48   ON t1.a=t2.x WH
13dd0 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  ERE t2.z='ok'.**
13de0 20 20 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a     (2)  SELECT *
13df0 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
13e00 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
13e10 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27  .x AND t2.z='ok'
13e20 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43  .**   (3)  SELEC
13e30 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20  T * FROM t1, t2 
13e40 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20  WHERE t1.a=t2.x 
13e50 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  AND t2.z='ok'.**
13e60 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b  .** The t2.z='ok
13e70 27 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e  ' is disabled in
13e80 20 74 68 65 20 69 6e 20 28 32 29 20 62 65 63 61   the in (2) beca
13e90 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65  use it originate
13ea0 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63  s.** in the ON c
13eb0 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d  lause.  The term
13ec0 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
13ed0 28 33 29 20 62 65 63 61 75 73 65 20 69 74 20 69  (3) because it i
13ee0 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66  s not part.** of
13ef0 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
13f00 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65  IN.  In (1), the
13f10 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73   term is not dis
13f20 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73  abled..**.** Dis
13f30 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61  abling a term ca
13f40 75 73 65 73 20 74 68 61 74 20 74 65 72 6d 20 74  uses that term t
13f50 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20  o not be tested 
13f60 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  in the inner loo
13f70 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e  p.** of the join
13f80 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20  .  Disabling is 
13f90 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
13fa0 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65    When terms are
13fb0 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79   satisfied.** by
13fc0 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73   indices, we dis
13fd0 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65  able them to pre
13fe0 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74  vent redundant t
13ff0 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65  ests in the inne
14000 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77  r.** loop.  We w
14010 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72  ould get the cor
14020 72 65 63 74 20 72 65 73 75 6c 74 73 20 69 66 20  rect results if 
14030 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76 65  nothing were eve
14040 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62  r disabled,.** b
14050 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72  ut joins might r
14060 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77  un a little slow
14070 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69  er.  The trick i
14080 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20  s to disable as 
14090 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61  much.** as we ca
140a0 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c  n without disabl
140b0 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49  ing too much.  I
140c0 66 20 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e  f we disabled in
140d0 20 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a   (1), we'd get.*
140e0 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77  * the wrong answ
140f0 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  er.  See ticket 
14100 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  #813..*/.static 
14110 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d  void disableTerm
14120 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65  (WhereLevel *pLe
14130 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a  vel, WhereTerm *
14140 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54  pTerm){.  if( pT
14150 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54  erm.      && (pT
14160 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
14170 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20  ERM_CODED)==0.  
14180 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e      && (pLevel->
14190 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20  iLeftJoin==0 || 
141a0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
141b0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
141c0 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20  _FromJoin)).    
141d0 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 6e 6f    && (pLevel->no
141e0 74 52 65 61 64 79 20 26 20 70 54 65 72 6d 2d 3e  tReady & pTerm->
141f0 70 72 65 72 65 71 41 6c 6c 29 3d 3d 30 0a 20 20  prereqAll)==0.  
14200 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  ){.    pTerm->wt
14210 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
14220 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65  DED;.    if( pTe
14230 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29  rm->iParent>=0 )
14240 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
14250 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65  m *pOther = &pTe
14260 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d  rm->pWC->a[pTerm
14270 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20  ->iParent];.    
14280 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d    if( (--pOther-
14290 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20  >nChild)==0 ){. 
142a0 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
142b0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65  rm(pLevel, pOthe
142c0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
142d0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
142e0 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69  ode an OP_Affini
142f0 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70  ty opcode to app
14300 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66  ly the column af
14310 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41  finity string zA
14320 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72  ff.** to the n r
14330 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
14340 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a  g at base. .**.*
14350 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  * As an optimiza
14360 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46  tion, SQLITE_AFF
14370 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77  _NONE entries (w
14380 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29  hich are no-ops)
14390 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e   at the.** begin
143a0 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20  ning and end of 
143b0 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64  zAff are ignored
143c0 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65  .  If all entrie
143d0 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a  s in zAff are.**
143e0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
143f0 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67  , then no code g
14400 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  ets generated..*
14410 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14420 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20  e makes its own 
14430 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20  copy of zAff so 
14440 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
14450 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f  is free.** to mo
14460 64 69 66 79 20 7a 41 66 66 20 61 66 74 65 72 20  dify zAff after 
14470 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
14480 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  urns..*/.static 
14490 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66  void codeApplyAf
144a0 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50  finity(Parse *pP
144b0 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20  arse, int base, 
144c0 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66  int n, char *zAf
144d0 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  f){.  Vdbe *v = 
144e0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
144f0 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a   if( zAff==0 ){.
14500 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
14510 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
14520 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
14530 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
14540 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  ( v!=0 );..  /* 
14550 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20  Adjust base and 
14560 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53  n to skip over S
14570 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65  QLITE_AFF_NONE e
14580 6e 74 72 69 65 73 20 61 74 20 74 68 65 20 62 65  ntries at the be
14590 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64  ginning.  ** and
145a0 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69   end of the affi
145b0 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a  nity string..  *
145c0 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26  /.  while( n>0 &
145d0 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54  & zAff[0]==SQLIT
145e0 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
145f0 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b    n--;.    base+
14600 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20  +;.    zAff++;. 
14610 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20   }.  while( n>1 
14620 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51  && zAff[n-1]==SQ
14630 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b  LITE_AFF_NONE ){
14640 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20  .    n--;.  }.. 
14650 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f   /* Code the OP_
14660 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20  Affinity opcode 
14670 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74  if there is anyt
14680 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e  hing left to do.
14690 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b   */.  if( n>0 ){
146a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
146b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66  AddOp2(v, OP_Aff
146c0 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b  inity, base, n);
146d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
146e0 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
146f0 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71  zAff, n);.    sq
14700 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
14710 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
14720 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20  rse, base, n);. 
14730 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   }.}.../*.** Gen
14740 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
14750 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79   single equality
14760 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
14770 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65  RE clause.  An e
14780 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20  quality.** term 
14790 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d  can be either X=
147a0 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e  expr or X IN (..
147b0 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74  .).   pTerm is t
147c0 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a  he term to be .*
147d0 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  * coded..**.** T
147e0 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
147f0 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61   for the constra
14800 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72  int is left in r
14810 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a  egister iReg..**
14820 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72  .** For a constr
14830 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d  aint of the form
14840 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70   X=expr, the exp
14850 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75  ression is evalu
14860 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20  ated and its.** 
14870 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f  result is left o
14880 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f  n the stack.  Fo
14890 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66  r constraints of
148a0 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28   the form X IN (
148b0 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ...).** this rou
148c0 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c  tine sets up a l
148d0 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74  oop that will it
148e0 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76  erate over all v
148f0 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73  alues of X..*/.s
14900 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71  tatic int codeEq
14910 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61  ualityTerm(.  Pa
14920 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
14930 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
14940 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
14950 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
14960 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66    /* The term of
14970 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
14980 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  e to be coded */
14990 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
149a0 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65  Level, /* The le
149b0 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  vel of the FROM 
149c0 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77 6f  clause we are wo
149d0 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e  rking on */.  in
149e0 74 20 69 45 71 2c 20 20 20 20 20 20 20 20 20 20  t iEq,          
149f0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
14a00 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
14a10 77 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65  within this leve
14a20 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c  l */.  int bRev,
14a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
14a40 75 65 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f  ue for reverse-o
14a50 72 64 65 72 20 49 4e 20 6f 70 65 72 61 74 69 6f  rder IN operatio
14a60 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72  ns */.  int iTar
14a70 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41  get         /* A
14a80 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20  ttempt to leave 
14a90 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20  results in this 
14aa0 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
14ab0 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
14ac0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65  m->pExpr;.  Vdbe
14ad0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
14ae0 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b  dbe;.  int iReg;
14af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b00 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
14b10 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  lding results */
14b20 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 72  ..  assert( iTar
14b30 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  get>0 );.  if( p
14b40 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a  X->op==TK_EQ ){.
14b50 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74      iReg = sqlit
14b60 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
14b70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
14b80 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  ght, iTarget);. 
14b90 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f   }else if( pX->o
14ba0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
14bb0 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67      iReg = iTarg
14bc0 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  et;.    sqlite3V
14bd0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14be0 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a  Null, 0, iReg);.
14bf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14c00 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d  MIT_SUBQUERY.  }
14c10 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54  else{.    int eT
14c20 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61  ype;.    int iTa
14c30 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e  b;.    struct In
14c40 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57  Loop *pIn;.    W
14c50 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
14c60 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
14c70 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  ;..    if( (pLoo
14c80 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
14c90 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
14ca0 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f  ==0.      && pLo
14cb0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
14cc0 65 78 21 3d 30 0a 20 20 20 20 20 20 26 26 20 70  ex!=0.      && p
14cd0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
14ce0 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
14cf0 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20  [iEq].    ){.   
14d00 20 20 20 74 65 73 74 63 61 73 65 28 20 69 45 71     testcase( iEq
14d10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
14d20 74 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20  tcase( bRev );. 
14d30 20 20 20 20 20 62 52 65 76 20 3d 20 21 62 52 65       bRev = !bRe
14d40 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  v;.    }.    ass
14d50 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
14d60 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d  IN );.    iReg =
14d70 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54   iTarget;.    eT
14d80 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ype = sqlite3Fin
14d90 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c  dInIndex(pParse,
14da0 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 66 28   pX, 0);.    if(
14db0 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
14dc0 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20  _INDEX_DESC ){. 
14dd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62       testcase( b
14de0 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65  Rev );.      bRe
14df0 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d  v = !bRev;.    }
14e00 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e  .    iTab = pX->
14e10 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69  iTable;.    sqli
14e20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14e30 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20   bRev ? OP_Last 
14e40 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  : OP_Rewind, iTa
14e50 62 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  b, 0);.    asser
14e60 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
14e70 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
14e80 5f 4f 52 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  _OR)==0 );.    p
14e90 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
14ea0 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a   WHERE_IN_ABLE;.
14eb0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
14ec0 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20  u.in.nIn==0 ){. 
14ed0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64       pLevel->add
14ee0 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  rNxt = sqlite3Vd
14ef0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
14f00 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
14f10 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20  ->u.in.nIn++;.  
14f20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61    pLevel->u.in.a
14f30 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20  InLoop =.       
14f40 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
14f50 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  OrFree(pParse->d
14f60 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  b, pLevel->u.in.
14f70 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  aInLoop,.       
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f90 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c         sizeof(pL
14fa0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
14fb0 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75  op[0])*pLevel->u
14fc0 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49  .in.nIn);.    pI
14fd0 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  n = pLevel->u.in
14fe0 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66  .aInLoop;.    if
14ff0 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70  ( pIn ){.      p
15000 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e  In += pLevel->u.
15010 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20  in.nIn - 1;.    
15020 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54    pIn->iCur = iT
15030 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  ab;.      if( eT
15040 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
15050 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  WID ){.        p
15060 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20  In->addrInTop = 
15070 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15080 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
15090 54 61 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  Tab, iReg);.    
150a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
150b0 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20   pIn->addrInTop 
150c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
150d0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
150e0 2c 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29  , iTab, 0, iReg)
150f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15100 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20  pIn->eEndLoopOp 
15110 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
15120 49 66 4f 70 65 6e 20 3a 20 4f 50 5f 4e 65 78 74  IfOpen : OP_Next
15130 49 66 4f 70 65 6e 3b 0a 20 20 20 20 20 20 73 71  IfOpen;.      sq
15140 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
15150 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52  v, OP_IsNull, iR
15160 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eg);.    }else{.
15170 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e        pLevel->u.
15180 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20  in.nIn = 0;.    
15190 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64  }.#endif.  }.  d
151a0 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
151b0 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72 65 74  l, pTerm);.  ret
151c0 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  urn iReg;.}../*.
151d0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
151e0 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
151f0 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49  ate all == and I
15200 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f  N constraints fo
15210 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 73 63  r an.** index sc
15220 61 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  an..**.** For ex
15230 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20  ample, consider 
15240 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64  table t1(a,b,c,d
15250 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78  ,e,f) with index
15260 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53   i1(a,b,c)..** S
15270 75 70 70 6f 73 65 20 74 68 65 20 57 48 45 52 45  uppose the WHERE
15280 20 63 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a   clause is this:
15290 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20    a==5 AND b IN 
152a0 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20  (1,2,3) AND c>5 
152b0 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20  AND c<10.** The 
152c0 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e  index has as man
152d0 79 20 61 73 20 74 68 72 65 65 20 65 71 75 61 6c  y as three equal
152e0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
152f0 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20   but in this.** 
15300 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69  example, the thi
15310 72 64 20 22 63 22 20 76 61 6c 75 65 20 69 73 20  rd "c" value is 
15320 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  an inequality.  
15330 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20  So only two .** 
15340 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
15350 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75  coded.  This rou
15360 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  tine will genera
15370 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
15380 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20  ate.** a==5 and 
15390 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54  b IN (1,2,3).  T
153a0 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
153b0 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69  s for a and b wi
153c0 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20  ll be stored.** 
153d0 69 6e 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  in consecutive r
153e0 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
153f0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69   index of the fi
15400 72 73 74 20 72 65 67 69 73 74 65 72 20 69 73 20  rst register is 
15410 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
15420 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61  In the example a
15430 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75  bove nEq==2.  Bu
15440 74 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  t this subroutin
15450 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  e works for any 
15460 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20  value.** of nEq 
15470 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66  including 0.  If
15480 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f   nEq==0, this ro
15490 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20  utine is nearly 
154a0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20  a no-op..** The 
154b0 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f  only thing it do
154c0 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74  es is allocate t
154d0 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20  he pLevel->iMem 
154e0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a  memory cell and.
154f0 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61  ** compute the a
15500 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a  ffinity string..
15510 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61  **.** The nExtra
15520 52 65 67 20 70 61 72 61 6d 65 74 65 72 20 69 73  Reg parameter is
15530 20 30 20 6f 72 20 31 2e 20 20 49 74 20 69 73 20   0 or 1.  It is 
15540 30 20 69 66 20 61 6c 6c 20 57 48 45 52 45 20 63  0 if all WHERE c
15550 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
15560 73 0a 2a 2a 20 61 72 65 20 3d 3d 20 6f 72 20 49  s.** are == or I
15570 4e 20 61 6e 64 20 61 72 65 20 63 6f 76 65 72 65  N and are covere
15580 64 20 62 79 20 74 68 65 20 6e 45 71 2e 20 20 6e  d by the nEq.  n
15590 45 78 74 72 61 52 65 67 20 69 73 20 31 20 69 66  ExtraReg is 1 if
155a0 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
155b0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
155c0 72 61 69 6e 74 20 28 73 75 63 68 20 61 73 20 74  raint (such as t
155d0 68 65 20 22 63 3e 3d 35 20 41 4e 44 20 63 3c 31  he "c>=5 AND c<1
155e0 30 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c  0" in the exampl
155f0 65 29 20 74 68 61 74 0a 2a 2a 20 6f 63 63 75 72  e) that.** occur
15600 73 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20  s after the nEq 
15610 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
15620 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nts..**.** This 
15630 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65  routine allocate
15640 73 20 61 20 72 61 6e 67 65 20 6f 66 20 6e 45 71  s a range of nEq
15650 2b 6e 45 78 74 72 61 52 65 67 20 6d 65 6d 6f 72  +nExtraReg memor
15660 79 20 63 65 6c 6c 73 20 61 6e 64 20 72 65 74 75  y cells and retu
15670 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  rns.** the index
15680 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6d 65   of the first me
15690 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 74 68 61  mory cell in tha
156a0 74 20 72 61 6e 67 65 2e 20 54 68 65 20 63 6f 64  t range. The cod
156b0 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20  e that.** calls 
156c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
156d0 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72  l use that memor
156e0 79 20 72 61 6e 67 65 20 74 6f 20 73 74 6f 72 65  y range to store
156f0 20 6b 65 79 73 20 66 6f 72 0a 2a 2a 20 73 74 61   keys for.** sta
15700 72 74 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 69  rt and terminati
15710 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 66  on conditions of
15720 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 20 6b 65   the loop..** ke
15730 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c  y value of the l
15740 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20  oop.  If one or 
15750 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72  more IN operator
15760 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a  s appear, then.*
15770 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * this routine a
15780 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69  llocates an addi
15790 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72  tional nEq memor
157a0 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65  y cells for inte
157b0 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a  rnal.** use..**.
157c0 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
157d0 69 6e 67 2c 20 2a 70 7a 41 66 66 20 69 73 20 73  ing, *pzAff is s
157e0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
157f0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
15800 6e 67 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20  ng a.** copy of 
15810 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  the column affin
15820 69 74 79 20 73 74 72 69 6e 67 20 6f 66 20 74 68  ity string of th
15830 65 20 69 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65  e index allocate
15840 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  d using.** sqlit
15850 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78  e3DbMalloc(). Ex
15860 63 65 70 74 2c 20 65 6e 74 72 69 65 73 20 69 6e  cept, entries in
15870 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65   the copy of the
15880 20 73 74 72 69 6e 67 20 61 73 73 6f 63 69 61 74   string associat
15890 65 64 0a 2a 2a 20 77 69 74 68 20 65 71 75 61 6c  ed.** with equal
158a0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
158b0 74 68 61 74 20 75 73 65 20 4e 4f 4e 45 20 61 66  that use NONE af
158c0 66 69 6e 69 74 79 20 61 72 65 20 73 65 74 20 74  finity are set t
158d0 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  o.** SQLITE_AFF_
158e0 4e 4f 4e 45 2e 20 54 68 69 73 20 69 73 20 74 6f  NONE. This is to
158f0 20 64 65 61 6c 20 77 69 74 68 20 53 51 4c 20 73   deal with SQL s
15900 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f  uch as the follo
15910 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  wing:.**.**   CR
15920 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
15930 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59  TEXT PRIMARY KEY
15940 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  , b);.**   SELEC
15950 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53  T ... FROM t1 AS
15960 20 74 32 2c 20 74 31 20 57 48 45 52 45 20 74 31   t2, t1 WHERE t1
15970 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a  .a = t2.b;.**.**
15980 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20   In the example 
15990 61 62 6f 76 65 2c 20 74 68 65 20 69 6e 64 65 78  above, the index
159a0 20 6f 6e 20 74 31 28 61 29 20 68 61 73 20 54 45   on t1(a) has TE
159b0 58 54 20 61 66 66 69 6e 69 74 79 2e 20 42 75 74  XT affinity. But
159c0 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69   since.** the ri
159d0 67 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66  ght hand side of
159e0 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f   the equality co
159f0 6e 73 74 72 61 69 6e 74 20 28 74 32 2e 62 29 20  nstraint (t2.b) 
15a00 68 61 73 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74  has NONE affinit
15a10 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73  y,.** no convers
15a20 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ion should be at
15a30 74 65 6d 70 74 65 64 20 62 65 66 6f 72 65 20 75  tempted before u
15a40 73 69 6e 67 20 61 20 74 32 2e 62 20 76 61 6c 75  sing a t2.b valu
15a50 65 20 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20  e as part of.** 
15a60 61 20 6b 65 79 20 74 6f 20 73 65 61 72 63 68 20  a key to search 
15a70 74 68 65 20 69 6e 64 65 78 2e 20 48 65 6e 63 65  the index. Hence
15a80 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
15a90 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  in the returned 
15aa0 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69  affinity.** stri
15ab0 6e 67 20 69 6e 20 74 68 69 73 20 65 78 61 6d 70  ng in this examp
15ac0 6c 65 20 77 6f 75 6c 64 20 62 65 20 73 65 74 20  le would be set 
15ad0 74 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  to SQLITE_AFF_NO
15ae0 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NE..*/.static in
15af0 74 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74  t codeAllEqualit
15b00 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20  yTerms(.  Parse 
15b10 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
15b20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
15b30 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  xt */.  WhereLev
15b40 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a  el *pLevel,   /*
15b50 20 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c 6f   Which nested lo
15b60 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 77  op of the FROM w
15b70 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a  e are coding */.
15b80 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20    int bRev,     
15b90 20 20 20 20 20 20 20 20 2f 2a 20 52 65 76 65 72          /* Rever
15ba0 73 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  se the order of 
15bb0 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  IN operators */.
15bc0 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 2c    int nExtraReg,
15bd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
15be0 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
15bf0 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ters to allocate
15c00 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41   */.  char **pzA
15c10 66 66 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ff          /* O
15c20 55 54 3a 20 53 65 74 20 74 6f 20 70 6f 69 6e 74  UT: Set to point
15c30 20 74 6f 20 61 66 66 69 6e 69 74 79 20 73 74 72   to affinity str
15c40 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20  ing */.){.  u16 
15c50 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
15c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15c70 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   number of == or
15c80 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
15c90 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  to code */.  u16
15ca0 20 6e 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20   nSkip;         
15cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
15cc0 6d 62 65 72 20 6f 66 20 6c 65 66 74 2d 6d 6f 73  mber of left-mos
15cd0 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 73 6b 69  t columns to ski
15ce0 70 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  p */.  Vdbe *v =
15cf0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
15d00 20 20 20 20 20 2f 2a 20 54 68 65 20 76 6d 20 75       /* The vm u
15d10 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
15d20 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
15d30 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
15d40 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
15d50 78 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72  x being used for
15d60 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20   this loop */.  
15d70 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
15d80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
15d90 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72   A single constr
15da0 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 57  aint term */.  W
15db0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15dd0 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  The WhereLoop ob
15de0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  ject */.  int j;
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e00 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
15e10 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
15e20 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20   regBase;       
15e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61             /* Ba
15e40 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  se register */. 
15e50 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20   int nReg;      
15e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15e70 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 69  * Number of regi
15e80 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  sters to allocat
15e90 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66  e */.  char *zAf
15ea0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
15eb0 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
15ec0 20 73 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72   string to retur
15ed0 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  n */..  /* This 
15ee0 6d 6f 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63  module is only c
15ef0 61 6c 6c 65 64 20 6f 6e 20 71 75 65 72 79 20 70  alled on query p
15f00 6c 61 6e 73 20 74 68 61 74 20 75 73 65 20 61 6e  lans that use an
15f10 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 70 4c 6f   index. */.  pLo
15f20 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
15f30 6f 6f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 28  oop;.  assert( (
15f40 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
15f50 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
15f60 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 6e 45 71  BLE)==0 );.  nEq
15f70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
15f80 65 2e 6e 45 71 3b 0a 20 20 6e 53 6b 69 70 20 3d  e.nEq;.  nSkip =
15f90 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
15fa0 6e 53 6b 69 70 3b 0a 20 20 70 49 64 78 20 3d 20  nSkip;.  pIdx = 
15fb0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
15fc0 49 6e 64 65 78 3b 0a 20 20 61 73 73 65 72 74 28  Index;.  assert(
15fd0 20 70 49 64 78 21 3d 30 20 29 3b 0a 0a 20 20 2f   pIdx!=0 );..  /
15fe0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
15ff0 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c   many memory cel
16000 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  ls we will need 
16010 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68  then allocate th
16020 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61  em..  */.  regBa
16030 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
16040 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20  m + 1;.  nReg = 
16050 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
16060 45 71 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a  Eq + nExtraReg;.
16070 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
16080 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20  = nReg;..  zAff 
16090 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
160a0 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 71  p(pParse->db, sq
160b0 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
160c0 74 79 53 74 72 28 76 2c 20 70 49 64 78 29 29 3b  tyStr(v, pIdx));
160d0 0a 20 20 69 66 28 20 21 7a 41 66 66 20 29 7b 0a  .  if( !zAff ){.
160e0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
160f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
16100 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 53 6b  ;.  }..  if( nSk
16110 69 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 49  ip ){.    int iI
16120 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e  dxCur = pLevel->
16130 69 49 64 78 43 75 72 3b 0a 20 20 20 20 73 71 6c  iIdxCur;.    sql
16140 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
16150 2c 20 28 62 52 65 76 3f 4f 50 5f 4c 61 73 74 3a  , (bRev?OP_Last:
16160 4f 50 5f 52 65 77 69 6e 64 29 2c 20 69 49 64 78  OP_Rewind), iIdx
16170 43 75 72 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Cur);.    VdbeCo
16180 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e  mment((v, "begin
16190 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73   skip-scan on %s
161a0 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  ", pIdx->zName))
161b0 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65  ;.    j = sqlite
161c0 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
161d0 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 70 4c 65  P_Goto);.    pLe
161e0 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 3d 20  vel->addrSkip = 
161f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16200 34 49 6e 74 28 76 2c 20 28 62 52 65 76 3f 4f 50  4Int(v, (bRev?OP
16210 5f 53 65 65 6b 4c 74 3a 4f 50 5f 53 65 65 6b 47  _SeekLt:OP_SeekG
16220 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16240 69 49 64 78 43 75 72 2c 20 30 2c 20 72 65 67 42  iIdxCur, 0, regB
16250 61 73 65 2c 20 6e 53 6b 69 70 29 3b 0a 20 20 20  ase, nSkip);.   
16260 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
16270 48 65 72 65 28 76 2c 20 6a 29 3b 0a 20 20 20 20  Here(v, j);.    
16280 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 6b 69 70  for(j=0; j<nSkip
16290 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; j++){.      sq
162a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
162b0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49  v, OP_Column, iI
162c0 64 78 43 75 72 2c 20 6a 2c 20 72 65 67 42 61 73  dxCur, j, regBas
162d0 65 2b 6a 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e+j);.      asse
162e0 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  rt( pIdx->aiColu
162f0 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20  mn[j]>=0 );.    
16300 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
16310 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 70 54  , "%s", pIdx->pT
16320 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d  able->aCol[pIdx-
16330 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  >aiColumn[j]].zN
16340 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ame));.    }.  }
16350 20 20 20 20 0a 0a 20 20 2f 2a 20 45 76 61 6c 75      ..  /* Evalu
16360 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74 79  ate the equality
16370 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
16380 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66 66  /.  assert( zAff
16390 3d 3d 30 20 7c 7c 20 28 69 6e 74 29 73 74 72 6c  ==0 || (int)strl
163a0 65 6e 28 7a 41 66 66 29 3e 3d 6e 45 71 20 29 3b  en(zAff)>=nEq );
163b0 0a 20 20 66 6f 72 28 6a 3d 6e 53 6b 69 70 3b 20  .  for(j=nSkip; 
163c0 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20  j<nEq; j++){.   
163d0 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 70 54 65   int r1;.    pTe
163e0 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rm = pLoop->aLTe
163f0 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61 73 73 65 72  rm[j];.    asser
16400 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20  t( pTerm!=0 );. 
16410 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
16420 69 6e 67 20 74 65 73 74 63 61 73 65 20 69 73 20  ing testcase is 
16430 74 72 75 65 20 66 6f 72 20 69 6e 64 69 63 65 73  true for indices
16440 20 77 69 74 68 20 72 65 64 75 6e 64 61 6e 74 20   with redundant 
16450 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a  columns. .    **
16460 20 45 78 3a 20 43 52 45 41 54 45 20 49 4e 44 45   Ex: CREATE INDE
16470 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61  X i1 ON t1(a,b,a
16480 29 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  ); SELECT * FROM
16490 20 74 31 20 57 48 45 52 45 20 61 3d 30 20 41 4e   t1 WHERE a=0 AN
164a0 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65  D b=0; */.    te
164b0 73 74 63 61 73 65 28 20 28 70 54 65 72 6d 2d 3e  stcase( (pTerm->
164c0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
164d0 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20  ODED)!=0 );.    
164e0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
164f0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
16500 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 72  VIRTUAL );.    r
16510 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79  1 = codeEquality
16520 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
16530 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62  rm, pLevel, j, b
16540 52 65 76 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b  Rev, regBase+j);
16550 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72 65 67  .    if( r1!=reg
16560 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20  Base+j ){.      
16570 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20  if( nReg==1 ){. 
16580 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
16590 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
165a0 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b 0a 20  rse, regBase);. 
165b0 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
165c0 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   r1;.      }else
165d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
165e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
165f0 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72 65 67  P_SCopy, r1, reg
16600 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d  Base+j);.      }
16610 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
16620 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
16630 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
16640 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  L );.    testcas
16650 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
16660 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
16670 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
16680 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
16690 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30  SNULL|WO_IN))==0
166a0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
166b0 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e  pRight = pTerm->
166c0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
166d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
166e0 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76  CodeIsNullJump(v
166f0 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
16700 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  e+j, pLevel->add
16710 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  rBrk);.      if(
16720 20 7a 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20   zAff ){.       
16730 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
16740 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
16750 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51  ht, zAff[j])==SQ
16760 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b  LITE_AFF_NONE ){
16770 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b  .          zAff[
16780 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  j] = SQLITE_AFF_
16790 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
167a0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
167b0 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
167c0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
167d0 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b  ght, zAff[j]) ){
167e0 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b  .          zAff[
167f0 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  j] = SQLITE_AFF_
16800 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
16810 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16820 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66  }.  *pzAff = zAf
16830 66 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42  f;.  return regB
16840 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ase;.}..#ifndef 
16850 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
16860 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  AIN./*.** This r
16870 6f 75 74 69 6e 65 20 69 73 20 61 20 68 65 6c 70  outine is a help
16880 65 72 20 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e  er for explainIn
16890 64 65 78 52 61 6e 67 65 28 29 20 62 65 6c 6f 77  dexRange() below
168a0 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64  .**.** pStr hold
168b0 73 20 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e  s the text of an
168c0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
168d0 20 77 65 20 61 72 65 20 62 75 69 6c 64 69 6e 67   we are building
168e0 20 75 70 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20   up one term.** 
168f0 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73  at a time.  This
16900 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20   routine adds a 
16910 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 20  new term to the 
16920 65 6e 64 20 6f 66 20 74 68 65 20 65 78 70 72 65  end of the expre
16930 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20  ssion..** Terms 
16940 61 72 65 20 73 65 70 61 72 61 74 65 64 20 62 79  are separated by
16950 20 41 4e 44 20 73 6f 20 61 64 64 20 74 68 65 20   AND so add the 
16960 22 41 4e 44 22 20 74 65 78 74 20 66 6f 72 20 73  "AND" text for s
16970 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71  econd and subseq
16980 75 65 6e 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e  uent.** terms on
16990 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
169a0 69 64 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64  id explainAppend
169b0 54 65 72 6d 28 0a 20 20 53 74 72 41 63 63 75 6d  Term(.  StrAccum
169c0 20 2a 70 53 74 72 2c 20 20 20 20 20 20 20 20 20   *pStr,         
169d0 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
169e0 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67  expression being
169f0 20 62 75 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20   built */.  int 
16a00 69 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  iTerm,          
16a10 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
16a20 20 6f 66 20 74 68 69 73 20 74 65 72 6d 2e 20 20   of this term.  
16a30 46 69 72 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f  First is zero */
16a40 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
16a50 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f  Column,        /
16a60 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
16a70 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lumn */.  const 
16a80 63 68 61 72 20 2a 7a 4f 70 20 20 20 20 20 20 20  char *zOp       
16a90 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
16aa0 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f   the operator */
16ab0 0a 29 7b 0a 20 20 69 66 28 20 69 54 65 72 6d 20  .){.  if( iTerm 
16ac0 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  ) sqlite3StrAccu
16ad0 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20  mAppend(pStr, " 
16ae0 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c  AND ", 5);.  sql
16af0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
16b00 6e 64 41 6c 6c 28 70 53 74 72 2c 20 7a 43 6f 6c  ndAll(pStr, zCol
16b10 75 6d 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  umn);.  sqlite3S
16b20 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
16b30 74 72 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73  tr, zOp, 1);.  s
16b40 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
16b50 70 65 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c 20  pend(pStr, "?", 
16b60 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  1);.}../*.** Arg
16b70 75 6d 65 6e 74 20 70 4c 65 76 65 6c 20 64 65 73  ument pLevel des
16b80 63 72 69 62 65 73 20 61 20 73 74 72 61 74 65 67  cribes a strateg
16b90 79 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74  y for scanning t
16ba0 61 62 6c 65 20 70 54 61 62 2e 20 54 68 69 73 20  able pTab. This 
16bb0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
16bc0 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
16bd0 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
16be0 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64  r containing a d
16bf0 65 73 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66  escription.** of
16c00 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 20 74   the subset of t
16c10 61 62 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e 65  able rows scanne
16c20 64 20 62 79 20 74 68 65 20 73 74 72 61 74 65 67  d by the strateg
16c30 79 20 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66  y in the form of
16c40 20 61 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65   an.** SQL expre
16c50 73 73 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c  ssion. Or, if al
16c60 6c 20 72 6f 77 73 20 61 72 65 20 73 63 61 6e 6e  l rows are scann
16c70 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  ed, NULL is retu
16c80 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  rned..**.** For 
16c90 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
16ca0 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53  query:.**.**   S
16cb0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
16cc0 57 48 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3e  WHERE a=1 AND b>
16cd0 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20  2;.**.** is run 
16ce0 61 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e 20  and there is an 
16cf0 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c  index on (a, b),
16d00 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
16d10 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a  ion returns a.**
16d20 20 73 74 72 69 6e 67 20 73 69 6d 69 6c 61 72 20   string similar 
16d30 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f  to:.**.**   "a=?
16d40 20 41 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20   AND b>?".**.** 
16d50 54 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69  The returned poi
16d60 6e 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d  nter points to m
16d70 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
16d80 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  rom sqlite3DbMal
16d90 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20  loc()..** It is 
16da0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
16db0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
16dc0 20 74 6f 20 66 72 65 65 20 74 68 65 20 62 75 66   to free the buf
16dd0 66 65 72 20 77 68 65 6e 20 69 74 20 69 73 0a 2a  fer when it is.*
16de0 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75  * no longer requ
16df0 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ired..*/.static 
16e00 63 68 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64  char *explainInd
16e10 65 78 52 61 6e 67 65 28 73 71 6c 69 74 65 33 20  exRange(sqlite3 
16e20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
16e30 70 4c 6f 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54  pLoop, Table *pT
16e40 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ab){.  Index *pI
16e50 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  ndex = pLoop->u.
16e60 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
16e70 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  u16 nEq = pLoop-
16e80 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
16e90 75 31 36 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f  u16 nSkip = pLoo
16ea0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70  p->u.btree.nSkip
16eb0 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
16ec0 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70  Column *aCol = p
16ed0 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69 31 36  Tab->aCol;.  i16
16ee0 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e   *aiColumn = pIn
16ef0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20  dex->aiColumn;. 
16f00 20 53 74 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a   StrAccum txt;..
16f10 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20    if( nEq==0 && 
16f20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
16f30 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  & (WHERE_BTM_LIM
16f40 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  IT|WHERE_TOP_LIM
16f50 49 54 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  IT))==0 ){.    r
16f60 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
16f70 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
16f80 69 74 28 26 74 78 74 2c 20 30 2c 20 30 2c 20 53  it(&txt, 0, 0, S
16f90 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
16fa0 29 3b 0a 20 20 74 78 74 2e 64 62 20 3d 20 64 62  );.  txt.db = db
16fb0 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
16fc0 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20  cumAppend(&txt, 
16fd0 22 20 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28  " (", 2);.  for(
16fe0 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29  i=0; i<nEq; i++)
16ff0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
17000 28 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  (i==pIndex->nKey
17010 43 6f 6c 20 29 20 3f 20 22 72 6f 77 69 64 22 20  Col ) ? "rowid" 
17020 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b  : aCol[aiColumn[
17030 69 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  i]].zName;.    i
17040 66 28 20 69 3e 3d 6e 53 6b 69 70 20 29 7b 0a 20  f( i>=nSkip ){. 
17050 20 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65       explainAppe
17060 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20  ndTerm(&txt, i, 
17070 7a 2c 20 22 3d 22 29 3b 0a 20 20 20 20 7d 65 6c  z, "=");.    }el
17080 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 20  se{.      if( i 
17090 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  ) sqlite3StrAccu
170a0 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20  mAppend(&txt, " 
170b0 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20 20 20 20  AND ", 5);.     
170c0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
170d0 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 41 4e  Append(&txt, "AN
170e0 59 28 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 73  Y(", 4);.      s
170f0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
17100 70 65 6e 64 41 6c 6c 28 26 74 78 74 2c 20 7a 29  pendAll(&txt, z)
17110 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
17120 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74  trAccumAppend(&t
17130 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 20  xt, ")", 1);.   
17140 20 7d 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b   }.  }..  j = i;
17150 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  .  if( pLoop->ws
17160 46 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f  Flags&WHERE_BTM_
17170 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61  LIMIT ){.    cha
17180 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65  r *z = (j==pInde
17190 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 3f 20 22  x->nKeyCol ) ? "
171a0 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69  rowid" : aCol[ai
171b0 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65  Column[j]].zName
171c0 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70  ;.    explainApp
171d0 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2b  endTerm(&txt, i+
171e0 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a  +, z, ">");.  }.
171f0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
17200 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c  lags&WHERE_TOP_L
17210 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72  IMIT ){.    char
17220 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78   *z = (j==pIndex
17230 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 3f 20 22 72  ->nKeyCol ) ? "r
17240 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43  owid" : aCol[aiC
17250 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b  olumn[j]].zName;
17260 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65  .    explainAppe
17270 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20  ndTerm(&txt, i, 
17280 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73  z, "<");.  }.  s
17290 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
172a0 70 65 6e 64 28 26 74 78 74 2c 20 22 29 22 2c 20  pend(&txt, ")", 
172b0 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  1);.  return sql
172c0 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
172d0 73 68 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a  sh(&txt);.}../*.
172e0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
172f0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
17300 73 73 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f  ss currently pro
17310 63 65 73 73 69 6e 67 20 61 6e 20 45 58 50 4c 41  cessing an EXPLA
17320 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a  IN QUERY PLAN.**
17330 20 63 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65   command. If the
17340 20 71 75 65 72 79 20 62 65 69 6e 67 20 63 6f 6d   query being com
17350 70 69 6c 65 64 20 69 73 20 61 6e 20 45 58 50 4c  piled is an EXPL
17360 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2c 20  AIN QUERY PLAN, 
17370 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f  a single.** reco
17380 72 64 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  rd is added to t
17390 68 65 20 6f 75 74 70 75 74 20 74 6f 20 64 65 73  he output to des
173a0 63 72 69 62 65 20 74 68 65 20 74 61 62 6c 65 20  cribe the table 
173b0 73 63 61 6e 20 73 74 72 61 74 65 67 79 20 69 6e  scan strategy in
173c0 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a   .** pLevel..*/.
173d0 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
173e0 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61  ainOneScan(.  Pa
173f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
17400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17410 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
17420 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
17430 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  bList,          
17440 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73      /* Table lis
17450 74 20 74 68 69 73 20 6c 6f 6f 70 20 72 65 66 65  t this loop refe
17460 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65  rs to */.  Where
17470 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20  Level *pLevel,  
17480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63             /* Sc
17490 61 6e 20 74 6f 20 77 72 69 74 65 20 4f 50 5f 45  an to write OP_E
174a0 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f  xplain opcode fo
174b0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  r */.  int iLeve
174c0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
174d0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
174e0 66 6f 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75  for "level" colu
174f0 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a  mn of output */.
17500 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20    int iFrom,    
17510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17520 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22    /* Value for "
17530 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  from" column of 
17540 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75 31 36 20  output */.  u16 
17550 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20  wctrlFlags      
17560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
17570 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 73  lags passed to s
17580 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
17590 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  () */.){.#ifndef
175a0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
175b0 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
175c0 61 69 6e 3d 3d 32 20 29 0a 23 65 6e 64 69 66 0a  ain==2 ).#endif.
175d0 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53    {.    struct S
175e0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
175f0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
17600 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
17610 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
17620 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
17630 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20      /* VM being 
17640 63 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a 20  constructed */. 
17650 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
17660 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
17670 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
17680 64 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  dle */.    char 
17690 2a 7a 4d 73 67 3b 20 20 20 20 20 20 20 20 20 20  *zMsg;          
176a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
176b0 20 74 6f 20 61 64 64 20 74 6f 20 45 51 50 20 6f   to add to EQP o
176c0 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74  utput */.    int
176d0 20 69 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69   iId = pParse->i
176e0 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65  SelectId;  /* Se
176f0 6c 65 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f  lect id (left-mo
17700 73 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e  st output column
17710 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53  ) */.    int isS
17720 65 61 72 63 68 3b 20 20 20 20 20 20 20 20 20 20  earch;          
17730 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
17740 6f 72 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c  or a SEARCH. Fal
17750 73 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a  se for SCAN. */.
17760 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
17770 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
17780 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f 6c    /* The control
17790 6c 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 6f  ling WhereLoop o
177a0 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 75 33 32  bject */.    u32
177b0 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20   flags;         
177c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
177d0 61 67 73 20 74 68 61 74 20 64 65 73 63 72 69 62  ags that describ
177e0 65 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 0a  e this loop */..
177f0 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
17800 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
17810 66 6c 61 67 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77  flags = pLoop->w
17820 73 46 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20  sFlags;.    if( 
17830 28 66 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c  (flags&WHERE_MUL
17840 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c  TI_OR) || (wctrl
17850 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54  Flags&WHERE_ONET
17860 41 42 4c 45 5f 4f 4e 4c 59 29 20 29 20 72 65 74  ABLE_ONLY) ) ret
17870 75 72 6e 3b 0a 0a 20 20 20 20 69 73 53 65 61 72  urn;..    isSear
17880 63 68 20 3d 20 28 66 6c 61 67 73 26 28 57 48 45  ch = (flags&(WHE
17890 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45  RE_BTM_LIMIT|WHE
178a0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d  RE_TOP_LIMIT))!=
178b0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0.            ||
178c0 20 28 28 66 6c 61 67 73 26 57 48 45 52 45 5f 56   ((flags&WHERE_V
178d0 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
178e0 26 26 20 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  && (pLoop->u.btr
178f0 65 65 2e 6e 45 71 3e 30 29 29 0a 20 20 20 20 20  ee.nEq>0)).     
17900 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c         || (wctrl
17910 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f 52 44  Flags&(WHERE_ORD
17920 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f  ERBY_MIN|WHERE_O
17930 52 44 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a 20  RDERBY_MAX));.. 
17940 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
17950 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
17960 22 2c 20 69 73 53 65 61 72 63 68 3f 22 53 45 41  ", isSearch?"SEA
17970 52 43 48 22 3a 22 53 43 41 4e 22 29 3b 0a 20 20  RCH":"SCAN");.  
17980 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
17990 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 4d  lect ){.      zM
179a0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
179b0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
179c0 25 73 20 53 55 42 51 55 45 52 59 20 25 64 22 2c  %s SUBQUERY %d",
179d0 20 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e 69 53 65   zMsg,pItem->iSe
179e0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 7d 65 6c  lectId);.    }el
179f0 73 65 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d  se{.      zMsg =
17a00 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
17a10 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 54  (db, zMsg, "%s T
17a20 41 42 4c 45 20 25 73 22 2c 20 7a 4d 73 67 2c 20  ABLE %s", zMsg, 
17a30 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
17a40 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49     }..    if( pI
17a50 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
17a60 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
17a70 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
17a80 7a 4d 73 67 2c 20 22 25 73 20 41 53 20 25 73 22  zMsg, "%s AS %s"
17a90 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a  , zMsg, pItem->z
17aa0 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20  Alias);.    }.  
17ab0 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28    if( (flags & (
17ac0 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f  WHERE_IPK|WHERE_
17ad0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 29 3d 3d  VIRTUALTABLE))==
17ae0 30 0a 20 20 20 20 20 26 26 20 41 4c 57 41 59 53  0.     && ALWAYS
17af0 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  (pLoop->u.btree.
17b00 70 49 6e 64 65 78 21 3d 30 29 0a 20 20 20 20 29  pIndex!=0).    )
17b10 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57  {.      char *zW
17b20 68 65 72 65 20 3d 20 65 78 70 6c 61 69 6e 49 6e  here = explainIn
17b30 64 65 78 52 61 6e 67 65 28 64 62 2c 20 70 4c 6f  dexRange(db, pLo
17b40 6f 70 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29  op, pItem->pTab)
17b50 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  ;.      zMsg = s
17b60 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
17b70 62 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20  b, zMsg,.       
17b80 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20          ((flags 
17b90 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
17ba0 45 58 29 20 3f 20 0a 20 20 20 20 20 20 20 20 20  EX) ? .         
17bb0 20 20 20 20 20 20 20 20 20 20 22 25 73 20 55 53            "%s US
17bc0 49 4e 47 20 41 55 54 4f 4d 41 54 49 43 20 25 73  ING AUTOMATIC %s
17bd0 49 4e 44 45 58 25 2e 30 73 25 73 22 20 3a 0a 20  INDEX%.0s%s" :. 
17be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bf0 20 20 22 25 73 20 55 53 49 4e 47 20 25 73 49 4e    "%s USING %sIN
17c00 44 45 58 20 25 73 25 73 22 29 2c 20 0a 20 20 20  DEX %s%s"), .   
17c10 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d 73 67              zMsg
17c20 2c 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52  , ((flags & WHER
17c30 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 3f 20 22 43  E_IDX_ONLY) ? "C
17c40 4f 56 45 52 49 4e 47 20 22 20 3a 20 22 22 29 2c  OVERING " : ""),
17c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17c60 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
17c70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 57  Index->zName, zW
17c80 68 65 72 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  here);.      sql
17c90 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
17ca0 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Where);.    }els
17cb0 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57  e if( (flags & W
17cc0 48 45 52 45 5f 49 50 4b 29 21 3d 30 20 26 26 20  HERE_IPK)!=0 && 
17cd0 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  (flags & WHERE_C
17ce0 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30 20 29 7b  ONSTRAINT)!=0 ){
17cf0 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
17d00 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
17d10 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e  , zMsg, "%s USIN
17d20 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  G INTEGER PRIMAR
17d30 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 0a  Y KEY", zMsg);..
17d40 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 26        if( flags&
17d50 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51  (WHERE_COLUMN_EQ
17d60 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e  |WHERE_COLUMN_IN
17d70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  ) ){.        zMs
17d80 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
17d90 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
17da0 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c 20 7a 4d  s (rowid=?)", zM
17db0 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sg);.      }else
17dc0 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52   if( (flags&WHER
17dd0 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d 57  E_BOTH_LIMIT)==W
17de0 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20  HERE_BOTH_LIMIT 
17df0 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
17e00 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
17e10 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
17e20 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20 72 6f 77  (rowid>? AND row
17e30 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id<?)", zMsg);. 
17e40 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
17e50 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c  lags&WHERE_BTM_L
17e60 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20  IMIT ){.        
17e70 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
17e80 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
17e90 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 29 22 2c   "%s (rowid>?)",
17ea0 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65   zMsg);.      }e
17eb0 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 66  lse if( ALWAYS(f
17ec0 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c  lags&WHERE_TOP_L
17ed0 49 4d 49 54 29 20 29 7b 0a 20 20 20 20 20 20 20  IMIT) ){.       
17ee0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
17ef0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
17f00 2c 20 22 25 73 20 28 72 6f 77 69 64 3c 3f 29 22  , "%s (rowid<?)"
17f10 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
17f20 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
17f30 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
17f40 41 4c 54 41 42 4c 45 0a 20 20 20 20 65 6c 73 65  ALTABLE.    else
17f50 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48   if( (flags & WH
17f60 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
17f70 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d  )!=0 ){.      zM
17f80 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
17f90 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
17fa0 25 73 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  %s VIRTUAL TABLE
17fb0 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 20 7a   INDEX %d:%s", z
17fc0 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Msg,.           
17fd0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e         pLoop->u.
17fe0 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 4c 6f  vtab.idxNum, pLo
17ff0 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  op->u.vtab.idxSt
18000 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  r);.    }.#endif
18010 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
18020 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
18030 7a 4d 73 67 2c 20 22 25 73 22 2c 20 7a 4d 73 67  zMsg, "%s", zMsg
18040 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
18050 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
18060 78 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65  xplain, iId, iLe
18070 76 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67  vel, iFrom, zMsg
18080 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
18090 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
180a0 69 6e 65 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63  ine explainOneSc
180b0 61 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a  an(u,v,w,x,y,z).
180c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
180d0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f  _OMIT_EXPLAIN */
180e0 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
180f0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73  e code for the s
18100 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c 65 76  tart of the iLev
18110 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68  el-th loop in th
18120 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a  e WHERE clause.*
18130 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
18140 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70 57   described by pW
18150 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Info..*/.static 
18160 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c  Bitmask codeOneL
18170 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68 65 72  oopStart(.  Wher
18180 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20  eInfo *pWInfo,  
18190 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66   /* Complete inf
181a0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
181b0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
181c0 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
181d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69            /* Whi
181e0 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e  ch level of pWIn
181f0 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62  fo->a[] should b
18200 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 42 69 74  e coded */.  Bit
18210 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20  mask notReady   
18220 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62 6c 65    /* Which table
18230 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  s are currently 
18240 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a  available */.){.
18250 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20    int j, k;     
18260 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
18270 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
18280 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
18290 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75    /* The VDBE cu
182a0 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62  rsor for the tab
182b0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  le */.  int addr
182c0 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Nxt;         /* 
182d0 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f  Where to jump to
182e0 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74   continue with t
182f0 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20  he next IN case 
18300 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61 62  */.  int omitTab
18310 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  le;       /* Tru
18320 65 20 69 66 20 77 65 20 75 73 65 20 74 68 65 20  e if we use the 
18330 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20  index only */.  
18340 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20  int bRev;       
18350 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
18360 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20  we need to scan 
18370 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
18380 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
18390 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68   *pLevel;  /* Th
183a0 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20 74 6f  e where level to
183b0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57   be coded */.  W
183c0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
183d0 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
183e0 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62 65 69 6e  Loop object bein
183f0 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65  g coded */.  Whe
18400 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
18410 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69    /* Decompositi
18420 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  on of the entire
18430 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
18440 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
18450 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
18460 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63 6c     /* A WHERE cl
18470 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50  ause term */.  P
18480 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
18490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
184a0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
184b0 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
184c0 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
184d0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
184e0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
184f0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
18500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18510 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
18520 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f  ed stmt under co
18530 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20  nstructions */. 
18540 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
18550 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20  item *pTabItem; 
18560 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
18570 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64  term being coded
18580 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72   */.  int addrBr
18590 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
185a0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
185b0 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
185c0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
185d0 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20   int addrCont;  
185e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185f0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
18600 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
18610 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  ext cycle */.  i
18620 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30  nt iRowidReg = 0
18630 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ;        /* Rowi
18640 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  d is stored in t
18650 68 69 73 20 72 65 67 69 73 74 65 72 2c 20 69 66  his register, if
18660 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69   not zero */.  i
18670 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d  nt iReleaseReg =
18680 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70   0;      /* Temp
18690 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65   register to fre
186a0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
186b0 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20  ng */..  pParse 
186c0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
186d0 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  v = pParse->
186e0 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 26  pVdbe;.  pWC = &
186f0 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 64  pWInfo->sWC;.  d
18700 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
18710 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
18720 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20  fo->a[iLevel];. 
18730 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
18740 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54 61 62 49  >pWLoop;.  pTabI
18750 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70  tem = &pWInfo->p
18760 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
18770 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75  l->iFrom];.  iCu
18780 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
18790 75 72 73 6f 72 3b 0a 20 20 70 4c 65 76 65 6c 2d  ursor;.  pLevel-
187a0 3e 6e 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74 52  >notReady = notR
187b0 65 61 64 79 20 26 20 7e 67 65 74 4d 61 73 6b 28  eady & ~getMask(
187c0 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
187d0 74 2c 20 69 43 75 72 29 3b 0a 20 20 62 52 65 76  t, iCur);.  bRev
187e0 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76 4d   = (pWInfo->revM
187f0 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b 0a  ask>>iLevel)&1;.
18800 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70    omitTable = (p
18810 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
18820 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21  WHERE_IDX_ONLY)!
18830 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 26  =0 .           &
18840 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
18850 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f  Flags & WHERE_FO
18860 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 20  RCE_TABLE)==0;. 
18870 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
18880 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48  nt((v, "Begin WH
18890 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c  ERE-loop%d: %s",
188a0 69 4c 65 76 65 6c 2c 70 54 61 62 49 74 65 6d 2d  iLevel,pTabItem-
188b0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
188c0 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62  .  /* Create lab
188d0 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72 65  els for the "bre
188e0 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75  ak" and "continu
188f0 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a  e" instructions.
18900 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72    ** for the cur
18910 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70  rent loop.  Jump
18920 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62   to addrBrk to b
18930 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f  reak out of a lo
18940 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f  op..  ** Jump to
18950 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65   cont to go imme
18960 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e  diately to the n
18970 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
18980 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a   the.  ** loop..
18990 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74    **.  ** When t
189a0 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70  here is an IN op
189b0 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20  erator, we also 
189c0 68 61 76 65 20 61 20 22 61 64 64 72 4e 78 74 22  have a "addrNxt"
189d0 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a   label that.  **
189e0 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e   means to contin
189f0 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74  ue with the next
18a00 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e   IN value combin
18a10 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a  ation.  When.  *
18a20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49  * there are no I
18a30 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74  N operators in t
18a40 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  he constraints, 
18a50 74 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61  the "addrNxt" la
18a60 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  bel.  ** is the 
18a70 73 61 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b  same as "addrBrk
18a80 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72  "..  */.  addrBr
18a90 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
18aa0 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Brk = pLevel->ad
18ab0 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56  drNxt = sqlite3V
18ac0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
18ad0 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c  .  addrCont = pL
18ae0 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d  evel->addrCont =
18af0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
18b00 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
18b10 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72  If this is the r
18b20 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20  ight table of a 
18b30 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c  LEFT OUTER JOIN,
18b40 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20   allocate and.  
18b50 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** initialize a 
18b60 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74  memory cell that
18b70 20 72 65 63 6f 72 64 73 20 69 66 20 74 68 69 73   records if this
18b80 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61   table matches a
18b90 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74  ny.  ** row of t
18ba0 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66  he left table of
18bb0 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a   the join..  */.
18bc0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46    if( pLevel->iF
18bd0 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74  rom>0 && (pTabIt
18be0 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  em[0].jointype &
18bf0 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a   JT_LEFT)!=0 ){.
18c00 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66      pLevel->iLef
18c10 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65  tJoin = ++pParse
18c20 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
18c30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18c40 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
18c50 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
18c60 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  n);.    VdbeComm
18c70 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45  ent((v, "init LE
18c80 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68  FT JOIN no-match
18c90 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20   flag"));.  }.. 
18ca0 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
18cb0 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
18cc0 65 20 73 75 62 71 75 65 72 79 20 69 6d 70 6c 65  e subquery imple
18cd0 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72  mented as a co-r
18ce0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20  outine */.  if( 
18cf0 70 54 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72  pTabItem->viaCor
18d00 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e  outine ){.    in
18d10 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61  t regYield = pTa
18d20 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  bItem->regReturn
18d30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
18d40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
18d50 74 65 67 65 72 2c 20 70 54 61 62 49 74 65 6d 2d  teger, pTabItem-
18d60 3e 61 64 64 72 46 69 6c 6c 53 75 62 2d 31 2c 20  >addrFillSub-1, 
18d70 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 70  regYield);.    p
18d80 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 20 73 71 6c  Level->p2 =  sql
18d90 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
18da0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59  , OP_Yield, regY
18db0 69 65 6c 64 29 3b 0a 20 20 20 20 56 64 62 65 43  ield);.    VdbeC
18dc0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74  omment((v, "next
18dd0 20 72 6f 77 20 6f 66 20 63 6f 2d 72 6f 75 74 69   row of co-routi
18de0 6e 65 20 25 73 22 2c 20 70 54 61 62 49 74 65 6d  ne %s", pTabItem
18df0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
18e00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18e10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
18e20 20 72 65 67 59 69 65 6c 64 2b 31 2c 20 61 64 64   regYield+1, add
18e30 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65  rBrk);.    pLeve
18e40 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b  l->op = OP_Goto;
18e50 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
18e60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
18e70 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
18e80 20 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67    (pLoop->wsFlag
18e90 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
18ea0 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
18eb0 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 54 68    /* Case 1:  Th
18ec0 65 20 74 61 62 6c 65 20 69 73 20 61 20 76 69 72  e table is a vir
18ed0 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65  tual-table.  Use
18ee0 20 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64   the VFilter and
18ef0 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20   VNext.    **   
18f00 20 20 20 20 20 20 20 74 6f 20 61 63 63 65 73 73         to access
18f10 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a   the data..    *
18f20 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20  /.    int iReg; 
18f30 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f    /* P3 Value fo
18f40 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a  r OP_VFilter */.
18f50 20 20 20 20 69 6e 74 20 61 64 64 72 4e 6f 74 46      int addrNotF
18f60 6f 75 6e 64 3b 0a 20 20 20 20 69 6e 74 20 6e 43  ound;.    int nC
18f70 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 4c 6f 6f  onstraint = pLoo
18f80 70 2d 3e 6e 4c 54 65 72 6d 3b 0a 0a 20 20 20 20  p->nLTerm;..    
18f90 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
18fa0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
18fb0 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
18fc0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
18fd0 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  rse, nConstraint
18fe0 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 4e 6f 74  +2);.    addrNot
18ff0 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e  Found = pLevel->
19000 61 64 64 72 42 72 6b 3b 0a 20 20 20 20 66 6f 72  addrBrk;.    for
19010 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61  (j=0; j<nConstra
19020 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  int; j++){.     
19030 20 69 6e 74 20 69 54 61 72 67 65 74 20 3d 20 69   int iTarget = i
19040 52 65 67 2b 6a 2b 32 3b 0a 20 20 20 20 20 20 70  Reg+j+2;.      p
19050 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  Term = pLoop->aL
19060 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  Term[j];.      i
19070 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f  f( pTerm==0 ) co
19080 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
19090 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
190a0 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20  or & WO_IN ){.  
190b0 20 20 20 20 20 20 63 6f 64 65 45 71 75 61 6c 69        codeEquali
190c0 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
190d0 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c  Term, pLevel, j,
190e0 20 62 52 65 76 2c 20 69 54 61 72 67 65 74 29 3b   bRev, iTarget);
190f0 0a 20 20 20 20 20 20 20 20 61 64 64 72 4e 6f 74  .        addrNot
19100 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e  Found = pLevel->
19110 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 20 20 7d  addrNxt;.      }
19120 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
19130 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
19140 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78  arse, pTerm->pEx
19150 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72  pr->pRight, iTar
19160 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  get);.      }.  
19170 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
19180 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19190 49 6e 74 65 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e  Integer, pLoop->
191a0 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 69  u.vtab.idxNum, i
191b0 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Reg);.    sqlite
191c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
191d0 50 5f 49 6e 74 65 67 65 72 2c 20 6e 43 6f 6e 73  P_Integer, nCons
191e0 74 72 61 69 6e 74 2c 20 69 52 65 67 2b 31 29 3b  traint, iReg+1);
191f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19200 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69  AddOp4(v, OP_VFi
19210 6c 74 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72  lter, iCur, addr
19220 4e 6f 74 46 6f 75 6e 64 2c 20 69 52 65 67 2c 0a  NotFound, iReg,.
19230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19240 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76        pLoop->u.v
19250 74 61 62 2e 69 64 78 53 74 72 2c 0a 20 20 20 20  tab.idxStr,.    
19260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19270 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
19280 6e 65 65 64 46 72 65 65 20 3f 20 50 34 5f 4d 50  needFree ? P4_MP
19290 52 49 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49  RINTF : P4_STATI
192a0 43 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  C);.    pLoop->u
192b0 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
192c0 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   0;.    for(j=0;
192d0 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26   j<nConstraint &
192e0 26 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20  & j<16; j++){.  
192f0 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
19300 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e  u.vtab.omitMask>
19310 3e 6a 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20  >j)&1 ){.       
19320 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
19330 76 65 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  vel, pLoop->aLTe
19340 72 6d 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  rm[j]);.      }.
19350 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
19360 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b  ->op = OP_VNext;
19370 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
19380 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76  = iCur;.    pLev
19390 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33  el->p2 = sqlite3
193a0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
193b0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  v);.    sqlite3R
193c0 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
193d0 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43  pParse, iReg, nC
193e0 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20  onstraint+2);.  
193f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
19400 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
19410 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
19420 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
19430 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
19440 0a 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77  .  if( (pLoop->w
19450 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
19460 50 4b 29 21 3d 30 0a 20 20 20 26 26 20 28 70 4c  PK)!=0.   && (pL
19470 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  oop->wsFlags & (
19480 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c  WHERE_COLUMN_IN|
19490 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29  WHERE_COLUMN_EQ)
194a0 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  )!=0.  ){.    /*
194b0 20 43 61 73 65 20 32 3a 20 20 57 65 20 63 61 6e   Case 2:  We can
194c0 20 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65   directly refere
194d0 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nce a single row
194e0 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
194f0 20 20 20 20 20 20 20 20 20 20 65 71 75 61 6c 69            equali
19500 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
19510 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
19520 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a  field.  Or.    *
19530 2a 20 20 20 20 20 20 20 20 20 20 77 65 20 72 65  *          we re
19540 66 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65  ference multiple
19550 20 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72   rows using a "r
19560 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20  owid IN (...)". 
19570 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63     **          c
19580 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f  onstruct..    */
19590 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
195a0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d  op->u.btree.nEq=
195b0 3d 31 20 29 3b 0a 20 20 20 20 69 52 65 6c 65 61  =1 );.    iRelea
195c0 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  seReg = sqlite3G
195d0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
195e0 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70  );.    pTerm = p
195f0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b  Loop->aLTerm[0];
19600 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
19610 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  rm!=0 );.    ass
19620 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ert( pTerm->pExp
19630 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  r!=0 );.    asse
19640 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
19650 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
19660 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
19670 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
19680 29 3b 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67  );.    iRowidReg
19690 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54   = codeEqualityT
196a0 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
196b0 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52  m, pLevel, 0, bR
196c0 65 76 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29  ev, iReleaseReg)
196d0 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
196e0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
196f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19700 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
19710 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65  tBeInt, iRowidRe
19720 67 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  g, addrNxt);.   
19730 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19740 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
19750 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78  ts, iCur, addrNx
19760 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  t, iRowidReg);. 
19770 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
19780 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
19790 65 28 70 50 61 72 73 65 2c 20 69 52 6f 77 69 64  e(pParse, iRowid
197a0 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  Reg, 1);.    sql
197b0 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
197c0 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
197d0 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
197e0 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
197f0 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
19800 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
19810 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69  _Noop;.  }else i
19820 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
19830 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21  gs & WHERE_IPK)!
19840 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
19850 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
19860 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
19870 4e 47 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  NGE)!=0.  ){.   
19880 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 57 65 20   /* Case 3:  We 
19890 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  have an inequali
198a0 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
198b0 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
198c0 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  field..    */.  
198d0 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f    int testOp = O
198e0 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  P_Noop;.    int 
198f0 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d  start;.    int m
19900 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a  emEndValue = 0;.
19910 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
19920 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20  Start, *pEnd;.. 
19930 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
19940 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 6a  able==0 );.    j
19950 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
19960 20 3d 20 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20   = pEnd = 0;.   
19970 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
19980 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
19990 4c 49 4d 49 54 20 29 20 70 53 74 61 72 74 20 3d  LIMIT ) pStart =
199a0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
199b0 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  ++];.    if( pLo
199c0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
199d0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 20  ERE_TOP_LIMIT ) 
199e0 70 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  pEnd = pLoop->aL
199f0 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61  Term[j++];.    a
19a00 73 73 65 72 74 28 20 70 53 74 61 72 74 21 3d 30  ssert( pStart!=0
19a10 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20   || pEnd!=0 );. 
19a20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
19a30 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74       pTerm = pSt
19a40 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72  art;.      pStar
19a50 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  t = pEnd;.      
19a60 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pEnd = pTerm;.  
19a70 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61    }.    if( pSta
19a80 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  rt ){.      Expr
19a90 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
19aa0 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
19ab0 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73  ion that defines
19ac0 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64   the start bound
19ad0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31   */.      int r1
19ae0 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20  , rTemp;        
19af0 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f 72  /* Registers for
19b00 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61   holding the sta
19b10 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a  rt boundary */..
19b20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
19b30 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20  lowing constant 
19b40 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73  maps TK_xx codes
19b50 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64   into correspond
19b60 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65  ing .      ** se
19b70 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20  ek opcodes.  It 
19b80 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72  depends on a par
19b90 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67  ticular ordering
19ba0 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20   of TK_xx.      
19bb0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  */.      const u
19bc0 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a  8 aMoveOp[] = {.
19bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
19be0 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47  _GT */  OP_SeekG
19bf0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,.           /*
19c00 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65   TK_LE */  OP_Se
19c10 65 6b 4c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  ekLe,.          
19c20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50   /* TK_LT */  OP
19c30 5f 53 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20 20  _SeekLt,.       
19c40 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20      /* TK_GE */ 
19c50 20 4f 50 5f 53 65 65 6b 47 65 0a 20 20 20 20 20   OP_SeekGe.     
19c60 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   };.      assert
19c70 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31  ( TK_LE==TK_GT+1
19c80 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65   );      /* Make
19c90 20 73 75 72 65 20 74 68 65 20 6f 72 64 65 72 69   sure the orderi
19ca0 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ng.. */.      as
19cb0 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f  sert( TK_LT==TK_
19cc0 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+2 );      /* 
19cd0 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78   ... of the TK_x
19ce0 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20  x values... */. 
19cf0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
19d00 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20  GE==TK_GT+3 );  
19d10 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63      /*  ... is c
19d20 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20  orrecct. */..   
19d30 20 20 20 61 73 73 65 72 74 28 20 28 70 53 74 61     assert( (pSta
19d40 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
19d50 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a  RM_VNULL)==0 );.
19d60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19d70 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  pStart->wtFlags 
19d80 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
19d90 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53 74  ;.      pX = pSt
19da0 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  art->pExpr;.    
19db0 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
19dc0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
19dd0 65 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43  e( pStart->leftC
19de0 75 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f  ursor!=iCur ); /
19df0 2a 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e  * transitive con
19e00 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
19e10 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
19e20 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
19e30 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26  e, pX->pRight, &
19e40 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  rTemp);.      sq
19e50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
19e60 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f  v, aMoveOp[pX->o
19e70 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20  p-TK_GT], iCur, 
19e80 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20  addrBrk, r1);.  
19e90 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
19ea0 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
19eb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
19ec0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
19ed0 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b  (pParse, r1, 1);
19ee0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
19ef0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
19f00 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20  rse, rTemp);.   
19f10 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
19f20 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a  Level, pStart);.
19f30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19f40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19f50 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f  p2(v, bRev ? OP_
19f60 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64  Last : OP_Rewind
19f70 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29  , iCur, addrBrk)
19f80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19f90 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78  pEnd ){.      Ex
19fa0 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58  pr *pX;.      pX
19fb0 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a   = pEnd->pExpr;.
19fc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
19fd0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
19fe0 65 72 74 28 20 28 70 45 6e 64 2d 3e 77 74 46 6c  ert( (pEnd->wtFl
19ff0 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
1a000 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  )==0 );.      te
1a010 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 6c 65  stcase( pEnd->le
1a020 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29  ftCursor!=iCur )
1a030 3b 20 2f 2a 20 54 72 61 6e 73 69 74 69 76 65 20  ; /* Transitive 
1a040 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
1a050 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1a060 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
1a070 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
1a080 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65       memEndValue
1a090 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1a0a0 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
1a0b0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1a0c0 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d   pX->pRight, mem
1a0d0 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  EndValue);.     
1a0e0 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
1a0f0 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LT || pX->op==TK
1a100 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74  _GT ){.        t
1a110 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
1a120 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20  P_Le : OP_Ge;.  
1a130 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a140 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76     testOp = bRev
1a150 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74   ? OP_Lt : OP_Gt
1a160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a170 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1a180 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d  el, pEnd);.    }
1a190 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c  .    start = sql
1a1a0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1a1b0 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76  ddr(v);.    pLev
1a1c0 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20  el->op = bRev ? 
1a1d0 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78  OP_Prev : OP_Nex
1a1e0 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  t;.    pLevel->p
1a1f0 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c  1 = iCur;.    pL
1a200 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74  evel->p2 = start
1a210 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
1a220 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20  evel->p5==0 );. 
1a230 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f     if( testOp!=O
1a240 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
1a250 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c  iRowidReg = iRel
1a260 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65  easeReg = sqlite
1a270 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
1a280 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
1a290 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a2a0 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20  OP_Rowid, iCur, 
1a2b0 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1a2c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1a2d0 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
1a2e0 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
1a2f0 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
1a300 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1a310 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56   testOp, memEndV
1a320 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69  alue, addrBrk, i
1a330 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
1a340 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1a350 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41  geP5(v, SQLITE_A
1a360 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c  FF_NUMERIC | SQL
1a370 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
1a380 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1a390 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1a3a0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
1a3b0 44 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  D ){.    /* Case
1a3c0 20 34 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67   4: A scan using
1a3d0 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a   an index..    *
1a3e0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1a3f0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1a400 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65  e may contain ze
1a410 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c  ro or more equal
1a420 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  ity .    **     
1a430 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20      terms ("==" 
1a440 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  or "IN" operator
1a450 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  s) that refer to
1a460 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20   the N.    **   
1a470 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20        left-most 
1a480 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
1a490 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73  ndex. It may als
1a4a0 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a  o contain.    **
1a4b0 20 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c           inequal
1a4c0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
1a4d0 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29  (>, <, >= or <=)
1a4e0 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a   on the indexed.
1a4f0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
1a500 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64  olumn that immed
1a510 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74  iately follows t
1a520 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e  he N equalities.
1a530 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20   Only .    **   
1a540 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d        the right-
1a550 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  most column can 
1a560 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  be an inequality
1a570 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74   - the rest must
1a580 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1a590 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64  use the "==" and
1a5a0 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e   "IN" operators.
1a5b0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
1a5c0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20   the .    **    
1a5d0 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e       index is on
1a5e0 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74   (x,y,z), then t
1a5f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61  he following cla
1a600 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20  uses are all .  
1a610 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74    **         opt
1a620 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20  imized:.    **. 
1a630 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1a640 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20   x=5.    **     
1a650 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
1a660 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  =10.    **      
1a670 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c        x=5 AND y<
1a680 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
1a690 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35       x=5 AND y>5
1a6a0 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
1a6b0 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1a6c0 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31  AND y=5 AND z<=1
1a6d0 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  0.    **.    ** 
1a6e0 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30          The z<10
1a6f0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c   term of the fol
1a700 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65  lowing cannot be
1a710 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20   used, only.    
1a720 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78  **         the x
1a730 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a  =5 term:.    **.
1a740 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1a750 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20    x=5 AND z<10. 
1a760 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1a770 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65       N may be ze
1a780 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
1a790 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1a7a0 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20  raints..    **  
1a7b0 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20         If there 
1a7c0 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74  are no inequalit
1a7d0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  y constraints, t
1a7e0 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20  hen N is at.    
1a7f0 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74  **         least
1a800 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   one..    **.   
1a810 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73   **         This
1a820 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73   case is also us
1a830 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
1a840 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
1a850 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
1a860 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74   constraints but
1a870 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c   an index is sel
1a880 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e  ected anyway, in
1a890 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20   order.    **   
1a8a0 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74        to force t
1a8b0 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  he output order 
1a8c0 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e  to conform to an
1a8d0 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a   ORDER BY..    *
1a8e0 2f 20 20 0a 20 20 20 20 73 74 61 74 69 63 20 63  /  .    static c
1a8f0 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f 70  onst u8 aStartOp
1a900 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a  [] = {.      0,.
1a910 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f        0,.      O
1a920 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20  P_Rewind,       
1a930 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72      /* 2: (!star
1a940 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  t_constraints &&
1a950 20 73 74 61 72 74 45 71 20 26 26 20 20 21 62 52   startEq &&  !bR
1a960 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1a970 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Last,           
1a980 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f    /* 3: (!start_
1a990 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
1a9a0 74 61 72 74 45 71 20 26 26 20 20 20 62 52 65 76  tartEq &&   bRev
1a9b0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
1a9c0 65 6b 47 74 2c 20 20 20 20 20 20 20 20 20 20 20  ekGt,           
1a9d0 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 4: (start_con
1a9e0 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74  straints  && !st
1a9f0 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20  artEq && !bRev) 
1aa00 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
1aa10 4c 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Lt,           /*
1aa20 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   5: (start_const
1aa30 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
1aa40 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f  tEq &&  bRev) */
1aa50 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 65  .      OP_SeekGe
1aa60 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36  ,           /* 6
1aa70 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
1aa80 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45  ints  &&  startE
1aa90 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  q && !bRev) */. 
1aaa0 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 65 20 20       OP_SeekLe  
1aab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20            /* 7: 
1aac0 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1aad0 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
1aae0 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &&  bRev) */.   
1aaf0 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
1ab00 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d  onst u8 aEndOp[]
1ab10 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f   = {.      OP_No
1ab20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
1ab30 2f 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73  /* 0: (!end_cons
1ab40 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20  traints) */.    
1ab50 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20    OP_IdxGE,     
1ab60 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e         /* 1: (en
1ab70 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
1ab80 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
1ab90 20 4f 50 5f 49 64 78 4c 54 20 20 20 20 20 20 20   OP_IdxLT       
1aba0 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64        /* 2: (end
1abb0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1abc0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a  bRev) */.    };.
1abd0 20 20 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c      u16 nEq = pL
1abe0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1abf0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
1ac00 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d  of == or IN term
1ac10 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4d  s */.    int isM
1ac20 69 6e 51 75 65 72 79 20 3d 20 30 3b 20 20 20 20  inQuery = 0;    
1ac30 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
1ac40 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64   is an optimized
1ac50 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e   SELECT min(x)..
1ac60 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42   */.    int regB
1ac70 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
1ac80 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
1ac90 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f  ister holding co
1aca0 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20  nstraint values 
1acb0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31 3b 20 20  */.    int r1;  
1acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acd0 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69      /* Temp regi
1ace0 73 74 65 72 20 2a 2f 0a 20 20 20 20 57 68 65 72  ster */.    Wher
1acf0 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 53 74 61  eTerm *pRangeSta
1ad00 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71  rt = 0;  /* Ineq
1ad10 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1ad20 74 20 61 74 20 72 61 6e 67 65 20 73 74 61 72 74  t at range start
1ad30 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
1ad40 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30  m *pRangeEnd = 0
1ad50 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69  ;    /* Inequali
1ad60 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74  ty constraint at
1ad70 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20   range end */.  
1ad80 20 20 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20    int startEq;  
1ad90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ada0 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20  * True if range 
1adb0 73 74 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e  start uses ==, >
1adc0 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69  = or <= */.    i
1add0 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20  nt endEq;       
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1adf0 72 75 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64  rue if range end
1ae00 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20   uses ==, >= or 
1ae10 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74  <= */.    int st
1ae20 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b  art_constraints;
1ae30 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
1ae40 6f 66 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73  of range is cons
1ae50 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69  trained */.    i
1ae60 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  nt nConstraint; 
1ae70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1ae80 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61  umber of constra
1ae90 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  int terms */.   
1aea0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
1aeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aec0 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69   The index we wi
1aed0 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20  ll be using */. 
1aee0 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20     int iIdxCur; 
1aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af00 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
1af10 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
1af20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78 74   */.    int nExt
1af30 72 61 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  raReg = 0;      
1af40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1af50 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
1af60 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20  s needed */.    
1af70 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
1af80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1af90 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f  Instruction opco
1afa0 64 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  de */.    char *
1afb0 7a 53 74 61 72 74 41 66 66 3b 20 20 20 20 20 20  zStartAff;      
1afc0 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
1afd0 74 79 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20  ty for start of 
1afe0 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
1aff0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 45 6e   */.    char cEn
1b000 64 41 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20  dAff = 0;       
1b010 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
1b020 20 66 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e 67   for end of rang
1b030 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
1b040 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f  .    pIdx = pLoo
1b050 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
1b060 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d  x;.    iIdxCur =
1b070 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
1b080 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 45  ;.    assert( nE
1b090 71 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  q>=pLoop->u.btre
1b0a0 65 2e 6e 53 6b 69 70 20 29 3b 0a 0a 20 20 20 20  e.nSkip );..    
1b0b0 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20  /* If this loop 
1b0c0 73 61 74 69 73 66 69 65 73 20 61 20 73 6f 72 74  satisfies a sort
1b0d0 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42 79   order (pOrderBy
1b0e0 29 20 72 65 71 75 65 73 74 20 74 68 61 74 20 0a  ) request that .
1b0f0 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65      ** was passe
1b100 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
1b110 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  on to implement 
1b120 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  a "SELECT min(x)
1b130 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75   ..." .    ** qu
1b140 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61  ery, then the ca
1b150 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61  ller will only a
1b160 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f  llow the loop to
1b170 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20   run for.    ** 
1b180 61 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69  a single iterati
1b190 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  on. This means t
1b1a0 68 61 74 20 74 68 65 20 66 69 72 73 74 20 72 6f  hat the first ro
1b1b0 77 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a  w returned.    *
1b1c0 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76  * should not hav
1b1d0 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73  e a NULL value s
1b1e0 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66  tored in 'x'. If
1b1f0 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20   column 'x' is. 
1b200 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20     ** the first 
1b210 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e 45  one after the nE
1b220 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  q equality const
1b230 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  raints in the in
1b240 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73  dex,.    ** this
1b250 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73   requires some s
1b260 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e  pecial handling.
1b270 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1b280 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
1b290 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
1b2a0 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20 26  Y_MIN)!=0.     &
1b2b0 26 20 28 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61  & (pWInfo->bOBSa
1b2c0 74 21 3d 30 29 0a 20 20 20 20 20 26 26 20 28 70  t!=0).     && (p
1b2d0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 71  Idx->nKeyCol>nEq
1b2e0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61  ).    ){.      a
1b2f0 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e  ssert( pLoop->u.
1b300 62 74 72 65 65 2e 6e 53 6b 69 70 3d 3d 30 20 29  btree.nSkip==0 )
1b310 3b 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65  ;.      isMinQue
1b320 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45  ry = 1;.      nE
1b330 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20  xtraReg = 1;.   
1b340 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20   }..    /* Find 
1b350 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63  any inequality c
1b360 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
1b370 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e  for the start an
1b380 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66  d end .    ** of
1b390 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20   the range. .   
1b3a0 20 2a 2f 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b   */.    j = nEq;
1b3b0 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1b3c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1b3d0 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
1b3e0 20 20 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d     pRangeStart =
1b3f0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1b400 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  ++];.      nExtr
1b410 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
1b420 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1b430 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
1b440 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
1b450 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 70 4c    pRangeEnd = pL
1b460 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
1b470 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
1b480 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  g = 1;.    }..  
1b490 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1b4a0 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
1b4b0 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ll constraint te
1b4c0 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20  rms using == or 
1b4d0 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74  IN.    ** and st
1b4e0 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ore the values o
1b4f0 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e  f those terms in
1b500 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
1b510 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74  isters.    ** st
1b520 61 72 74 69 6e 67 20 61 74 20 72 65 67 42 61 73  arting at regBas
1b530 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  e..    */.    re
1b540 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45  gBase = codeAllE
1b550 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61  qualityTerms(pPa
1b560 72 73 65 2c 70 4c 65 76 65 6c 2c 62 52 65 76 2c  rse,pLevel,bRev,
1b570 6e 45 78 74 72 61 52 65 67 2c 26 7a 53 74 61 72  nExtraReg,&zStar
1b580 74 41 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72  tAff);.    asser
1b590 74 28 20 7a 53 74 61 72 74 41 66 66 3d 3d 30 20  t( zStartAff==0 
1b5a0 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  || sqlite3Strlen
1b5b0 33 30 28 7a 53 74 61 72 74 41 66 66 29 3e 3d 6e  30(zStartAff)>=n
1b5c0 45 71 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  Eq );.    if( zS
1b5d0 74 61 72 74 41 66 66 20 29 20 63 45 6e 64 41 66  tartAff ) cEndAf
1b5e0 66 20 3d 20 7a 53 74 61 72 74 41 66 66 5b 6e 45  f = zStartAff[nE
1b5f0 71 5d 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20  q];.    addrNxt 
1b600 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
1b610 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  t;..    /* If we
1b620 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72 65 76   are doing a rev
1b630 65 72 73 65 20 6f 72 64 65 72 20 73 63 61 6e 20  erse order scan 
1b640 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
1b650 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a  index, or.    **
1b660 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72   a forward order
1b670 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65   scan on a desce
1b680 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74  nding index, int
1b690 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20  erchange the .  
1b6a0 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 65    ** start and e
1b6b0 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67 65  nd terms (pRange
1b6c0 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67 65  Start and pRange
1b6d0 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  End)..    */.   
1b6e0 20 69 66 28 20 28 6e 45 71 3c 70 49 64 78 2d 3e   if( (nEq<pIdx->
1b6f0 6e 4b 65 79 43 6f 6c 20 26 26 20 62 52 65 76 3d  nKeyCol && bRev=
1b700 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  =(pIdx->aSortOrd
1b710 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f  er[nEq]==SQLITE_
1b720 53 4f 5f 41 53 43 29 29 0a 20 20 20 20 20 7c 7c  SO_ASC)).     ||
1b730 20 28 62 52 65 76 20 26 26 20 70 49 64 78 2d 3e   (bRev && pIdx->
1b740 6e 4b 65 79 43 6f 6c 3d 3d 6e 45 71 29 0a 20 20  nKeyCol==nEq).  
1b750 20 20 29 7b 0a 20 20 20 20 20 20 53 57 41 50 28    ){.      SWAP(
1b760 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70 52 61  WhereTerm *, pRa
1b770 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65 53 74  ngeEnd, pRangeSt
1b780 61 72 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  art);.    }..   
1b790 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
1b7a0 65 53 74 61 72 74 20 26 26 20 28 70 52 61 6e 67  eStart && (pRang
1b7b0 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
1b7c0 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b  r & WO_LE)!=0 );
1b7d0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1b7e0 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 28 70  RangeStart && (p
1b7f0 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
1b800 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d  rator & WO_GE)!=
1b810 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
1b820 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20  e( pRangeEnd && 
1b830 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65  (pRangeEnd->eOpe
1b840 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d  rator & WO_LE)!=
1b850 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
1b860 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20  e( pRangeEnd && 
1b870 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65  (pRangeEnd->eOpe
1b880 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d  rator & WO_GE)!=
1b890 30 20 29 3b 0a 20 20 20 20 73 74 61 72 74 45 71  0 );.    startEq
1b8a0 20 3d 20 21 70 52 61 6e 67 65 53 74 61 72 74 20   = !pRangeStart 
1b8b0 7c 7c 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  || pRangeStart->
1b8c0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
1b8d0 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65  LE|WO_GE);.    e
1b8e0 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e 67 65  ndEq =   !pRange
1b8f0 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64  End || pRangeEnd
1b900 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1b910 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20  O_LE|WO_GE);.   
1b920 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
1b930 74 73 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74  ts = pRangeStart
1b940 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20   || nEq>0;..    
1b950 2f 2a 20 53 65 65 6b 20 74 68 65 20 69 6e 64 65  /* Seek the inde
1b960 78 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  x cursor to the 
1b970 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e  start of the ran
1b980 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73  ge. */.    nCons
1b990 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20  traint = nEq;.  
1b9a0 20 20 69 66 28 20 70 52 61 6e 67 65 53 74 61 72    if( pRangeStar
1b9b0 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  t ){.      Expr 
1b9c0 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65  *pRight = pRange
1b9d0 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52  Start->pExpr->pR
1b9e0 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  ight;.      sqli
1b9f0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1ba00 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  se, pRight, regB
1ba10 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
1ba20 69 66 28 20 28 70 52 61 6e 67 65 53 74 61 72 74  if( (pRangeStart
1ba30 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1ba40 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  _VNULL)==0 ){.  
1ba50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ba60 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28  rCodeIsNullJump(
1ba70 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  v, pRight, regBa
1ba80 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29  se+nEq, addrNxt)
1ba90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1baa0 69 66 28 20 7a 53 74 61 72 74 41 66 66 20 29 7b  if( zStartAff ){
1bab0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1bac0 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
1bad0 69 74 79 28 70 52 69 67 68 74 2c 20 7a 53 74 61  ity(pRight, zSta
1bae0 72 74 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c  rtAff[nEq])==SQL
1baf0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20  ITE_AFF_NONE){. 
1bb00 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63           /* Sinc
1bb10 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
1bb20 20 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72   is to be perfor
1bb30 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76  med with no conv
1bb40 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20  ersions.        
1bb50 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20    ** applied to 
1bb60 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65  the operands, se
1bb70 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
1bb80 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68  o apply to pRigh
1bb90 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20  t to .          
1bba0 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ** SQLITE_AFF_NO
1bbb0 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  NE.  */.        
1bbc0 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d    zStartAff[nEq]
1bbd0 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
1bbe0 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
1bbf0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1bc00 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
1bc10 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68  nityChange(pRigh
1bc20 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71  t, zStartAff[nEq
1bc30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
1bc40 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d  zStartAff[nEq] =
1bc50 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1bc60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1bc70 20 20 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e    }  .      nCon
1bc80 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20  straint++;.     
1bc90 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
1bca0 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  eStart->wtFlags 
1bcb0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1bcc0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1bcd0 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20  isMinQuery ){.  
1bce0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bcf0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1bd00 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  , 0, regBase+nEq
1bd10 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  );.      nConstr
1bd20 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74  aint++;.      st
1bd30 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20  artEq = 0;.     
1bd40 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
1bd50 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ts = 1;.    }.  
1bd60 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
1bd70 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
1bd80 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
1bd90 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  , zStartAff);.  
1bda0 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b    op = aStartOp[
1bdb0 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1bdc0 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45  ts<<2) + (startE
1bdd0 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20  q<<1) + bRev];. 
1bde0 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30     assert( op!=0
1bdf0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1be00 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20  ( op==OP_Rewind 
1be10 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1be20 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a   op==OP_Last );.
1be30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1be40 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20  ==OP_SeekGt );. 
1be50 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1be60 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20  =OP_SeekGe );.  
1be70 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1be80 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20  OP_SeekLe );.   
1be90 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1bea0 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20  P_SeekLt );.    
1beb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bec0 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
1bed0 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
1bee0 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
1bef0 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  nt);..    /* Loa
1bf00 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  d the value for 
1bf10 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  the inequality c
1bf20 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65  onstraint at the
1bf30 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
1bf40 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79  ** range (if any
1bf50 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43  )..    */.    nC
1bf60 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b  onstraint = nEq;
1bf70 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45  .    if( pRangeE
1bf80 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  nd ){.      Expr
1bf90 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67   *pRight = pRang
1bfa0 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69  eEnd->pExpr->pRi
1bfb0 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
1bfc0 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
1bfd0 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
1bfe0 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20  e+nEq, 1);.     
1bff0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c000 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
1c010 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
1c020 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
1c030 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
1c040 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b  ERM_VNULL)==0 ){
1c050 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c060 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
1c070 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65  mp(v, pRight, re
1c080 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e  gBase+nEq, addrN
1c090 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xt);.      }.   
1c0a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
1c0b0 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52  mpareAffinity(pR
1c0c0 69 67 68 74 2c 20 63 45 6e 64 41 66 66 29 21 3d  ight, cEndAff)!=
1c0d0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a  SQLITE_AFF_NONE.
1c0e0 20 20 20 20 20 20 20 26 26 20 21 73 71 6c 69 74         && !sqlit
1c0f0 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66  e3ExprNeedsNoAff
1c100 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67  inityChange(pRig
1c110 68 74 2c 20 63 45 6e 64 41 66 66 29 0a 20 20 20  ht, cEndAff).   
1c120 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f     ){.        co
1c130 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
1c140 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b  pParse, regBase+
1c150 6e 45 71 2c 20 31 2c 20 26 63 45 6e 64 41 66 66  nEq, 1, &cEndAff
1c160 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c170 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
1c180 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c190 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61  pRangeEnd->wtFla
1c1a0 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
1c1b0 4c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  L );.    }.    s
1c1c0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1c1d0 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 0a 20 20   zStartAff);..  
1c1e0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
1c1f0 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20  loop body */.   
1c200 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71   pLevel->p2 = sq
1c210 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1c220 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  Addr(v);..    /*
1c230 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 6e   Check if the in
1c240 64 65 78 20 63 75 72 73 6f 72 20 69 73 20 70 61  dex cursor is pa
1c250 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
1c260 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20  e range. */.    
1c270 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61  op = aEndOp[(pRa
1c280 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a  ngeEnd || nEq) *
1c290 20 28 31 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20   (1 + bRev)];.  
1c2a0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1c2b0 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20 20 74  OP_Noop );.    t
1c2c0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1c2d0 49 64 78 47 45 20 29 3b 0a 20 20 20 20 74 65 73  IdxGE );.    tes
1c2e0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64  tcase( op==OP_Id
1c2f0 78 4c 54 20 29 3b 0a 20 20 20 20 69 66 28 20 6f  xLT );.    if( o
1c300 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
1c310 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c320 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20  ddOp4Int(v, op, 
1c330 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74  iIdxCur, addrNxt
1c340 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73  , regBase, nCons
1c350 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  traint);.      s
1c360 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1c370 50 35 28 76 2c 20 65 6e 64 45 71 21 3d 62 52 65  P5(v, endEq!=bRe
1c380 76 20 3f 31 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a  v ?1:0);.    }..
1c390 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1c3a0 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  are inequality c
1c3b0 6f 6e 73 74 72 61 69 6e 74 73 2c 20 63 68 65 63  onstraints, chec
1c3c0 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
1c3d0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  .    ** of the t
1c3e0 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74  able column that
1c3f0 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20   the inequality 
1c400 63 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f 74  contrains is not
1c410 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49 66   NULL..    ** If
1c420 20 69 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f 20   it is, jump to 
1c430 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
1c440 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  on of the loop..
1c450 20 20 20 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20      */.    r1 = 
1c460 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
1c470 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 74  g(pParse);.    t
1c480 65 73 74 63 61 73 65 28 20 70 4c 6f 6f 70 2d 3e  estcase( pLoop->
1c490 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1c4a0 42 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20  BTM_LIMIT );.   
1c4b0 20 74 65 73 74 63 61 73 65 28 20 70 4c 6f 6f 70   testcase( pLoop
1c4c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1c4d0 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a 20  E_TOP_LIMIT );. 
1c4e0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
1c4f0 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
1c500 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f  BTM_LIMIT|WHERE_
1c510 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 20 0a  TOP_LIMIT))!=0 .
1c520 20 20 20 20 20 26 26 20 28 6a 20 3d 20 70 49 64       && (j = pId
1c530 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d  x->aiColumn[nEq]
1c540 29 3e 3d 30 20 0a 20 20 20 20 20 26 26 20 70 49  )>=0 .     && pI
1c550 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
1c560 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 0a  [j].notNull==0 .
1c570 20 20 20 20 20 26 26 20 28 6e 45 71 20 7c 7c 20       && (nEq || 
1c580 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1c590 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
1c5a0 54 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  T)==0).    ){.  
1c5b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c5c0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
1c5d0 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45 71  mn, iIdxCur, nEq
1c5e0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
1c5f0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
1c600 22 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d  ", pIdx->pTable-
1c610 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 29  >aCol[j].zName))
1c620 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1c630 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1c640 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64 72  IsNull, r1, addr
1c650 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Cont);.    }.   
1c660 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1c670 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1c680 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  1);..    /* Seek
1c690 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   the table curso
1c6a0 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  r, if required *
1c6b0 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72  /.    disableTer
1c6c0 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65  m(pLevel, pRange
1c6d0 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61  Start);.    disa
1c6e0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1c6f0 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20  pRangeEnd);.    
1c700 69 66 28 20 6f 6d 69 74 54 61 62 6c 65 20 29 7b  if( omitTable ){
1c710 0a 20 20 20 20 20 20 2f 2a 20 70 49 64 78 20 69  .      /* pIdx i
1c720 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
1c730 65 78 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  ex.  No need to 
1c740 61 63 63 65 73 73 20 74 68 65 20 6d 61 69 6e 20  access the main 
1c750 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 7d 65  table. */.    }e
1c760 6c 73 65 20 69 66 28 20 48 61 73 52 6f 77 69 64  lse if( HasRowid
1c770 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 20 29  (pIdx->pTable) )
1c780 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
1c790 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20  g = iReleaseReg 
1c7a0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1c7b0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
1c7c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c7d0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f  dOp2(v, OP_IdxRo
1c7e0 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52  wid, iIdxCur, iR
1c7f0 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1c800 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1c810 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
1c820 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
1c830 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1c840 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1c850 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52  P_Seek, iCur, iR
1c860 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65  owidReg);  /* De
1c870 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20  ferred seek */. 
1c880 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c890 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c  Index *pPk = sql
1c8a0 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
1c8b0 64 65 78 28 70 49 64 78 2d 3e 70 54 61 62 6c 65  dex(pIdx->pTable
1c8c0 29 3b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52  );.      iRowidR
1c8d0 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
1c8e0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1c8f0 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a   pPk->nKeyCol);.
1c900 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
1c910 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  <pPk->nKeyCol; j
1c920 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d  ++){.        k =
1c930 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
1c940 49 6e 64 65 78 28 70 49 64 78 2c 20 70 50 6b 2d  Index(pIdx, pPk-
1c950 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20  >aiColumn[j]);. 
1c960 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1c970 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1c980 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20  olumn, iIdxCur, 
1c990 6b 2c 20 69 52 6f 77 69 64 52 65 67 2b 6a 29 3b  k, iRowidReg+j);
1c9a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1c9b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1c9c0 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
1c9d0 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72 43 6f  nd, iCur, addrCo
1c9e0 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  nt,.            
1c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1ca00 52 6f 77 69 64 52 65 67 2c 20 70 50 6b 2d 3e 6e  RowidReg, pPk->n
1ca10 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 0a  KeyCol);.    }..
1ca20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68      /* Record th
1ca30 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73  e instruction us
1ca40 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  ed to terminate 
1ca50 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c  the loop. Disabl
1ca60 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20  e .    ** WHERE 
1ca70 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64  clause terms mad
1ca80 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74  e redundant by t
1ca90 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73  he index range s
1caa0 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  can..    */.    
1cab0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1cac0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
1cad0 57 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  W ){.      pLeve
1cae0 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  l->op = OP_Noop;
1caf0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62  .    }else if( b
1cb00 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  Rev ){.      pLe
1cb10 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65  vel->op = OP_Pre
1cb20 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  v;.    }else{.  
1cb30 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1cb40 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 7d 0a   OP_Next;.    }.
1cb50 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
1cb60 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 69 66   iIdxCur;.    if
1cb70 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1cb80 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52  s & WHERE_CONSTR
1cb90 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20  AINT)==0 ){.    
1cba0 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53    pLevel->p5 = S
1cbb0 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
1cbc0 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a  _FULLSCAN_STEP;.
1cbd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cbe0 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
1cbf0 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  >p5==0 );.    }.
1cc00 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66    }else..#ifndef
1cc10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
1cc20 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69  OPTIMIZATION.  i
1cc30 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1cc40 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s & WHERE_MULTI_
1cc50 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  OR ){.    /* Cas
1cc60 65 20 35 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72  e 5:  Two or mor
1cc70 65 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e 64  e separately ind
1cc80 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65  exed terms conne
1cc90 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20 20 2a  cted by OR.    *
1cca0 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65  *.    ** Example
1ccb0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1ccc0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1ccd0 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20  1(a,b,c,d);.    
1cce0 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
1ccf0 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20  X i1 ON t1(a);. 
1cd00 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49     **   CREATE I
1cd10 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62 29  NDEX i2 ON t1(b)
1cd20 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
1cd30 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31  E INDEX i3 ON t1
1cd40 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  (c);.    **.    
1cd50 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
1cd60 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20  OM t1 WHERE a=5 
1cd70 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31 31 20  OR b=7 OR (c=11 
1cd80 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a  AND d=13).    **
1cd90 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65 20 65  .    ** In the e
1cda0 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20 61 72  xample, there ar
1cdb0 65 20 74 68 72 65 65 20 69 6e 64 65 78 65 64 20  e three indexed 
1cdc0 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20  terms connected 
1cdd0 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68  by OR..    ** Th
1cde0 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  e top of the loo
1cdf0 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69  p looks like thi
1ce00 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
1ce10 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20            Null  
1ce20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
1ce30 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65        # Zero the
1ce40 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31   rowset in reg 1
1ce50 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1ce60 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 69 6e  hen, for each in
1ce70 64 65 78 65 64 20 74 65 72 6d 2c 20 74 68 65 20  dexed term, the 
1ce80 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61  following. The a
1ce90 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20  rguments to.    
1cea0 2a 2a 20 52 6f 77 53 65 74 54 65 73 74 20 61 72  ** RowSetTest ar
1ceb0 65 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  e such that the 
1cec0 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63 75 72  rowid of the cur
1ced0 72 65 6e 74 20 72 6f 77 20 69 73 20 69 6e 73 65  rent row is inse
1cee0 72 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  rted.    ** into
1cef0 20 74 68 65 20 52 6f 77 53 65 74 2e 20 49 66 20   the RowSet. If 
1cf00 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 70 72  it is already pr
1cf10 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73  esent, control s
1cf20 6b 69 70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  kips the.    ** 
1cf30 47 6f 73 75 62 20 6f 70 63 6f 64 65 20 61 6e 64  Gosub opcode and
1cf40 20 6a 75 6d 70 73 20 73 74 72 61 69 67 68 74 20   jumps straight 
1cf50 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  to the code gene
1cf60 72 61 74 65 64 20 62 79 20 57 68 65 72 65 45 6e  rated by WhereEn
1cf70 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  d()..    **.    
1cf80 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  **        sqlite
1cf90 33 57 68 65 72 65 42 65 67 69 6e 28 3c 74 65 72  3WhereBegin(<ter
1cfa0 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  m>).    **      
1cfb0 20 20 20 20 52 6f 77 53 65 74 54 65 73 74 20 20      RowSetTest  
1cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfd0 23 20 49 6e 73 65 72 74 20 72 6f 77 69 64 20 69  # Insert rowid i
1cfe0 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20 20 20 2a  nto rowset.    *
1cff0 2a 20 20 20 20 20 20 20 20 20 20 47 6f 73 75 62  *          Gosub
1d000 20 20 20 20 20 20 32 20 41 0a 20 20 20 20 2a 2a        2 A.    **
1d010 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
1d020 68 65 72 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a  hereEnd().    **
1d030 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e  .    ** Followin
1d040 67 20 74 68 65 20 61 62 6f 76 65 2c 20 63 6f 64  g the above, cod
1d050 65 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  e to terminate t
1d060 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41  he loop. Label A
1d070 2c 20 74 68 65 20 74 61 72 67 65 74 0a 20 20 20  , the target.   
1d080 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73 75 62   ** of the Gosub
1d090 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f   above, jumps to
1d0a0 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
1d0b0 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
1d0c0 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20   Goto..    **.  
1d0d0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75    **          Nu
1d0e0 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20  ll       1      
1d0f0 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f            # Zero
1d100 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72   the rowset in r
1d110 65 67 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20  eg 1.    **     
1d120 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20       Goto       
1d130 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  B               
1d140 20 23 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 66   # The loop is f
1d150 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a  inished..    **.
1d160 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 3a 20      **       A: 
1d170 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20 20  <loop body>     
1d180 20 20 20 20 20 20 20 20 20 20 20 20 23 20 52 65              # Re
1d190 74 75 72 6e 20 64 61 74 61 2c 20 77 68 61 74 65  turn data, whate
1d1a0 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ver..    **.    
1d1b0 2a 2a 20 20 20 20 20 20 20 20 20 20 52 65 74 75  **          Retu
1d1c0 72 6e 20 20 20 20 20 32 20 20 20 20 20 20 20 20  rn     2        
1d1d0 20 20 20 20 20 20 20 20 23 20 4a 75 6d 70 20 62          # Jump b
1d1e0 61 63 6b 20 74 6f 20 74 68 65 20 47 6f 73 75 62  ack to the Gosub
1d1f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1d200 20 20 20 20 20 42 3a 20 3c 61 66 74 65 72 20 74       B: <after t
1d210 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a  he loop>.    **.
1d220 20 20 20 20 2a 2f 0a 20 20 20 20 57 68 65 72 65      */.    Where
1d230 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20  Clause *pOrWc;  
1d240 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75    /* The OR-clau
1d250 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e  se broken out in
1d260 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20  to subterms */. 
1d270 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4f 72 54     SrcList *pOrT
1d280 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 6f  ab;       /* Sho
1d290 72 74 65 6e 65 64 20 74 61 62 6c 65 20 6c 69 73  rtened table lis
1d2a0 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73 65 20 67  t or OR-clause g
1d2b0 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  eneration */.   
1d2c0 20 49 6e 64 65 78 20 2a 70 43 6f 76 20 3d 20 30   Index *pCov = 0
1d2d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1d2e0 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f 76 65 72   Potential cover
1d2f0 69 6e 67 20 69 6e 64 65 78 20 28 6f 72 20 4e 55  ing index (or NU
1d300 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  LL) */.    int i
1d310 43 6f 76 43 75 72 20 3d 20 70 50 61 72 73 65 2d  CovCur = pParse-
1d320 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20 43 75 72  >nTab++;  /* Cur
1d330 73 6f 72 20 75 73 65 64 20 66 6f 72 20 69 6e 64  sor used for ind
1d340 65 78 20 73 63 61 6e 73 20 28 69 66 20 61 6e 79  ex scans (if any
1d350 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65  ) */..    int re
1d360 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
1d370 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20  se->nMem;       
1d380 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
1d390 75 73 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73  used with OP_Gos
1d3a0 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ub */.    int re
1d3b0 67 52 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20  gRowset = 0;    
1d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3d0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
1d3e0 66 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63  for RowSet objec
1d3f0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  t */.    int reg
1d400 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20  Rowid = 0;      
1d410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d420 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
1d430 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a  olding rowid */.
1d440 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64      int iLoopBod
1d450 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  y = sqlite3VdbeM
1d460 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a  akeLabel(v);  /*
1d470 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62   Start of loop b
1d480 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ody */.    int i
1d490 52 65 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20  RetInit;        
1d4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4b0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1d4c0 6f 66 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69  of regReturn ini
1d4d0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74  t */.    int unt
1d4e0 65 73 74 65 64 54 65 72 6d 73 20 3d 20 30 3b 20  estedTerms = 0; 
1d4f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1d500 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f  ome terms not co
1d510 6d 70 6c 65 74 65 6c 79 20 74 65 73 74 65 64 20  mpletely tested 
1d520 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20  */.    int ii;  
1d530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1d550 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
1d560 20 45 78 70 72 20 2a 70 41 6e 64 45 78 70 72 20   Expr *pAndExpr 
1d570 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1d580 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e      /* An ".. AN
1d590 44 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73  D (...)" express
1d5a0 69 6f 6e 20 2a 2f 0a 20 20 20 0a 20 20 20 20 70  ion */.   .    p
1d5b0 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  Term = pLoop->aL
1d5c0 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73  Term[0];.    ass
1d5d0 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
1d5e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
1d5f0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1d600 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73 73  WO_OR );.    ass
1d610 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ert( (pTerm->wtF
1d620 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e  lags & TERM_ORIN
1d630 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f  FO)!=0 );.    pO
1d640 72 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e  rWc = &pTerm->u.
1d650 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  pOrInfo->wc;.   
1d660 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1d670 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65  _Return;.    pLe
1d680 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65 74  vel->p1 = regRet
1d690 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  urn;..    /* Set
1d6a0 20 75 70 20 61 20 6e 65 77 20 53 72 63 4c 69 73   up a new SrcLis
1d6b0 74 20 69 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74  t in pOrTab cont
1d6c0 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
1d6d0 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20   being scanned. 
1d6e0 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f     ** by this lo
1d6f0 6f 70 20 69 6e 20 74 68 65 20 61 5b 30 5d 20 73  op in the a[0] s
1d700 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52  lot and all notR
1d710 65 61 64 79 20 74 61 62 6c 65 73 20 69 6e 20 61  eady tables in a
1d720 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20  [1..] slots..   
1d730 20 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d 65 73   ** This becomes
1d740 20 74 68 65 20 53 72 63 4c 69 73 74 20 69 6e 20   the SrcList in 
1d750 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61  the recursive ca
1d760 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ll to sqlite3Whe
1d770 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a  reBegin()..    *
1d780 2f 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  /.    if( pWInfo
1d790 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20  ->nLevel>1 ){.  
1d7a0 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64      int nNotRead
1d7b0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1d7c0 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
1d7d0 20 6f 66 20 6e 6f 74 52 65 61 64 79 20 74 61 62   of notReady tab
1d7e0 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  les */.      str
1d7f0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1d800 20 2a 6f 72 69 67 53 72 63 3b 20 20 20 20 20 2f   *origSrc;     /
1d810 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20  * Original list 
1d820 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  of tables */.   
1d830 20 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70     nNotReady = p
1d840 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20  WInfo->nLevel - 
1d850 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20  iLevel - 1;.    
1d860 20 20 70 4f 72 54 61 62 20 3d 20 73 71 6c 69 74    pOrTab = sqlit
1d870 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28  e3StackAllocRaw(
1d880 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
1d890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8a0 73 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b  sizeof(*pOrTab)+
1d8b0 20 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f   nNotReady*sizeo
1d8c0 66 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29  f(pOrTab->a[0]))
1d8d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
1d8e0 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e  ab==0 ) return n
1d8f0 6f 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70  otReady;.      p
1d900 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  OrTab->nAlloc = 
1d910 28 75 38 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b  (u8)(nNotReady +
1d920 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61   1);.      pOrTa
1d930 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62  b->nSrc = pOrTab
1d940 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  ->nAlloc;.      
1d950 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61  memcpy(pOrTab->a
1d960 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65  , pTabItem, size
1d970 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a  of(*pTabItem));.
1d980 20 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20        origSrc = 
1d990 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1d9a0 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  ->a;.      for(k
1d9b0 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79  =1; k<=nNotReady
1d9c0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
1d9d0 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e  memcpy(&pOrTab->
1d9e0 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70  a[k], &origSrc[p
1d9f0 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c  Level[k].iFrom],
1da00 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e   sizeof(pOrTab->
1da10 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a  a[k]));.      }.
1da20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1da30 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f   pOrTab = pWInfo
1da40 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  ->pTabList;.    
1da50 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  }..    /* Initia
1da60 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20  lize the rowset 
1da70 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74  register to cont
1da80 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c  ain NULL. An SQL
1da90 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a   NULL is .    **
1daa0 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61   equivalent to a
1dab0 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a  n empty rowset..
1dac0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
1dad0 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65  so initialize re
1dae0 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61  gReturn to conta
1daf0 69 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  in the address o
1db00 66 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  f the instructio
1db10 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69  n .    ** immedi
1db20 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
1db30 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74  the OP_Return at
1db40 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   the bottom of t
1db50 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20  he loop. This.  
1db60 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
1db70 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72   in a few obscur
1db80 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65  e LEFT JOIN case
1db90 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20  s where control 
1dba0 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65  jumps.    ** ove
1dbb0 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  r the top of the
1dbc0 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62   loop into the b
1dbd0 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68  ody of it. In th
1dbe0 69 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20  is case the .   
1dbf0 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70   ** correct resp
1dc00 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64  onse for the end
1dc10 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74  -of-loop code (t
1dc20 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73  he OP_Return) is
1dc30 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c   to .    ** fall
1dc40 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
1dc50 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
1dc60 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f  , just as an OP_
1dc70 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20  Next does if.   
1dc80 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   ** called on an
1dc90 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63   uninitialized c
1dca0 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ursor..    */.  
1dcb0 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
1dcc0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1dcd0 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
1dce0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 67  ==0 ){.      reg
1dcf0 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Rowset = ++pPars
1dd00 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
1dd10 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72  egRowid = ++pPar
1dd20 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1dd30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1dd40 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1dd50 20 72 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20   regRowset);.   
1dd60 20 7d 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20   }.    iRetInit 
1dd70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1dd80 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1dd90 72 2c 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29  r, 0, regReturn)
1dda0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
1ddb0 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
1ddc0 63 6c 61 75 73 65 20 69 73 20 7a 20 6f 66 20 74  clause is z of t
1ddd0 68 65 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52  he form:  (x1 OR
1dde0 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20   x2 OR ...) AND 
1ddf0 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f  y.    ** Then fo
1de00 72 20 65 76 65 72 79 20 74 65 72 6d 20 78 4e 2c  r every term xN,
1de10 20 65 76 61 6c 75 61 74 65 20 61 73 20 74 68 65   evaluate as the
1de20 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 3a 20   subexpression: 
1de30 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20  xN AND z.    ** 
1de40 54 68 61 74 20 77 61 79 2c 20 74 65 72 6d 73 20  That way, terms 
1de50 69 6e 20 79 20 74 68 61 74 20 61 72 65 20 66 61  in y that are fa
1de60 63 74 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20  ctored into the 
1de70 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  disjunction will
1de80 0a 20 20 20 20 2a 2a 20 62 65 20 70 69 63 6b 65  .    ** be picke
1de90 64 20 75 70 20 62 79 20 74 68 65 20 72 65 63 75  d up by the recu
1dea0 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 73  rsive calls to s
1deb0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1dec0 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a  () below..    **
1ded0 0a 20 20 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  .    ** Actually
1dee0 2c 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73  , each subexpres
1def0 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65 72 74 65  sion is converte
1df00 64 20 74 6f 20 22 78 4e 20 41 4e 44 20 77 22 20  d to "xN AND w" 
1df10 77 68 65 72 65 20 77 20 69 73 0a 20 20 20 20 2a  where w is.    *
1df20 2a 20 74 68 65 20 22 69 6e 74 65 72 65 73 74 69  * the "interesti
1df30 6e 67 22 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d  ng" terms of z -
1df40 20 74 65 72 6d 73 20 74 68 61 74 20 64 69 64 20   terms that did 
1df50 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e  not originate in
1df60 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f   the.    ** ON o
1df70 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
1df80 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61  f a LEFT JOIN, a
1df90 6e 64 20 74 65 72 6d 73 20 74 68 61 74 20 61 72  nd terms that ar
1dfa0 65 20 75 73 61 62 6c 65 20 61 73 20 0a 20 20 20  e usable as .   
1dfb0 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a 20 20 20   ** indices..   
1dfc0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
1dfd0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 73  optimization als
1dfe0 6f 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 69  o only applies i
1dff0 66 20 74 68 65 20 28 78 31 20 4f 52 20 78 32 20  f the (x1 OR x2 
1e000 4f 52 20 2e 2e 2e 29 20 74 65 72 6d 0a 20 20 20  OR ...) term.   
1e010 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61   ** is not conta
1e020 69 6e 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 63  ined in the ON c
1e030 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20  lause of a LEFT 
1e040 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20 53 65 65  JOIN..    ** See
1e050 20 74 69 63 6b 65 74 20 68 74 74 70 3a 2f 2f 77   ticket http://w
1e060 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72  ww.sqlite.org/sr
1e070 63 2f 69 6e 66 6f 2f 66 32 33 36 39 33 30 34 65  c/info/f2369304e
1e080 34 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  4.    */.    if(
1e090 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b   pWC->nTerm>1 ){
1e0a0 0a 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d  .      int iTerm
1e0b0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 54 65 72  ;.      for(iTer
1e0c0 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e  m=0; iTerm<pWC->
1e0d0 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b  nTerm; iTerm++){
1e0e0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
1e0f0 45 78 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54  Expr = pWC->a[iT
1e100 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  erm].pExpr;.    
1e110 20 20 20 20 69 66 28 20 26 70 57 43 2d 3e 61 5b      if( &pWC->a[
1e120 69 54 65 72 6d 5d 20 3d 3d 20 70 54 65 72 6d 20  iTerm] == pTerm 
1e130 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1e140 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1e150 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1e160 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f  P_FromJoin) ) co
1e170 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1e180 74 65 73 74 63 61 73 65 28 20 70 57 43 2d 3e 61  testcase( pWC->a
1e190 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20  [iTerm].wtFlags 
1e1a0 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 3b  & TERM_ORINFO );
1e1b0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1e1c0 65 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  e( pWC->a[iTerm]
1e1d0 2e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  .wtFlags & TERM_
1e1e0 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
1e1f0 20 20 20 69 66 28 20 70 57 43 2d 3e 61 5b 69 54     if( pWC->a[iT
1e200 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 28  erm].wtFlags & (
1e210 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d  TERM_ORINFO|TERM
1e220 5f 56 49 52 54 55 41 4c 29 20 29 20 63 6f 6e 74  _VIRTUAL) ) cont
1e230 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
1e240 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  ( (pWC->a[iTerm]
1e250 2e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  .eOperator & WO_
1e260 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ALL)==0 ) contin
1e270 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  ue;.        pExp
1e280 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
1e290 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29  up(db, pExpr, 0)
1e2a0 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78  ;.        pAndEx
1e2b0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
1e2c0 41 6e 64 28 64 62 2c 20 70 41 6e 64 45 78 70 72  And(db, pAndExpr
1e2d0 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
1e2e0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64  }.      if( pAnd
1e2f0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
1e300 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74  pAndExpr = sqlit
1e310 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
1e320 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45  TK_AND, 0, pAndE
1e330 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  xpr, 0);.      }
1e340 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
1e350 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e  ii=0; ii<pOrWc->
1e360 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
1e370 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1e380 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d  OrTerm = &pOrWc-
1e390 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66  >a[ii];.      if
1e3a0 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
1e3b0 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 28  ursor==iCur || (
1e3c0 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
1e3d0 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20  or & WO_AND)!=0 
1e3e0 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
1e3f0 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b  Info *pSubWInfo;
1e400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
1e410 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d  o for single OR-
1e420 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20  term scan */.   
1e430 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72 45 78       Expr *pOrEx
1e440 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45  pr = pOrTerm->pE
1e450 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
1e460 20 70 41 6e 64 45 78 70 72 20 26 26 20 21 45 78   pAndExpr && !Ex
1e470 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f  prHasProperty(pO
1e480 72 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rExpr, EP_FromJo
1e490 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  in) ){.         
1e4a0 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74   pAndExpr->pLeft
1e4b0 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20 20 20   = pOrExpr;.    
1e4c0 20 20 20 20 20 20 70 4f 72 45 78 70 72 20 3d 20        pOrExpr = 
1e4d0 70 41 6e 64 45 78 70 72 3b 0a 20 20 20 20 20 20  pAndExpr;.      
1e4e0 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c    }.        /* L
1e4f0 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c  oop through tabl
1e500 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d  e entries that m
1e510 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72  atch term pOrTer
1e520 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 53  m. */.        pS
1e530 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  ubWInfo = sqlite
1e540 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
1e550 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72 45  se, pOrTab, pOrE
1e560 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  xpr, 0, 0,.     
1e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e580 20 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50     WHERE_OMIT_OP
1e590 45 4e 5f 43 4c 4f 53 45 20 7c 20 57 48 45 52 45  EN_CLOSE | WHERE
1e5a0 5f 41 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20  _AND_ONLY |.    
1e5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5c0 20 20 20 20 57 48 45 52 45 5f 46 4f 52 43 45 5f      WHERE_FORCE_
1e5d0 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e  TABLE | WHERE_ON
1e5e0 45 54 41 42 4c 45 5f 4f 4e 4c 59 2c 20 69 43 6f  ETABLE_ONLY, iCo
1e5f0 76 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 61  vCur);.        a
1e600 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f  ssert( pSubWInfo
1e610 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1e620 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1e630 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
1e640 69 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b  if( pSubWInfo ){
1e650 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  .          Where
1e660 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f 70 3b 0a  Loop *pSubLoop;.
1e670 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69            explai
1e680 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20  nOneScan(.      
1e690 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
1e6a0 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57 49 6e  pOrTab, &pSubWIn
1e6b0 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65 6c  fo->a[0], iLevel
1e6c0 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c  , pLevel->iFrom,
1e6d0 20 30 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a   0.          );.
1e6e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
1e6f0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
1e700 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43  s & WHERE_DUPLIC
1e710 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  ATES_OK)==0 ){. 
1e720 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
1e730 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57  Set = ((ii==pOrW
1e740 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69  c->nTerm-1)?-1:i
1e750 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
1e760 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20 20  int r;.         
1e770 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 45 78     r = sqlite3Ex
1e780 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
1e790 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d  pParse, pTabItem
1e7a0 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43 75 72  ->pTab, -1, iCur
1e7b0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1e7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7d0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52              regR
1e7e0 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  owid, 0);.      
1e7f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e800 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
1e810 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67  _RowSetTest, reg
1e820 52 6f 77 73 65 74 2c 0a 20 20 20 20 20 20 20 20  Rowset,.        
1e830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e840 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e850 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1e860 76 29 2b 32 2c 20 72 2c 20 69 53 65 74 29 3b 0a  v)+2, r, iSet);.
1e870 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e880 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e890 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1e8a0 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e 2c 20  sub, regReturn, 
1e8b0 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20  iLoopBody);..   
1e8c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53         /* The pS
1e8d0 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65  ubWInfo->unteste
1e8e0 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e  dTerms flag mean
1e8f0 73 20 74 68 61 74 20 74 68 69 73 20 4f 52 20 74  s that this OR t
1e900 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  erm.          **
1e910 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f   contained one o
1e920 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d 20  r more AND term 
1e930 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79 20  from a notReady 
1e940 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20 20 20  table.  The.    
1e950 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 20 66        ** terms f
1e960 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61 64 79  rom the notReady
1e970 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74   table could not
1e980 20 62 65 20 74 65 73 74 65 64 20 61 6e 64 20 77   be tested and w
1e990 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ill.          **
1e9a0 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65 73 74   need to be test
1e9b0 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20  ed later..      
1e9c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1e9d0 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e   if( pSubWInfo->
1e9e0 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20  untestedTerms ) 
1e9f0 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20  untestedTerms = 
1ea00 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  1;..          /*
1ea10 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 4f   If all of the O
1ea20 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d  R-connected term
1ea30 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65 64 20  s are optimized 
1ea40 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20  using the same. 
1ea50 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65           ** inde
1ea60 78 2c 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  x, and the index
1ea70 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67   is opened using
1ea80 20 74 68 65 20 73 61 6d 65 20 63 75 72 73 6f 72   the same cursor
1ea90 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20   number.        
1eaa0 20 20 2a 2a 20 62 79 20 65 61 63 68 20 63 61 6c    ** by each cal
1eab0 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  l to sqlite3Wher
1eac0 65 42 65 67 69 6e 28 29 20 6d 61 64 65 20 62 79  eBegin() made by
1ead0 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74 20 6d   this loop, it m
1eae0 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ay.          ** 
1eaf0 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  be possible to u
1eb00 73 65 20 74 68 61 74 20 69 6e 64 65 78 20 61 73  se that index as
1eb10 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
1eb20 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  x..          **.
1eb30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
1eb40 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
1eb50 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
1eb60 61 62 6f 76 65 20 72 65 73 75 6c 74 65 64 20 69  above resulted i
1eb70 6e 20 61 20 73 63 61 6e 20 74 68 61 74 0a 20 20  n a scan that.  
1eb80 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 73 20          ** uses 
1eb90 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68  an index, and th
1eba0 69 73 20 69 73 20 65 69 74 68 65 72 20 74 68 65  is is either the
1ebb0 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e 65 63   first OR-connec
1ebc0 74 65 64 20 74 65 72 6d 0a 20 20 20 20 20 20 20  ted term.       
1ebd0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
1ebe0 6f 72 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  or the index is 
1ebf0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 61 74  the same as that
1ec00 20 75 73 65 64 20 62 79 20 61 6c 6c 20 70 72 65   used by all pre
1ec10 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20  vious.          
1ec20 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74 20 70 43  ** terms, set pC
1ec30 6f 76 20 74 6f 20 74 68 65 20 63 61 6e 64 69 64  ov to the candid
1ec40 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ate covering ind
1ec50 65 78 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73  ex. Otherwise, s
1ec60 65 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  et .          **
1ec70 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20 74 6f   pCov to NULL to
1ec80 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 6e   indicate that n
1ec90 6f 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65  o candidate cove
1eca0 72 69 6e 67 20 69 6e 64 65 78 20 77 69 6c 6c 20  ring index will 
1ecb0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65  .          ** be
1ecc0 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20 20 20   available..    
1ecd0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1ece0 20 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20 70 53     pSubLoop = pS
1ecf0 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57  ubWInfo->a[0].pW
1ed00 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  Loop;.          
1ed10 61 73 73 65 72 74 28 20 28 70 53 75 62 4c 6f 6f  assert( (pSubLoo
1ed20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1ed30 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d  RE_AUTO_INDEX)==
1ed40 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  0 );.          i
1ed50 66 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73  f( (pSubLoop->ws
1ed60 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
1ed70 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20  DEXED)!=0.      
1ed80 20 20 20 20 20 26 26 20 28 69 69 3d 3d 30 20 7c       && (ii==0 |
1ed90 7c 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74  | pSubLoop->u.bt
1eda0 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70 43 6f 76  ree.pIndex==pCov
1edb0 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
1edc0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1edd0 74 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b  t( pSubWInfo->a[
1ede0 30 5d 2e 69 49 64 78 43 75 72 3d 3d 69 43 6f 76  0].iIdxCur==iCov
1edf0 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Cur );.         
1ee00 20 20 20 70 43 6f 76 20 3d 20 70 53 75 62 4c 6f     pCov = pSubLo
1ee10 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
1ee20 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ex;.          }e
1ee30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1ee40 20 70 43 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20   pCov = 0;.     
1ee50 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1ee60 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68 65 20    /* Finish the 
1ee70 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62  loop through tab
1ee80 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  le entries that 
1ee90 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65  match term pOrTe
1eea0 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  rm. */.         
1eeb0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1eec0 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20  (pSubWInfo);.   
1eed0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1eee0 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
1eef0 3e 75 2e 70 43 6f 76 69 64 78 20 3d 20 70 43 6f  >u.pCovidx = pCo
1ef00 76 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 76 20  v;.    if( pCov 
1ef10 29 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ) pLevel->iIdxCu
1ef20 72 20 3d 20 69 43 6f 76 43 75 72 3b 0a 20 20 20  r = iCovCur;.   
1ef30 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b   if( pAndExpr ){
1ef40 0a 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d  .      pAndExpr-
1ef50 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20  >pLeft = 0;.    
1ef60 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1ef70 65 74 65 28 64 62 2c 20 70 41 6e 64 45 78 70 72  ete(db, pAndExpr
1ef80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1ef90 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
1efa0 28 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71  (v, iRetInit, sq
1efb0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1efc0 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71  Addr(v));.    sq
1efd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1efe0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
1eff0 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
1f000 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1f010 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1f020 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20  iLoopBody);..   
1f030 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   if( pWInfo->nLe
1f040 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53  vel>1 ) sqlite3S
1f050 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70 4f 72  tackFree(db, pOr
1f060 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20 21 75  Tab);.    if( !u
1f070 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 64  ntestedTerms ) d
1f080 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1f090 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c  l, pTerm);.  }el
1f0a0 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
1f0b0 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
1f0c0 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b  MIZATION */..  {
1f0d0 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 36 3a 20  .    /* Case 6: 
1f0e0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61   There is no usa
1f0f0 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d  ble index.  We m
1f100 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74  ust do a complet
1f110 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
1f120 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e    scan of the en
1f130 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20  tire table..    
1f140 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  */.    static co
1f150 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d 20 3d  nst u8 aStep[] =
1f160 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50   { OP_Next, OP_P
1f170 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61 74 69  rev };.    stati
1f180 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72  c const u8 aStar
1f190 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e  t[] = { OP_Rewin
1f1a0 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20  d, OP_Last };.  
1f1b0 20 20 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d    assert( bRev==
1f1c0 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a  0 || bRev==1 );.
1f1d0 20 20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d      if( pTabItem
1f1e0 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20 29 7b  ->isRecursive ){
1f1f0 0a 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73  .      /* Tables
1f200 20 6d 61 72 6b 65 64 20 69 73 52 65 63 75 72 73   marked isRecurs
1f210 69 76 65 20 68 61 76 65 20 6f 6e 6c 79 20 61 20  ive have only a 
1f220 73 69 6e 67 6c 65 20 72 6f 77 20 74 68 61 74 20  single row that 
1f230 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 20 20 20  is stored in.   
1f240 20 20 20 2a 2a 20 61 20 70 73 65 75 64 6f 2d 63     ** a pseudo-c
1f250 75 72 73 6f 72 2e 20 20 4e 6f 20 6e 65 65 64 20  ursor.  No need 
1f260 74 6f 20 52 65 77 69 6e 64 20 6f 72 20 4e 65 78  to Rewind or Nex
1f270 74 20 73 75 63 68 20 63 75 72 73 6f 72 73 2e 20  t such cursors. 
1f280 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  */.      pLevel-
1f290 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  >op = OP_Noop;. 
1f2a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f2b0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74  pLevel->op = aSt
1f2c0 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20 20 20  ep[bRev];.      
1f2d0 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
1f2e0 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  r;.      pLevel-
1f2f0 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  >p2 = 1 + sqlite
1f300 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 61  3VdbeAddOp2(v, a
1f310 53 74 61 72 74 5b 62 52 65 76 5d 2c 20 69 43 75  Start[bRev], iCu
1f320 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  r, addrBrk);.   
1f330 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20     pLevel->p5 = 
1f340 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
1f350 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b  S_FULLSCAN_STEP;
1f360 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1f370 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20   Insert code to 
1f380 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65 78  test every subex
1f390 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61  pression that ca
1f3a0 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a  n be completely.
1f3b0 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73    ** computed us
1f3c0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
1f3d0 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20  set of tables.. 
1f3e0 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   */.  for(pTerm=
1f3f0 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e  pWC->a, j=pWC->n
1f400 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
1f410 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
1f420 70 72 20 2a 70 45 3b 0a 20 20 20 20 74 65 73 74  pr *pE;.    test
1f430 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
1f440 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
1f450 55 41 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  UAL );.    testc
1f460 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
1f470 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
1f480 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72   );.    if( pTer
1f490 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
1f4a0 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
1f4b0 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
1f4c0 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  e;.    if( (pTer
1f4d0 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70  m->prereqAll & p
1f4e0 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29  Level->notReady)
1f4f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73  !=0 ){.      tes
1f500 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 75  tcase( pWInfo->u
1f510 6e 74 65 73 74 65 64 54 65 72 6d 73 3d 3d 30 0a  ntestedTerms==0.
1f520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1f530 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
1f540 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
1f550 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20  ETABLE_ONLY)!=0 
1f560 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  );.      pWInfo-
1f570 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d  >untestedTerms =
1f580 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   1;.      contin
1f590 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45  ue;.    }.    pE
1f5a0 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
1f5b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21  .    assert( pE!
1f5c0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  =0 );.    if( pL
1f5d0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
1f5e0 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
1f5f0 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a  rty(pE, EP_FromJ
1f600 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  oin) ){.      co
1f610 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
1f620 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1f630 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c  alse(pParse, pE,
1f640 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
1f650 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1f660 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
1f670 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
1f680 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  .  }..  /* Inser
1f690 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 66  t code to test f
1f6a0 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e 73 74  or implied const
1f6b0 72 61 69 6e 74 73 20 62 61 73 65 64 20 6f 6e 20  raints based on 
1f6c0 74 72 61 6e 73 69 74 69 76 69 74 79 0a 20 20 2a  transitivity.  *
1f6d0 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22 20 6f 70  * of the "==" op
1f6e0 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  erator..  **.  *
1f6f0 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68  * Example: If th
1f700 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
1f710 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d 74 32  ontains "t1.a=t2
1f720 2e 62 22 20 61 6e 64 20 22 74 32 2e 62 3d 31 32  .b" and "t2.b=12
1f730 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20 61  3".  ** and we a
1f740 72 65 20 63 6f 64 69 6e 67 20 74 68 65 20 74 31  re coding the t1
1f750 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20 74 32   loop and the t2
1f760 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20 79 65   loop has not ye
1f770 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20 74 68  t coded,.  ** th
1f780 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65  en we cannot use
1f790 20 74 68 65 20 22 74 31 2e 61 3d 74 32 2e 62 22   the "t1.a=t2.b"
1f7a0 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62 75 74   constraint, but
1f7b0 20 77 65 20 63 61 6e 20 63 6f 64 65 0a 20 20 2a   we can code.  *
1f7c0 2a 20 74 68 65 20 69 6d 70 6c 69 65 64 20 22 74  * the implied "t
1f7d0 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74 72 61  1.a=123" constra
1f7e0 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  int..  */.  for(
1f7f0 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d  pTerm=pWC->a, j=
1f800 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b  pWC->nTerm; j>0;
1f810 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j--, pTerm++){.
1f820 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70      Expr *pE, *p
1f830 45 41 6c 74 3b 0a 20 20 20 20 57 68 65 72 65 54  EAlt;.    WhereT
1f840 65 72 6d 20 2a 70 41 6c 74 3b 0a 20 20 20 20 69  erm *pAlt;.    i
1f850 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
1f860 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
1f870 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
1f880 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
1f890 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
1f8a0 6f 72 21 3d 28 57 4f 5f 45 51 55 49 56 7c 57 4f  or!=(WO_EQUIV|WO
1f8b0 5f 45 51 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  _EQ) ) continue;
1f8c0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
1f8d0 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72  leftCursor!=iCur
1f8e0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1f8f0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
1f900 66 74 4a 6f 69 6e 20 29 20 63 6f 6e 74 69 6e 75  ftJoin ) continu
1f910 65 3b 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72  e;.    pE = pTer
1f920 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  m->pExpr;.    as
1f930 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1f940 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72  operty(pE, EP_Fr
1f950 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20 20 20 61  omJoin) );.    a
1f960 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 70  ssert( (pTerm->p
1f970 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4c 65  rereqRight & pLe
1f980 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d  vel->notReady)!=
1f990 30 20 29 3b 0a 20 20 20 20 70 41 6c 74 20 3d 20  0 );.    pAlt = 
1f9a0 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
1f9b0 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  ur, pTerm->u.lef
1f9c0 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61 64  tColumn, notRead
1f9d0 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20  y, WO_EQ|WO_IN, 
1f9e0 30 29 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74  0);.    if( pAlt
1f9f0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1fa00 20 20 20 20 69 66 28 20 70 41 6c 74 2d 3e 77 74      if( pAlt->wt
1fa10 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f  Flags & (TERM_CO
1fa20 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
1fa30 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1fa40 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  Alt->eOperator &
1fa50 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 74 65   WO_EQ );.    te
1fa60 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f  stcase( pAlt->eO
1fa70 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
1fa80 29 3b 0a 20 20 20 20 56 64 62 65 4d 6f 64 75 6c  );.    VdbeModul
1fa90 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65  eComment((v, "be
1faa0 67 69 6e 20 74 72 61 6e 73 69 74 69 76 65 20 63  gin transitive c
1fab0 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b 0a 20 20  onstraint"));.  
1fac0 20 20 70 45 41 6c 74 20 3d 20 73 71 6c 69 74 65    pEAlt = sqlite
1fad0 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64  3StackAllocRaw(d
1fae0 62 2c 20 73 69 7a 65 6f 66 28 2a 70 45 41 6c 74  b, sizeof(*pEAlt
1faf0 29 29 3b 0a 20 20 20 20 69 66 28 20 70 45 41 6c  ));.    if( pEAl
1fb00 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 41 6c  t ){.      *pEAl
1fb10 74 20 3d 20 2a 70 41 6c 74 2d 3e 70 45 78 70 72  t = *pAlt->pExpr
1fb20 3b 0a 20 20 20 20 20 20 70 45 41 6c 74 2d 3e 70  ;.      pEAlt->p
1fb30 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c 65 66 74  Left = pE->pLeft
1fb40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1fb50 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1fb60 65 2c 20 70 45 41 6c 74 2c 20 61 64 64 72 43 6f  e, pEAlt, addrCo
1fb70 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nt, SQLITE_JUMPI
1fb80 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  FNULL);.      sq
1fb90 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64  lite3StackFree(d
1fba0 62 2c 20 70 45 41 6c 74 29 3b 0a 20 20 20 20 7d  b, pEAlt);.    }
1fbb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61  .  }..  /* For a
1fbc0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1fbd0 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
1fbe0 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64  that will record
1fbf0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20   the fact that. 
1fc00 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
1fc10 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68   row of the righ
1fc20 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63  t table has matc
1fc30 68 65 64 20 74 68 65 20 6c 65 66 74 20 74 61 62  hed the left tab
1fc40 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28  le.  .  */.  if(
1fc50 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
1fc60 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  in ){.    pLevel
1fc70 2d 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73 71  ->addrFirst = sq
1fc80 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1fc90 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
1fca0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1fcb0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
1fcc0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
1fcd0 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  in);.    VdbeCom
1fce0 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64  ment((v, "record
1fcf0 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29   LEFT JOIN hit")
1fd00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1fd10 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
1fd20 72 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 54  rse);.    for(pT
1fd30 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b  erm=pWC->a, j=0;
1fd40 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a   j<pWC->nTerm; j
1fd50 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
1fd60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1fd70 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
1fd80 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
1fd90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1fda0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1fdb0 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
1fdc0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
1fdd0 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
1fde0 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
1fdf0 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
1fe00 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
1fe10 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 65  >prereqAll & pLe
1fe20 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d  vel->notReady)!=
1fe30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
1fe40 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74  ert( pWInfo->unt
1fe50 65 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20  estedTerms );.  
1fe60 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1fe70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
1fe80 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78  sert( pTerm->pEx
1fe90 70 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pr );.      sqli
1fea0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1feb0 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45  Parse, pTerm->pE
1fec0 78 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53  xpr, addrCont, S
1fed0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1fee0 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  );.      pTerm->
1fef0 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
1ff00 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  CODED;.    }.  }
1ff10 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
1ff20 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1ff30 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a   iReleaseReg);..
1ff40 20 20 72 65 74 75 72 6e 20 70 4c 65 76 65 6c 2d    return pLevel-
1ff50 3e 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69  >notReady;.}..#i
1ff60 66 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54  f defined(WHERET
1ff70 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 20 26 26  RACE_ENABLED) &&
1ff80 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1ff90 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c  ENABLE_TREE_EXPL
1ffa0 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  AIN)./*.** Gener
1ffb0 61 74 65 20 22 45 78 70 6c 61 6e 61 74 69 6f 6e  ate "Explanation
1ffc0 22 20 74 65 78 74 20 66 6f 72 20 61 20 57 68 65  " text for a Whe
1ffd0 72 65 54 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69  reTerm..*/.stati
1ffe0 63 20 76 6f 69 64 20 77 68 65 72 65 45 78 70 6c  c void whereExpl
1fff0 61 69 6e 54 65 72 6d 28 56 64 62 65 20 2a 76 2c  ainTerm(Vdbe *v,
20000 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
20010 6d 29 7b 0a 20 20 63 68 61 72 20 7a 54 79 70 65  m){.  char zType
20020 5b 34 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 54  [4];.  memcpy(zT
20030 79 70 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a  ype, "...", 4);.
20040 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
20050 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
20060 55 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d  UAL ) zType[0] =
20070 20 27 56 27 3b 0a 20 20 69 66 28 20 70 54 65 72   'V';.  if( pTer
20080 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
20090 4f 5f 45 51 55 49 56 20 20 29 20 7a 54 79 70 65  O_EQUIV  ) zType
200a0 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20 69 66 28  [1] = 'E';.  if(
200b0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
200c0 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
200d0 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 7a 54  P_FromJoin) ) zT
200e0 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a 20 20  ype[2] = 'L';.  
200f0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
20100 69 6e 74 66 28 76 2c 20 22 25 73 20 22 2c 20 7a  intf(v, "%s ", z
20110 54 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Type);.  sqlite3
20120 45 78 70 6c 61 69 6e 45 78 70 72 28 76 2c 20 70  ExplainExpr(v, p
20130 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a  Term->pExpr);.}.
20140 23 65 6e 64 69 66 20 2f 2a 20 57 48 45 52 45 54  #endif /* WHERET
20150 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 26 26 20  RACE_ENABLED && 
20160 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52  SQLITE_ENABLE_TR
20170 45 45 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a  EE_EXPLAIN */...
20180 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
20190 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20  E_ENABLED./*.** 
201a0 50 72 69 6e 74 20 61 20 57 68 65 72 65 4c 6f 6f  Print a WhereLoo
201b0 70 20 6f 62 6a 65 63 74 20 66 6f 72 20 64 65 62  p object for deb
201c0 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65 73 0a  ugging purposes.
201d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
201e0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 57 68  hereLoopPrint(Wh
201f0 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72  ereLoop *p, Wher
20200 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20  eClause *pWC){. 
20210 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
20220 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  fo = pWC->pWInfo
20230 3b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31 2b 28  ;.  int nb = 1+(
20240 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
20250 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a 20 20 73  ->nSrc+7)/8;.  s
20260 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
20270 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 57 49 6e  em *pItem = pWIn
20280 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20  fo->pTabList->a 
20290 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61 62  + p->iTab;.  Tab
202a0 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d  le *pTab = pItem
202b0 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65  ->pTab;.  sqlite
202c0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 63  3DebugPrintf("%c
202d0 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c  %2d.%0*llx.%0*ll
202e0 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20 20 20  x", p->cId,.    
202f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20300 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20 70 2d   p->iTab, nb, p-
20310 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c 20 70  >maskSelf, nb, p
20320 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20 73 71 6c  ->prereq);.  sql
20330 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
20340 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20 20 20  " %12s",.       
20350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
20360 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49  tem->zAlias ? pI
20370 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54  tem->zAlias : pT
20380 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ab->zName);.  if
20390 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
203a0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
203b0 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 63  LE)==0 ){.     c
203c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
203d0 3b 0a 20 20 20 20 20 69 66 28 20 70 2d 3e 75 2e  ;.     if( p->u.
203e0 62 74 72 65 65 2e 70 49 6e 64 65 78 20 26 26 20  btree.pIndex && 
203f0 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74  (zName = p->u.bt
20400 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
20410 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e)!=0 ){.      i
20420 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65  f( strncmp(zName
20430 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
20440 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b  dex_", 17)==0 ){
20450 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d  .        int i =
20460 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
20470 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20  (zName) - 1;.   
20480 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d       while( zNam
20490 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b  e[i]!='_' ) i--;
204a0 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b  .        zName +
204b0 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = i;.      }.   
204c0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
204d0 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25 32  rintf(".%-16s %2
204e0 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e  d", zName, p->u.
204f0 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20  btree.nEq);.    
20500 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
20510 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
20520 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20 20  "%20s","");.    
20530 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  }.  }else{.    c
20540 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20  har *z;.    if( 
20550 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
20560 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71   ){.      z = sq
20570 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
20580 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a  %d,\"%s\",%x)",.
20590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205a0 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
205b0 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  , p->u.vtab.idxS
205c0 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  tr, p->u.vtab.om
205d0 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c  itMask);.    }el
205e0 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  se{.      z = sq
205f0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
20600 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74  %d,%x)", p->u.vt
20610 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e  ab.idxNum, p->u.
20620 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a  vtab.omitMask);.
20630 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
20640 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
20650 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73  -19s", z);.    s
20660 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
20670 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62    }.  sqlite3Deb
20680 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30 34  ugPrintf(" f %04
20690 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46 6c  x N %d", p->wsFl
206a0 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b  ags, p->nLTerm);
206b0 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
206c0 72 69 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c  rintf(" cost %d,
206d0 25 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65  %d,%d\n", p->rSe
206e0 74 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d  tup, p->rRun, p-
206f0 3e 6e 4f 75 74 29 3b 0a 23 69 66 64 65 66 20 53  >nOut);.#ifdef S
20700 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45  QLITE_ENABLE_TRE
20710 45 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49  E_EXPLAIN.  /* I
20720 66 20 74 68 65 20 30 78 31 30 30 20 62 69 74 20  f the 0x100 bit 
20730 6f 66 20 77 68 65 72 65 74 72 61 63 69 6e 67 20  of wheretracing 
20740 69 73 20 73 65 74 2c 20 74 68 65 6e 20 73 68 6f  is set, then sho
20750 77 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6e  w all of the con
20760 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20 65 78 70  straint.  ** exp
20770 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
20780 57 68 65 72 65 4c 6f 6f 70 2e 61 4c 54 65 72 6d  WhereLoop.aLTerm
20790 5b 5d 20 61 72 72 61 79 2e 0a 20 20 2a 2f 0a 20  [] array..  */. 
207a0 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26   if( p->nLTerm &
207b0 26 20 28 73 71 6c 69 74 65 33 57 68 65 72 65 54  & (sqlite3WhereT
207c0 72 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30  race & 0x100)!=0
207d0 20 29 7b 20 20 2f 2a 20 57 48 45 52 45 54 52 41   ){  /* WHERETRA
207e0 43 45 20 30 78 31 30 30 20 2a 2f 0a 20 20 20 20  CE 0x100 */.    
207f0 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 20  int i;.    Vdbe 
20800 2a 76 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  *v = pWInfo->pPa
20810 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
20820 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 42 65  sqlite3ExplainBe
20830 67 69 6e 28 76 29 3b 0a 20 20 20 20 66 6f 72 28  gin(v);.    for(
20840 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d  i=0; i<p->nLTerm
20850 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68  ; i++){.      Wh
20860 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d  ereTerm *pTerm =
20870 20 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3b 0a 20   p->aLTerm[i];. 
20880 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
20890 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
208a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
208b0 69 6e 50 72 69 6e 74 66 28 76 2c 20 22 20 20 28  inPrintf(v, "  (
208c0 25 64 29 20 23 25 2d 32 64 20 22 2c 20 69 2b 31  %d) #%-2d ", i+1
208d0 2c 20 28 69 6e 74 29 28 70 54 65 72 6d 2d 70 57  , (int)(pTerm-pW
208e0 43 2d 3e 61 29 29 3b 0a 20 20 20 20 20 20 73 71  C->a));.      sq
208f0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68  lite3ExplainPush
20900 28 76 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65  (v);.      where
20910 45 78 70 6c 61 69 6e 54 65 72 6d 28 76 2c 20 70  ExplainTerm(v, p
20920 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  Term);.      sql
20930 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 76  ite3ExplainPop(v
20940 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20950 45 78 70 6c 61 69 6e 4e 4c 28 76 29 3b 0a 20 20  ExplainNL(v);.  
20960 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
20970 78 70 6c 61 69 6e 46 69 6e 69 73 68 28 76 29 3b  xplainFinish(v);
20980 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
20990 67 50 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  gPrintf("%s", sq
209a0 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 6e 61  lite3VdbeExplana
209b0 74 69 6f 6e 28 76 29 29 3b 0a 20 20 7d 0a 23 65  tion(v));.  }.#e
209c0 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ndif.}.#endif../
209d0 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c  *.** Convert bul
209e0 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20  k memory into a 
209f0 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70 20  valid WhereLoop 
20a00 74 68 61 74 20 63 61 6e 20 62 65 20 70 61 73 73  that can be pass
20a10 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f  ed.** to whereLo
20a20 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73 73  opClear harmless
20a30 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
20a40 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  id whereLoopInit
20a50 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a  (WhereLoop *p){.
20a60 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d    p->aLTerm = p-
20a70 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20 20  >aLTermSpace;.  
20a80 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20  p->nLTerm = 0;. 
20a90 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72   p->nLSlot = Arr
20aa0 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d  aySize(p->aLTerm
20ab0 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46  Space);.  p->wsF
20ac0 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  lags = 0;.}../*.
20ad0 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68 65  ** Clear the Whe
20ae0 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20  reLoop.u union. 
20af0 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f 70   Leave WhereLoop
20b00 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a  .pLTerm intact..
20b10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
20b20 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
20b30 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  on(sqlite3 *db, 
20b40 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
20b50 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20   if( p->wsFlags 
20b60 26 20 28 57 48 45 52 45 5f 56 49 52 54 55 41 4c  & (WHERE_VIRTUAL
20b70 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f  TABLE|WHERE_AUTO
20b80 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 69  _INDEX) ){.    i
20b90 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
20ba0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
20bb0 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e  BLE)!=0 && p->u.
20bc0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b  vtab.needFree ){
20bd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
20be0 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64  ree(p->u.vtab.id
20bf0 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e  xStr);.      p->
20c00 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
20c10 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  = 0;.      p->u.
20c20 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30 3b  vtab.idxStr = 0;
20c30 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
20c40 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
20c50 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
20c60 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e  0 && p->u.btree.
20c70 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20  pIndex!=0 ){.   
20c80 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
20c90 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  (db, p->u.btree.
20ca0 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29  pIndex->zColAff)
20cb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b  ;.      sqlite3K
20cc0 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 2d 3e 75  eyInfoUnref(p->u
20cd0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 70  .btree.pIndex->p
20ce0 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  KeyInfo);.      
20cf0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
20d00 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  , p->u.btree.pIn
20d10 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75  dex);.      p->u
20d20 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
20d30 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
20d40 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
20d50 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72 79   internal memory
20d60 20 75 73 65 64 20 62 79 20 61 20 57 68 65 72 65   used by a Where
20d70 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  Loop object.*/.s
20d80 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
20d90 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74 65  LoopClear(sqlite
20da0 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
20db0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61   *p){.  if( p->a
20dc0 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d  LTerm!=p->aLTerm
20dd0 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33 44  Space ) sqlite3D
20de0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54  bFree(db, p->aLT
20df0 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  erm);.  whereLoo
20e00 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20  pClearUnion(db, 
20e10 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49  p);.  whereLoopI
20e20 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nit(p);.}../*.**
20e30 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6d 65   Increase the me
20e40 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
20e50 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  for pLoop->aLTer
20e60 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c 65 61  m[] to be at lea
20e70 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  st n..*/.static 
20e80 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  int whereLoopRes
20e90 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ize(sqlite3 *db,
20ea0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 69   WhereLoop *p, i
20eb0 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65 54 65  nt n){.  WhereTe
20ec0 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69 66  rm **paNew;.  if
20ed0 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29  ( p->nLSlot>=n )
20ee0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20ef0 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26 7e  K;.  n = (n+7)&~
20f00 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73 71 6c  7;.  paNew = sql
20f10 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
20f20 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  db, sizeof(p->aL
20f30 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69  Term[0])*n);.  i
20f40 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65  f( paNew==0 ) re
20f50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
20f60 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65  M;.  memcpy(paNe
20f70 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69  w, p->aLTerm, si
20f80 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30  zeof(p->aLTerm[0
20f90 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20  ])*p->nLSlot);. 
20fa0 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
20fb0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
20fc0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
20fd0 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
20fe0 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61 4e   p->aLTerm = paN
20ff0 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20  ew;.  p->nLSlot 
21000 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = n;.  return SQ
21010 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
21020 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74 65  * Transfer conte
21030 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  nt from the seco
21040 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74 68  nd pLoop into th
21050 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74  e first..*/.stat
21060 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
21070 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62  Xfer(sqlite3 *db
21080 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f  , WhereLoop *pTo
21090 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46 72  , WhereLoop *pFr
210a0 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  om){.  whereLoop
210b0 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70  ClearUnion(db, p
210c0 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65 72 65  To);.  if( where
210d0 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
210e0 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72  To, pFrom->nLTer
210f0 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  m) ){.    memset
21100 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a  (&pTo->u, 0, siz
21110 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20 20  eof(pTo->u));.  
21120 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21130 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
21140 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20  cpy(pTo, pFrom, 
21150 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f  WHERE_LOOP_XFER_
21160 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  SZ);.  memcpy(pT
21170 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d  o->aLTerm, pFrom
21180 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e  ->aLTerm, pTo->n
21190 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f  LTerm*sizeof(pTo
211a0 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20  ->aLTerm[0]));. 
211b0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c   if( pFrom->wsFl
211c0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
211d0 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20  UALTABLE ){.    
211e0 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65  pFrom->u.vtab.ne
211f0 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  edFree = 0;.  }e
21200 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e  lse if( (pFrom->
21210 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
21220 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29  AUTO_INDEX)!=0 )
21230 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62  {.    pFrom->u.b
21240 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
21250 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
21260 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
21270 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65 72 65  * Delete a Where
21280 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  Loop object.*/.s
21290 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
212a0 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c 69 74  LoopDelete(sqlit
212b0 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
212c0 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f  p *p){.  whereLo
212d0 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a  opClear(db, p);.
212e0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
212f0 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
21300 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e 66   Free a WhereInf
21310 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73  o structure.*/.s
21320 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
21330 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33  InfoFree(sqlite3
21340 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20   *db, WhereInfo 
21350 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20  *pWInfo){.  if( 
21360 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29  ALWAYS(pWInfo) )
21370 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  {.    whereClaus
21380 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e  eClear(&pWInfo->
21390 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  sWC);.    while(
213a0 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
213b0 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f  ){.      WhereLo
213c0 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  op *p = pWInfo->
213d0 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70 57  pLoops;.      pW
213e0 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70  Info->pLoops = p
213f0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
21400 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65     whereLoopDele
21410 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d  te(db, p);.    }
21420 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
21430 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
21440 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73    }.}../*.** Ins
21450 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20 61  ert or replace a
21460 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79   WhereLoop entry
21470 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70 6c   using the templ
21480 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a  ate supplied..**
21490 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20  .** An existing 
214a0 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20  WhereLoop entry 
214b0 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77 72 69  might be overwri
214c0 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77 20  tten if the new 
214d0 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62  template.** is b
214e0 65 74 74 65 72 20 61 6e 64 20 68 61 73 20 66 65  etter and has fe
214f0 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
21500 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c 61  .  Or the templa
21510 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  te will be ignor
21520 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73  ed.** and no ins
21530 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20 69  ert will occur i
21540 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  f an existing Wh
21550 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74 65  ereLoop is faste
21560 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77  r and has.** few
21570 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  er dependencies 
21580 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  than the templat
21590 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 20  e.  Otherwise a 
215a0 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  new WhereLoop is
215b0 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64 20  .** added based 
215c0 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e  on the template.
215d0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64  .**.** If pBuild
215e0 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f  er->pOrSet is no
215f0 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20 6f  t NULL then we o
21600 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 6f  nly care about o
21610 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65  nly the.** prere
21620 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52 75  quisites and rRu
21630 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73  n and nOut costs
21640 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c   of the N best l
21650 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69  oops.  That.** i
21660 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61  nformation is ga
21670 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70 42  thered in the pB
21680 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f  uilder->pOrSet o
21690 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70 65  bject.  This spe
216a0 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69  cial.** processi
216b0 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
216c0 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75  only for OR clau
216d0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
216e0 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75  *.** When accumu
216f0 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  lating multiple 
21700 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69  loops (when pBui
21710 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
21720 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c  NULL) we.** stil
21730 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  l might overwrit
21740 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20  e similar loops 
21750 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d  with the new tem
21760 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  plate if the.** 
21770 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74  template is bett
21780 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62  er.  Loops may b
21790 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66  e overwritten if
217a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a   the following .
217b0 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72  ** conditions ar
217c0 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  e met:.**.**    
217d0 28 31 29 20 20 54 68 65 79 20 68 61 76 65 20 74  (1)  They have t
217e0 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a  he same iTab..**
217f0 20 20 20 20 28 32 29 20 20 54 68 65 79 20 68 61      (2)  They ha
21800 76 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72  ve the same iSor
21810 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20  tIdx..**    (3) 
21820 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61   The template ha
21830 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20  s same or fewer 
21840 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
21850 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  n the current lo
21860 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68  op.**    (4)  Th
21870 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74  e template has t
21880 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
21890 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63   cost than the c
218a0 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20  urrent loop.**  
218b0 20 20 28 35 29 20 20 54 68 65 20 74 65 6d 70 6c    (5)  The templ
218c0 61 74 65 20 75 73 65 73 20 6d 6f 72 65 20 74 65  ate uses more te
218d0 72 6d 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  rms of the same 
218e0 69 6e 64 65 78 20 62 75 74 20 68 61 73 20 6e 6f  index but has no
218f0 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 20   additional.**  
21900 20 20 20 20 20 20 20 64 65 70 65 6e 64 65 6e 63         dependenc
21910 69 65 73 20 20 20 20 20 20 20 20 20 20 0a 2a 2f  ies          .*/
21920 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
21930 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72  eLoopInsert(Wher
21940 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
21950 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f  uilder, WhereLoo
21960 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20  p *pTemplate){. 
21970 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50   WhereLoop **ppP
21980 72 65 76 2c 20 2a 70 2c 20 2a 70 4e 65 78 74 20  rev, *p, *pNext 
21990 3d 20 30 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f  = 0;.  WhereInfo
219a0 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
219b0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73  der->pWInfo;.  s
219c0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
219d0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
219e0 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64  ..  /* If pBuild
219f0 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 64 65  er->pOrSet is de
21a00 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79  fined, then only
21a10 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   keep track of t
21a20 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61 6e  he costs.  ** an
21a30 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f 0a  d prereqs..  */.
21a40 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e    if( pBuilder->
21a50 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 23 69 66  pOrSet!=0 ){.#if
21a60 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
21a70 4c 45 44 0a 20 20 20 20 75 31 36 20 6e 20 3d 20  LED.    u16 n = 
21a80 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
21a90 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d  ->n;.    int x =
21aa0 0a 23 65 6e 64 69 66 0a 20 20 20 20 77 68 65 72  .#endif.    wher
21ab0 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69 6c 64  eOrInsert(pBuild
21ac0 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65 6d  er->pOrSet, pTem
21ad0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c 20 70  plate->prereq, p
21ae0 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a  Template->rRun,.
21af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b10 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e      pTemplate->n
21b20 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52 45 54  Out);.#if WHERET
21b30 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
21b40 30 78 38 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  0x8 */.    if( s
21b50 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
21b60 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20   & 0x8 ){.      
21b70 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
21b80 74 66 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20  tf(x?"   or-%d: 
21b90 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c   ":"   or-X:  ",
21ba0 20 6e 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65   n);.      where
21bb0 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
21bc0 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
21bd0 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  WC);.    }.#endi
21be0 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
21bf0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
21c00 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
21c10 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
21c20 6f 70 20 74 6f 20 6f 76 65 72 77 72 69 74 65 2c  op to overwrite,
21c30 20 6f 72 20 77 68 69 63 68 20 74 61 6b 65 73 0a   or which takes.
21c40 20 20 2a 2a 20 70 72 69 6f 72 69 74 79 20 6f 76    ** priority ov
21c50 65 72 20 70 54 65 6d 70 6c 61 74 65 2e 0a 20 20  er pTemplate..  
21c60 2a 2f 0a 20 20 66 6f 72 28 70 70 50 72 65 76 3d  */.  for(ppPrev=
21c70 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c  &pWInfo->pLoops,
21c80 20 70 3d 2a 70 70 50 72 65 76 3b 20 70 3b 20 70   p=*ppPrev; p; p
21c90 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c  pPrev=&p->pNextL
21ca0 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b  oop, p=*ppPrev){
21cb0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62  .    if( p->iTab
21cc0 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61  !=pTemplate->iTa
21cd0 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78  b || p->iSortIdx
21ce0 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f  !=pTemplate->iSo
21cf0 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f  rtIdx ){.      /
21d00 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20  * If either the 
21d10 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78  iTab or iSortIdx
21d20 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20   values for two 
21d30 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69  WhereLoop are di
21d40 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  fferent.      **
21d50 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72   then those Wher
21d60 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62  eLoops need to b
21d70 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70  e considered sep
21d80 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65  arately.  Neithe
21d90 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  r is.      ** a 
21da0 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70  candidate to rep
21db0 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20  lace the other. 
21dc0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  */.      continu
21dd0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  e;.    }.    /* 
21de0 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  In the current i
21df0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74  mplementation, t
21e00 68 65 20 72 53 65 74 75 70 20 76 61 6c 75 65 20  he rSetup value 
21e10 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20  is either zero. 
21e20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73     ** or the cos
21e30 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e  t of building an
21e40 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
21e50 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65   (NlogN) and the
21e60 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73   NlogN.    ** is
21e70 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f   the same for co
21e80 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f  mpatible WhereLo
21e90 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ops. */.    asse
21ea0 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30  rt( p->rSetup==0
21eb0 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72   || pTemplate->r
21ec0 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20  Setup==0 .      
21ed0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
21ee0 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61  >rSetup==pTempla
21ef0 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20  te->rSetup );.. 
21f00 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41     /* whereLoopA
21f10 64 64 42 74 72 65 65 28 29 20 61 6c 77 61 79 73  ddBtree() always
21f20 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69   generates and i
21f30 6e 73 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d  nserts the autom
21f40 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a  atic index.    *
21f50 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20 20 48  * case first.  H
21f60 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  ence compatible 
21f70 63 61 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c  candidate WhereL
21f80 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65 20  oops never have 
21f90 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20  a larger.    ** 
21fa0 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69  rSetup. Call thi
21fb0 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e  s SETUP-INVARIAN
21fc0 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  T */.    assert(
21fd0 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d   p->rSetup>=pTem
21fe0 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
21ff0 0a 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  ..    if( (p->pr
22000 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
22010 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72  ->prereq)==p->pr
22020 65 72 65 71 0a 20 20 20 20 20 26 26 20 70 2d 3e  ereq.     && p->
22030 72 53 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61 74  rSetup<=pTemplat
22040 65 2d 3e 72 53 65 74 75 70 0a 20 20 20 20 20 26  e->rSetup.     &
22050 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70  & p->rRun<=pTemp
22060 6c 61 74 65 2d 3e 72 52 75 6e 0a 20 20 20 20 20  late->rRun.     
22070 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d  && p->nOut<=pTem
22080 70 6c 61 74 65 2d 3e 6e 4f 75 74 0a 20 20 20 20  plate->nOut.    
22090 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
220a0 20 62 72 61 6e 63 68 20 74 61 6b 65 6e 20 77 68   branch taken wh
220b0 65 6e 20 70 20 69 73 20 65 71 75 61 6c 20 6f 72  en p is equal or
220c0 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 54 65   better than pTe
220d0 6d 70 6c 61 74 65 20 69 6e 20 0a 20 20 20 20 20  mplate in .     
220e0 20 2a 2a 20 61 6c 6c 20 6f 66 20 28 31 29 20 64   ** all of (1) d
220f0 65 70 65 6e 64 65 6e 63 69 65 73 20 28 32 29 20  ependencies (2) 
22100 73 65 74 75 70 2d 63 6f 73 74 2c 20 28 33 29 20  setup-cost, (3) 
22110 72 75 6e 2d 63 6f 73 74 2c 20 61 6e 64 0a 20 20  run-cost, and.  
22120 20 20 20 20 2a 2a 20 28 34 29 20 6e 75 6d 62 65      ** (4) numbe
22130 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
22140 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
22150 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54  t( p->rSetup==pT
22160 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
22170 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
22180 70 72 65 72 65 71 3d 3d 70 54 65 6d 70 6c 61 74  prereq==pTemplat
22190 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20 20  e->prereq.      
221a0 20 26 26 20 70 2d 3e 6e 4c 54 65 72 6d 3c 70 54   && p->nLTerm<pT
221b0 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 0a  emplate->nLTerm.
221c0 20 20 20 20 20 20 20 26 26 20 28 70 2d 3e 77 73         && (p->ws
221d0 46 6c 61 67 73 20 26 20 70 54 65 6d 70 6c 61 74  Flags & pTemplat
221e0 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  e->wsFlags & WHE
221f0 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
22200 20 20 20 20 20 20 26 26 20 28 70 2d 3e 75 2e 62        && (p->u.b
22210 74 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70 54 65  tree.pIndex==pTe
22220 6d 70 6c 61 74 65 2d 3e 75 2e 62 74 72 65 65 2e  mplate->u.btree.
22230 70 49 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20  pIndex.         
22240 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72   || pTemplate->r
22250 52 75 6e 2b 70 2d 3e 6e 4c 54 65 72 6d 3c 3d 70  Run+p->nLTerm<=p
22260 2d 3e 72 52 75 6e 2b 70 54 65 6d 70 6c 61 74 65  ->rRun+pTemplate
22270 2d 3e 6e 4c 54 65 72 6d 29 0a 20 20 20 20 20 20  ->nLTerm).      
22280 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 76  ){.        /* Ov
22290 65 72 77 72 69 74 65 20 61 6e 20 65 78 69 73 74  erwrite an exist
222a0 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 77 69  ing WhereLoop wi
222b0 74 68 20 61 6e 20 73 69 6d 69 6c 61 72 20 6f 6e  th an similar on
222c0 65 20 74 68 61 74 20 75 73 65 73 0a 20 20 20 20  e that uses.    
222d0 20 20 20 20 2a 2a 20 6d 6f 72 65 20 74 65 72 6d      ** more term
222e0 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a  s of the index *
222f0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74 20  /.        pNext 
22300 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  = p->pNextLoop;.
22310 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
22320 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22330 20 20 20 20 2f 2a 20 70 54 65 6d 70 6c 61 74 65      /* pTemplate
22340 20 69 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c 2e   is not helpful.
22350 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65 74 75  .        ** Retu
22360 72 6e 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  rn without chang
22370 69 6e 67 20 6f 72 20 61 64 64 69 6e 67 20 61 6e  ing or adding an
22380 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  ything */.      
22390 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70    goto whereLoop
223a0 49 6e 73 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20  Insert_noop;.   
223b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
223c0 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  f( (p->prereq & 
223d0 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
223e0 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q)==pTemplate->p
223f0 72 65 72 65 71 0a 20 20 20 20 20 26 26 20 70 2d  rereq.     && p-
22400 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65  >rRun>=pTemplate
22410 2d 3e 72 52 75 6e 0a 20 20 20 20 20 26 26 20 70  ->rRun.     && p
22420 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74  ->nOut>=pTemplat
22430 65 2d 3e 6e 4f 75 74 0a 20 20 20 20 29 7b 0a 20  e->nOut.    ){. 
22440 20 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74       /* Overwrit
22450 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  e an existing Wh
22460 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 20 62  ereLoop with a b
22470 65 74 74 65 72 20 6f 6e 65 3a 20 6f 6e 65 20 74  etter one: one t
22480 68 61 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  hat is.      ** 
22490 62 65 74 74 65 72 20 61 74 20 6f 6e 65 20 6f 66  better at one of
224a0 20 28 31 29 20 64 65 70 65 6e 64 65 6e 63 69 65   (1) dependencie
224b0 73 2c 20 28 32 29 20 73 65 74 75 70 2d 63 6f 73  s, (2) setup-cos
224c0 74 2c 20 28 33 29 20 72 75 6e 2d 63 6f 73 74 0a  t, (3) run-cost.
224d0 20 20 20 20 20 20 2a 2a 20 6f 72 20 28 34 29 20        ** or (4) 
224e0 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
224f0 20 72 6f 77 73 2c 20 61 6e 64 20 69 73 20 6e 6f   rows, and is no
22500 20 77 6f 72 73 65 20 69 6e 20 61 6e 79 20 6f 66   worse in any of
22510 20 74 68 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20   those.      ** 
22520 63 61 74 65 67 6f 72 69 65 73 2e 20 2a 2f 0a 20  categories. */. 
22530 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
22540 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74  rSetup>=pTemplat
22550 65 2d 3e 72 53 65 74 75 70 20 29 3b 20 2f 2a 20  e->rSetup ); /* 
22560 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20  SETUP-INVARIANT 
22570 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 70  above */.      p
22580 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c  Next = p->pNextL
22590 6f 6f 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  oop;.      break
225a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
225b0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
225c0 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e  is point it mean
225d0 73 20 74 68 61 74 20 65 69 74 68 65 72 20 70 5b  s that either p[
225e0 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72  ] should be over
225f0 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74  written.  ** wit
22600 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66  h pTemplate[] if
22610 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20   p[] exists, or 
22620 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20  if p==NULL then 
22630 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20  allocate a new. 
22640 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e   ** WhereLoop an
22650 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a  d insert it..  *
22660 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  /.#if WHERETRACE
22670 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20  _ENABLED /* 0x8 
22680 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
22690 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
226a0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30   ){.    if( p!=0
226b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
226c0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e  3DebugPrintf("in
226d0 73 2d 64 65 6c 3a 20 20 22 29 3b 0a 20 20 20 20  s-del:  ");.    
226e0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
226f0 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  (p, pBuilder->pW
22700 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  C);.    }.    sq
22710 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
22720 28 22 69 6e 73 2d 6e 65 77 3a 20 20 22 29 3b 0a  ("ins-new:  ");.
22730 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
22740 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42  nt(pTemplate, pB
22750 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
22760 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
22770 3d 3d 30 20 29 7b 0a 20 20 20 20 70 20 3d 20 73  ==0 ){.    p = s
22780 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
22790 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 57 68 65  w(db, sizeof(Whe
227a0 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20 20 69 66  reLoop));.    if
227b0 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
227c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
227d0 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
227e0 70 29 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c  p);.  }.  whereL
227f0 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70  oopXfer(db, p, p
22800 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70 2d 3e  Template);.  p->
22810 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 70 4e 65 78  pNextLoop = pNex
22820 74 3b 0a 20 20 2a 70 70 50 72 65 76 20 3d 20 70  t;.  *ppPrev = p
22830 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  ;.  if( (p->wsFl
22840 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
22850 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a  UALTABLE)==0 ){.
22860 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65      Index *pInde
22870 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  x = p->u.btree.p
22880 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
22890 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d  Index && pIndex-
228a0 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  >tnum==0 ){.    
228b0 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e    p->u.btree.pIn
228c0 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  dex = 0;.    }. 
228d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
228e0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
228f0 70 20 68 65 72 65 20 69 66 20 74 68 65 20 69 6e  p here if the in
22900 73 65 72 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20  sert is a no-op 
22910 2a 2f 0a 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65  */.whereLoopInse
22920 72 74 5f 6e 6f 6f 70 3a 0a 23 69 66 20 57 48 45  rt_noop:.#if WHE
22930 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
22940 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69 66 28 20  /* 0x8 */.  if( 
22950 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
22960 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 73  e & 0x8 ){.    s
22970 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
22980 66 28 22 69 6e 73 2d 6e 6f 6f 70 3a 20 22 29 3b  f("ins-noop: ");
22990 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72  .    whereLoopPr
229a0 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  int(pTemplate, p
229b0 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
229c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
229d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a  rn SQLITE_OK;  .
229e0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
229f0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f  the WhereLoop.nO
22a00 75 74 20 76 61 6c 75 65 20 64 6f 77 6e 77 61 72  ut value downwar
22a10 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  d to account for
22a20 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
22a30 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
22a40 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
22a50 20 6c 6f 6f 70 20 62 75 74 20 77 68 69 63 68 20   loop but which 
22a60 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62 79 20  are not used by 
22a70 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a  an.** index..**.
22a80 2a 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e  ** In the curren
22a90 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
22aa0 2c 20 74 68 65 20 66 69 72 73 74 20 65 78 74 72  , the first extr
22ab0 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
22ac0 65 72 6d 20 72 65 64 75 63 65 73 0a 2a 2a 20 74  erm reduces.** t
22ad0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
22ae0 70 75 74 20 72 6f 77 73 20 62 79 20 61 20 66 61  put rows by a fa
22af0 63 74 6f 72 20 6f 66 20 31 30 20 61 6e 64 20 65  ctor of 10 and e
22b00 61 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 74  ach additional t
22b10 65 72 6d 0a 2a 2a 20 72 65 64 75 63 65 73 20 74  erm.** reduces t
22b20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
22b30 70 75 74 20 72 6f 77 73 20 62 79 20 73 71 72 74  put rows by sqrt
22b40 28 32 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  (2)..*/.static v
22b50 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74  oid whereLoopOut
22b60 70 75 74 41 64 6a 75 73 74 28 57 68 65 72 65 43  putAdjust(WhereC
22b70 6c 61 75 73 65 20 2a 70 57 43 2c 20 57 68 65 72  lause *pWC, Wher
22b80 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 29 7b 0a 20  eLoop *pLoop){. 
22b90 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
22ba0 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73  m, *pX;.  Bitmas
22bb0 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e  k notAllowed = ~
22bc0 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70  (pLoop->prereq|p
22bd0 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b  Loop->maskSelf);
22be0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20  .  int i, j;..  
22bf0 69 66 28 20 21 4f 70 74 69 6d 69 7a 61 74 69 6f  if( !Optimizatio
22c00 6e 45 6e 61 62 6c 65 64 28 70 57 43 2d 3e 70 57  nEnabled(pWC->pW
22c10 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
22c20 2c 20 53 51 4c 49 54 45 5f 41 64 6a 75 73 74 4f  , SQLITE_AdjustO
22c30 75 74 45 73 74 29 20 29 7b 0a 20 20 20 20 72 65  utEst) ){.    re
22c40 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  turn;.  }.  for(
22c50 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20 70 54  i=pWC->nTerm, pT
22c60 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e 30 3b  erm=pWC->a; i>0;
22c70 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i--, pTerm++){.
22c80 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
22c90 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
22ca0 49 52 54 55 41 4c 29 21 3d 30 20 29 20 62 72 65  IRTUAL)!=0 ) bre
22cb0 61 6b 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ak;.    if( (pTe
22cc0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
22cd0 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
22ce0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
22cf0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
22d00 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 41  prereqAll & notA
22d10 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20 63 6f 6e  llowed)!=0 ) con
22d20 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a  tinue;.    for(j
22d30 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31  =pLoop->nLTerm-1
22d40 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20  ; j>=0; j--){.  
22d50 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e      pX = pLoop->
22d60 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20  aLTerm[j];.     
22d70 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63 6f 6e   if( pX==0 ) con
22d80 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
22d90 20 70 58 3d 3d 70 54 65 72 6d 20 29 20 62 72 65   pX==pTerm ) bre
22da0 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  ak;.      if( pX
22db0 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26 26 20  ->iParent>=0 && 
22dc0 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69 50 61  (&pWC->a[pX->iPa
22dd0 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20 29 20  rent])==pTerm ) 
22de0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
22df0 20 69 66 28 20 6a 3c 30 20 29 20 70 4c 6f 6f 70   if( j<0 ) pLoop
22e00 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d  ->nOut += pTerm-
22e10 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 7d 0a  >truthProb;.  }.
22e20 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65  }../*.** We have
22e30 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65 64 20   so far matched 
22e40 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
22e50 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65 72 6d  u.btree.nEq term
22e60 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 70  s of the index p
22e70 49 6e 64 65 78 2e 0a 2a 2a 20 54 72 79 20 74 6f  Index..** Try to
22e80 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e   match one more.
22e90 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65  .**.** If pProbe
22ea0 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20  ->tnum==0, that 
22eb0 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69 73 20  means pIndex is 
22ec0 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75 73 65  a fake index use
22ed0 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54  d for the.** INT
22ee0 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
22ef0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22f00 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
22f10 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 4c  eIndex(.  WhereL
22f20 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
22f30 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54 68 65  lder,     /* The
22f40 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f   WhereLoop facto
22f50 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ry */.  struct S
22f60 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
22f70 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  c,      /* FROM 
22f80 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e  clause term bein
22f90 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  g analyzed */.  
22fa0 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c 20 20  Index *pProbe,  
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fc0 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70  /* An index on p
22fd0 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  Src */.  LogEst 
22fe0 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20 20  nInMul          
22ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28           /* log(
23000 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74  Number of iterat
23010 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e 29 20  ions due to IN) 
23020 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  */.){.  WhereInf
23030 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
23040 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f  lder->pWInfo;  /
23050 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 65 20  * WHERE analyse 
23060 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72  context */.  Par
23070 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49  se *pParse = pWI
23080 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20  nfo->pParse;    
23090 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
230a0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
230b0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
230c0 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44  ->db;       /* D
230d0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
230e0 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78  on malloc contex
230f0 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
23100 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
23110 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61         /* Templa
23120 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64  te WhereLoop und
23130 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
23140 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
23150 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
23160 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72 65 54       /* A WhereT
23170 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69 64  erm under consid
23180 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
23190 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20   opMask;        
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
231b0 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72 73 20  Valid operators 
231c0 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  for constraints 
231d0 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73  */.  WhereScan s
231e0 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  can;            
231f0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
23200 20 66 6f 72 20 57 48 45 52 45 20 74 65 72 6d 73   for WHERE terms
23210 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73 61   */.  Bitmask sa
23220 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20 20 20  ved_prereq;     
23230 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
23240 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
23250 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75 31 36  >prereq */.  u16
23260 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20   saved_nLTerm;  
23270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23280 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
23290 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a  f pNew->nLTerm *
232a0 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 45  /.  u16 saved_nE
232b0 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
232c0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
232d0 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75  value of pNew->u
232e0 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20  .btree.nEq */.  
232f0 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b  u16 saved_nSkip;
23300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23310 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
23320 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72  e of pNew->u.btr
23330 65 65 2e 6e 53 6b 69 70 20 2a 2f 0a 20 20 75 33  ee.nSkip */.  u3
23340 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  2 saved_wsFlags;
23350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23360 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
23370 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  of pNew->wsFlags
23380 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73 61 76   */.  LogEst sav
23390 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20 20  ed_nOut;        
233a0 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
233b0 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
233c0 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69  >nOut */.  int i
233d0 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
233e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
233f0 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
23400 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  n in the table *
23410 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
23420 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
23430 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
23440 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e  de */.  LogEst n
23450 52 6f 77 45 73 74 3b 20 20 20 20 20 20 20 20 20  RowEst;         
23460 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d          /* Estim
23470 61 74 65 64 20 69 6e 64 65 78 20 73 65 6c 65 63  ated index selec
23480 74 69 76 69 74 79 20 2a 2f 0a 20 20 4c 6f 67 45  tivity */.  LogE
23490 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20  st rLogSize;    
234a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
234b0 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c  ogarithm of tabl
234c0 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72  e size */.  Wher
234d0 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c  eTerm *pTop = 0,
234e0 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54   *pBtm = 0; /* T
234f0 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61  op and bottom ra
23500 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
23510 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  */..  pNew = pBu
23520 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69  ilder->pNew;.  i
23530 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
23540 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  led ) return SQL
23550 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73  ITE_NOMEM;..  as
23560 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46  sert( (pNew->wsF
23570 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
23580 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b  TUALTABLE)==0 );
23590 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77  .  assert( (pNew
235a0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
235b0 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20  E_TOP_LIMIT)==0 
235c0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  );.  if( pNew->w
235d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
235e0 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
235f0 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57  opMask = WO_LT|W
23600 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  O_LE;.  }else if
23610 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d  ( pProbe->tnum<=
23620 30 20 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f 69 6e  0 || (pSrc->join
23630 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
23640 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b  =0 ){.    opMask
23650 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57   = WO_EQ|WO_IN|W
23660 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54  O_GT|WO_GE|WO_LT
23670 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b  |WO_LE;.  }else{
23680 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f  .    opMask = WO
23690 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e  _EQ|WO_IN|WO_ISN
236a0 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  ULL|WO_GT|WO_GE|
236b0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d  WO_LT|WO_LE;.  }
236c0 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62  .  if( pProbe->b
236d0 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61  Unordered ) opMa
236e0 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f  sk &= ~(WO_GT|WO
236f0 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29  _GE|WO_LT|WO_LE)
23700 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  ;..  assert( pNe
23710 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d  w->u.btree.nEq<=
23720 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 20  pProbe->nKeyCol 
23730 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 75  );.  if( pNew->u
23740 2e 62 74 72 65 65 2e 6e 45 71 20 3c 20 70 50 72  .btree.nEq < pPr
23750 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a  obe->nKeyCol ){.
23760 20 20 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62      iCol = pProb
23770 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77  e->aiColumn[pNew
23780 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b 0a  ->u.btree.nEq];.
23790 20 20 20 20 6e 52 6f 77 45 73 74 20 3d 20 73 71      nRowEst = sq
237a0 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 50 72 6f  lite3LogEst(pPro
237b0 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 70 4e 65  be->aiRowEst[pNe
237c0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 31  w->u.btree.nEq+1
237d0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77  ]);.    if( nRow
237e0 45 73 74 3d 3d 30 20 26 26 20 70 50 72 6f 62 65  Est==0 && pProbe
237f0 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f  ->onError==OE_No
23800 6e 65 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 31  ne ) nRowEst = 1
23810 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
23820 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 6e 52  Col = -1;.    nR
23830 6f 77 45 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  owEst = 0;.  }. 
23840 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63   pTerm = whereSc
23850 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 42  anInit(&scan, pB
23860 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53 72  uilder->pWC, pSr
23870 63 2d 3e 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c  c->iCursor, iCol
23880 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23890 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b            opMask
238a0 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 73 61 76  , pProbe);.  sav
238b0 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75  ed_nEq = pNew->u
238c0 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61  .btree.nEq;.  sa
238d0 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70 4e 65 77  ved_nSkip = pNew
238e0 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3b  ->u.btree.nSkip;
238f0 0a 20 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20  .  saved_nLTerm 
23900 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a  = pNew->nLTerm;.
23910 20 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 20    saved_wsFlags 
23920 3d 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b  = pNew->wsFlags;
23930 0a 20 20 73 61 76 65 64 5f 70 72 65 72 65 71 20  .  saved_prereq 
23940 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a  = pNew->prereq;.
23950 20 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70    saved_nOut = p
23960 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 4e 65  New->nOut;.  pNe
23970 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
23980 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c   rLogSize = estL
23990 6f 67 28 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  og(sqlite3LogEst
239a0 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73  (pProbe->aiRowEs
239b0 74 5b 30 5d 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f  t[0]));..  /* Co
239c0 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61 20 73  nsider using a s
239d0 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68 65 72  kip-scan if ther
239e0 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63  e are no WHERE c
239f0 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
23a00 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65  s.  ** available
23a10 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f   for the left-mo
23a20 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  st terms of the 
23a30 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20 74 68  index, and if th
23a40 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e  e average.  ** n
23a50 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61 74 73  umber of repeats
23a60 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   in the left-mos
23a70 74 20 74 65 72 6d 73 20 69 73 20 61 74 20 6c 65  t terms is at le
23a80 61 73 74 20 31 38 2e 20 20 54 68 65 20 6d 61 67  ast 18.  The mag
23a90 69 63 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 31  ic.  ** number 1
23aa0 38 20 77 61 73 20 66 6f 75 6e 64 20 62 79 20 65  8 was found by e
23ab0 78 70 65 72 69 6d 65 6e 74 61 74 69 6f 6e 20 74  xperimentation t
23ac0 6f 20 62 65 20 74 68 65 20 70 61 79 6f 66 66 20  o be the payoff 
23ad0 70 6f 69 6e 74 20 77 68 65 72 65 0a 20 20 2a 2a  point where.  **
23ae0 20 73 6b 69 70 2d 73 63 61 6e 20 62 65 63 6f 6d   skip-scan becom
23af0 65 20 66 61 73 74 65 72 20 74 68 61 6e 20 61 20  e faster than a 
23b00 66 75 6c 6c 2d 73 63 61 6e 2e 0a 20 20 2a 2f 0a  full-scan..  */.
23b10 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 0a 20    if( pTerm==0. 
23b20 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d    && saved_nEq==
23b30 73 61 76 65 64 5f 6e 53 6b 69 70 0a 20 20 20 26  saved_nSkip.   &
23b40 26 20 73 61 76 65 64 5f 6e 45 71 2b 31 3c 70 50  & saved_nEq+1<pP
23b50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20  robe->nKeyCol.  
23b60 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f   && pProbe->aiRo
23b70 77 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31  wEst[saved_nEq+1
23b80 5d 3e 3d 31 38 20 20 2f 2a 20 54 55 4e 49 4e 47  ]>=18  /* TUNING
23b90 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f 72 20 73 6b  : Minimum for sk
23ba0 69 70 2d 73 63 61 6e 20 2a 2f 0a 20 20 20 26 26  ip-scan */.   &&
23bb0 20 28 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70   (rc = whereLoop
23bc0 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
23bd0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29   pNew->nLTerm+1)
23be0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29  )==SQLITE_OK.  )
23bf0 7b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 49 74  {.    LogEst nIt
23c00 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  er;.    pNew->u.
23c10 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20  btree.nEq++;.   
23c20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
23c30 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77  Skip++;.    pNew
23c40 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
23c50 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20  LTerm++] = 0;.  
23c60 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
23c70 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41  |= WHERE_SKIPSCA
23c80 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20 3d 20 73  N;.    nIter = s
23c90 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 50 72  qlite3LogEst(pPr
23ca0 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  obe->aiRowEst[0]
23cb0 2f 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73  /pProbe->aiRowEs
23cc0 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 29 3b  t[saved_nEq+1]);
23cd0 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64  .    whereLoopAd
23ce0 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
23cf0 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
23d00 62 65 2c 20 6e 49 74 65 72 29 3b 0a 20 20 7d 0a  be, nIter);.  }.
23d10 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49    for(; rc==SQLI
23d20 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d  TE_OK && pTerm!=
23d30 30 3b 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65  0; pTerm = where
23d40 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 29  ScanNext(&scan))
23d50 7b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20  {.    int nIn = 
23d60 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
23d70 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
23d80 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74 20 6e  _STAT4.    int n
23d90 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c  RecValid = pBuil
23da0 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a  der->nRecValid;.
23db0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
23dc0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
23dd0 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28  ==WO_ISNULL || (
23de0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 26 54  pTerm->wtFlags&T
23df0 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29 0a 20  ERM_VNULL)!=0). 
23e00 20 20 20 20 26 26 20 28 69 43 6f 6c 3c 30 20 7c      && (iCol<0 |
23e10 7c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43  | pSrc->pTab->aC
23e20 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c  ol[iCol].notNull
23e30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63  ).    ){.      c
23e40 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f  ontinue; /* igno
23e50 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c  re IS [NOT] NULL
23e60 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
23e70 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  NOT NULL columns
23e80 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
23e90 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  ( pTerm->prereqR
23ea0 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73  ight & pNew->mas
23eb0 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65  kSelf ) continue
23ec0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
23ed0 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64  New->nOut==saved
23ee0 5f 6e 4f 75 74 20 29 3b 0a 0a 20 20 20 20 70 4e  _nOut );..    pN
23ef0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61  ew->wsFlags = sa
23f00 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20  ved_wsFlags;.   
23f10 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
23f20 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a  Eq = saved_nEq;.
23f30 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
23f40 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b   = saved_nLTerm;
23f50 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f  .    if( whereLo
23f60 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65  opResize(db, pNe
23f70 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  w, pNew->nLTerm+
23f80 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f  1) ) break; /* O
23f90 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  OM */.    pNew->
23fa0 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
23fb0 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm++] = pTerm;.
23fc0 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
23fd0 20 3d 20 28 73 61 76 65 64 5f 70 72 65 72 65 71   = (saved_prereq
23fe0 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   | pTerm->prereq
23ff0 52 69 67 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e  Right) & ~pNew->
24000 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4e  maskSelf;.    pN
24010 65 77 2d 3e 72 52 75 6e 20 3d 20 72 4c 6f 67 53  ew->rRun = rLogS
24020 69 7a 65 3b 20 2f 2a 20 42 61 73 65 6c 69 6e 65  ize; /* Baseline
24030 20 63 6f 73 74 20 69 73 20 6c 6f 67 32 28 4e 29   cost is log2(N)
24040 2e 20 20 41 64 6a 75 73 74 6d 65 6e 74 73 20 62  .  Adjustments b
24050 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 69 66 28 20  elow */.    if( 
24060 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
24070 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
24080 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
24090 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
240a0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
240b0 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
240c0 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20  N_IN;.      if( 
240d0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
240e0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
240f0 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
24100 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  /* "x IN (SELECT
24110 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a   ...)":  TUNING:
24120 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75   the SELECT retu
24130 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20  rns 25 rows */. 
24140 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b         nIn = 46;
24150 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71    assert( 46==sq
24160 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20  lite3LogEst(25) 
24170 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
24180 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
24190 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70  >x.pList && pExp
241a0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
241b0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
241c0 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76   "x IN (value, v
241d0 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20  alue, ...)" */. 
241e0 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c         nIn = sql
241f0 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78 70 72  ite3LogEst(pExpr
24200 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
24210 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
24220 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e   pNew->rRun += n
24230 49 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  In;.      pNew->
24240 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20  u.btree.nEq++;. 
24250 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
24260 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d  = nRowEst + nInM
24270 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 7d 65  ul + nIn;.    }e
24280 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65  lse if( pTerm->e
24290 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
242a0 51 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  Q) ){.      asse
242b0 72 74 28 0a 20 20 20 20 20 20 20 20 28 70 4e 65  rt(.        (pNe
242c0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  w->wsFlags & (WH
242d0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c  ERE_COLUMN_NULL|
242e0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c  WHERE_COLUMN_IN|
242f0 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 29  WHERE_SKIPSCAN))
24300 21 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c 20 6e  !=0.        || n
24310 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 29  InMul==0.      )
24320 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
24330 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
24340 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20  OLUMN_EQ;.      
24350 69 66 28 20 69 43 6f 6c 3c 30 20 20 0a 20 20 20  if( iCol<0  .   
24360 20 20 20 20 7c 7c 20 28 70 50 72 6f 62 65 2d 3e      || (pProbe->
24370 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
24380 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20   && nInMul==0.  
24390 20 20 20 20 20 20 20 20 20 26 26 20 70 4e 65 77           && pNew
243a0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 70  ->u.btree.nEq==p
243b0 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31  Probe->nKeyCol-1
243c0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
243d0 20 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77     assert( (pNew
243e0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
243f0 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20  E_COLUMN_IN)==0 
24400 7c 7c 20 69 43 6f 6c 3c 30 20 29 3b 0a 20 20 20  || iCol<0 );.   
24410 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
24420 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52  gs |= WHERE_ONER
24430 4f 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OW;.      }.    
24440 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
24450 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65  nEq++;.      pNe
24460 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73  w->nOut = nRowEs
24470 74 20 2b 20 6e 49 6e 4d 75 6c 3b 0a 20 20 20 20  t + nInMul;.    
24480 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d  }else if( pTerm-
24490 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
244a0 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  _ISNULL) ){.    
244b0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
244c0 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
244d0 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 4e 65 77  NULL;.      pNew
244e0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b  ->u.btree.nEq++;
244f0 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  .      /* TUNING
24500 3a 20 49 53 20 4e 55 4c 4c 20 73 65 6c 65 63 74  : IS NULL select
24510 73 20 32 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20  s 2 rows */.    
24520 20 20 6e 49 6e 20 3d 20 31 30 3b 20 20 61 73 73    nIn = 10;  ass
24530 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33  ert( 10==sqlite3
24540 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20  LogEst(2) );.   
24550 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
24560 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c  nRowEst + nInMul
24570 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c 73   + nIn;.    }els
24580 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70  e if( pTerm->eOp
24590 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c  erator & (WO_GT|
245a0 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20  WO_GE) ){.      
245b0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
245c0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
245d0 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
245e0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
245f0 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29  erator & WO_GE )
24600 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
24610 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
24620 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
24630 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
24640 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b     pBtm = pTerm;
24650 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b  .      pTop = 0;
24660 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24670 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
24680 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
24690 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20  _LT|WO_LE) );.  
246a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
246b0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
246c0 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20   WO_LT );.      
246d0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
246e0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
246f0 4c 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  LE );.      pNew
24700 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
24710 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
24720 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
24730 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54  .      pTop = pT
24740 65 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20  erm;.      pBtm 
24750 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  = (pNew->wsFlags
24760 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
24770 49 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20  IT)!=0 ?.       
24780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
24790 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
247a0 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a  >nLTerm-2] : 0;.
247b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4e      }.    if( pN
247c0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
247d0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
247e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a   ){.      /* Adj
247f0 75 73 74 20 6e 4f 75 74 20 61 6e 64 20 72 52 75  ust nOut and rRu
24800 6e 20 66 6f 72 20 53 54 41 54 33 20 72 61 6e 67  n for STAT3 rang
24810 65 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20  e values */.    
24820 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
24830 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74  nOut==saved_nOut
24840 20 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 52   );.      whereR
24850 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61 72  angeScanEst(pPar
24860 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 42  se, pBuilder, pB
24870 74 6d 2c 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b  tm, pTop, pNew);
24880 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
24890 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
248a0 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69  3_OR_STAT4.    i
248b0 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20  f( nInMul==0 .  
248c0 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53     && pProbe->nS
248d0 61 6d 70 6c 65 20 0a 20 20 20 20 20 26 26 20 70  ample .     && p
248e0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
248f0 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c  <=pProbe->nSampl
24900 65 43 6f 6c 0a 20 20 20 20 20 26 26 20 4f 70 74  eCol.     && Opt
24910 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
24920 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74  (db, SQLITE_Stat
24930 33 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  3) .    ){.     
24940 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
24950 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
24960 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20     tRowcnt nOut 
24970 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 28  = 0;.      if( (
24980 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
24990 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e   & (WO_EQ|WO_ISN
249a0 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ULL))!=0 ){.    
249b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
249c0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
249d0 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
249e0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
249f0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
24a00 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
24a10 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71      rc = whereEq
24a20 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73  ualScanEst(pPars
24a30 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78  e, pBuilder, pEx
24a40 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75  pr->pRight, &nOu
24a50 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  t);.      }else 
24a60 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
24a70 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 0a 20  rator & WO_IN). 
24a80 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 20              &&  
24a90 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
24aa0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
24ab0 6c 65 63 74 29 20 20 29 7b 0a 20 20 20 20 20 20  lect)  ){.      
24ac0 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53 63    rc = whereInSc
24ad0 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
24ae0 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 78  uilder, pExpr->x
24af0 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a  .pList, &nOut);.
24b00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
24b10 73 65 72 74 28 20 6e 4f 75 74 3d 3d 30 20 7c 7c  sert( nOut==0 ||
24b20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24b30 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74  ;.      if( nOut
24b40 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
24b50 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ->nOut = sqlite3
24b60 4c 6f 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20 20  LogEst(nOut);.  
24b70 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
24b80 6e 4f 75 74 3e 73 61 76 65 64 5f 6e 4f 75 74 20  nOut>saved_nOut 
24b90 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73  ) pNew->nOut = s
24ba0 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 20  aved_nOut;.     
24bb0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
24bc0 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77      if( (pNew->w
24bd0 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
24be0 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49  IDX_ONLY|WHERE_I
24bf0 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  PK))==0 ){.     
24c00 20 2f 2a 20 45 61 63 68 20 72 6f 77 20 69 6e 76   /* Each row inv
24c10 6f 6c 76 65 73 20 61 20 73 74 65 70 20 6f 66 20  olves a step of 
24c20 74 68 65 20 69 6e 64 65 78 2c 20 74 68 65 6e 20  the index, then 
24c30 61 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  a binary search 
24c40 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
24c50 6d 61 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20  main table */.  
24c60 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
24c70 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41    sqlite3LogEstA
24c80 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 72 4c  dd(pNew->rRun,rL
24c90 6f 67 53 69 7a 65 3e 32 37 20 3f 20 72 4c 6f 67  ogSize>27 ? rLog
24ca0 53 69 7a 65 2d 31 37 20 3a 20 31 30 29 3b 0a 20  Size-17 : 10);. 
24cb0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 53 74 65 70     }.    /* Step
24cc0 20 63 6f 73 74 20 66 6f 72 20 65 61 63 68 20 6f   cost for each o
24cd0 75 74 70 75 74 20 72 6f 77 20 2a 2f 0a 20 20 20  utput row */.   
24ce0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
24cf0 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
24d00 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d  New->rRun, pNew-
24d10 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 77 68 65 72  >nOut);.    wher
24d20 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73  eLoopOutputAdjus
24d30 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c  t(pBuilder->pWC,
24d40 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 63 20 3d   pNew);.    rc =
24d50 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
24d60 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
24d70 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d  ;.    if( (pNew-
24d80 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
24d90 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20  _TOP_LIMIT)==0. 
24da0 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62      && pNew->u.b
24db0 74 72 65 65 2e 6e 45 71 3c 28 70 50 72 6f 62 65  tree.nEq<(pProbe
24dc0 2d 3e 6e 4b 65 79 43 6f 6c 20 2b 20 28 70 50 72  ->nKeyCol + (pPr
24dd0 6f 62 65 2d 3e 7a 4e 61 6d 65 21 3d 30 29 29 0a  obe->zName!=0)).
24de0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65      ){.      whe
24df0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
24e00 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53  dex(pBuilder, pS
24e10 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d  rc, pProbe, nInM
24e20 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20  ul+nIn);.    }. 
24e30 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
24e40 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64  saved_nOut;.#ifd
24e50 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
24e60 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
24e70 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52      pBuilder->nR
24e80 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61  ecValid = nRecVa
24e90 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  lid;.#endif.  }.
24ea0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
24eb0 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20   saved_prereq;. 
24ec0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
24ed0 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a  Eq = saved_nEq;.
24ee0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
24ef0 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53  nSkip = saved_nS
24f00 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46  kip;.  pNew->wsF
24f10 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46  lags = saved_wsF
24f20 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f  lags;.  pNew->nO
24f30 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
24f40 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
24f50 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a  = saved_nLTerm;.
24f60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24f70 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75  /*.** Return Tru
24f80 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
24f90 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78 20  ble that pIndex 
24fa0 6d 69 67 68 74 20 62 65 20 75 73 65 66 75 6c 20  might be useful 
24fb0 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69  in.** implementi
24fc0 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ng the ORDER BY 
24fd0 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64  clause in pBuild
24fe0 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
24ff0 20 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64   False if pBuild
25000 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  er does not cont
25010 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ain an ORDER BY 
25020 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20  clause or.** if 
25030 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
25040 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65  for pIndex to be
25050 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65   useful in imple
25060 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20  menting that.** 
25070 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
25080 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
25090 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
250a0 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72  hOrderBy(.  Wher
250b0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
250c0 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20  uilder,.  Index 
250d0 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69  *pIndex,.  int i
250e0 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72  Cursor.){.  Expr
250f0 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 69 6e 74  List *pOB;.  int
25100 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20   ii, jj;..  if( 
25110 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72  pIndex->bUnorder
25120 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ed ) return 0;. 
25130 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69   if( (pOB = pBui
25140 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f  lder->pWInfo->pO
25150 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65 74  rderBy)==0 ) ret
25160 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d  urn 0;.  for(ii=
25170 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72  0; ii<pOB->nExpr
25180 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  ; ii++){.    Exp
25190 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74  r *pExpr = sqlit
251a0 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
251b0 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78  e(pOB->a[ii].pEx
251c0 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  pr);.    if( pEx
251d0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
251e0 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
251f0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
25200 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a  ble==iCursor ){.
25210 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20        for(jj=0; 
25220 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  jj<pIndex->nKeyC
25230 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  ol; jj++){.     
25240 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
25250 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61  olumn==pIndex->a
25260 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65  iColumn[jj] ) re
25270 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
25280 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
25290 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
252a0 65 74 75 72 6e 20 61 20 62 69 74 6d 61 73 6b 20  eturn a bitmask 
252b0 77 68 65 72 65 20 31 73 20 69 6e 64 69 63 61 74  where 1s indicat
252c0 65 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65  e that the corre
252d0 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20  sponding column 
252e0 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  of.** the table 
252f0 69 73 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e  is used by an in
25300 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66  dex.  Only the f
25310 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20  irst 63 columns 
25320 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a  are considered..
25330 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
25340 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78  k columnsInIndex
25350 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
25360 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a   Bitmask m = 0;.
25370 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a    int j;.  for(j
25380 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31  =pIdx->nColumn-1
25390 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20  ; j>=0; j--){.  
253a0 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e    int x = pIdx->
253b0 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
253c0 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20   if( x>=0 ){.   
253d0 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
253e0 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  BMS-1 );.      t
253f0 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d  estcase( x==BMS-
25400 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78  2 );.      if( x
25410 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41  <BMS-1 ) m |= MA
25420 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d 0a  SKBIT(x);.    }.
25430 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a    }.  return m;.
25440 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  }../* Check to s
25450 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c 20  ee if a partial 
25460 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72 74  index with pPart
25470 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20 62  IndexWhere can b
25480 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65  e used.** in the
25490 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e 20   current query. 
254a0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
254b0 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66 61  it can be and fa
254c0 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  lse if not..*/.s
254d0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 55  tatic int whereU
254e0 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65  sablePartialInde
254f0 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65 72  x(int iTab, Wher
25500 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78  eClause *pWC, Ex
25510 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20 69  pr *pWhere){.  i
25520 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72  nt i;.  WhereTer
25530 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 66 6f 72 28  m *pTerm;.  for(
25540 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  i=0, pTerm=pWC->
25550 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
25560 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
25570 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
25580 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
25590 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 70 57 68  Term->pExpr, pWh
255a0 65 72 65 2c 20 69 54 61 62 29 20 29 20 72 65 74  ere, iTab) ) ret
255b0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
255c0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
255d0 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
255e0 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20  p objects for a 
255f0 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66 20  single table of 
25600 74 68 65 20 6a 6f 69 6e 20 77 68 65 72 65 20 74  the join where t
25610 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69  he table.** is i
25620 64 65 6e 66 69 65 64 20 62 79 20 70 42 75 69 6c  denfied by pBuil
25630 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e  der->pNew->iTab.
25640 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20    That table is 
25650 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
25660 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61 62  .** a b-tree tab
25670 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75 61  le, not a virtua
25680 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  l table..*/.stat
25690 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
256a0 41 64 64 42 74 72 65 65 28 0a 20 20 57 68 65 72  AddBtree(.  Wher
256b0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
256c0 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52 45  uilder, /* WHERE
256d0 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
256e0 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
256f0 20 6d 45 78 74 72 61 20 20 20 20 20 20 20 20 20   mExtra         
25700 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72       /* Extra pr
25710 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72 20  erequesites for 
25720 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65  using this table
25730 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
25740 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
25750 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e       /* WHERE an
25760 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a  alysis context *
25770 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62  /.  Index *pProb
25780 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
25790 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61  /* An index we a
257a0 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f  re evaluating */
257b0 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20  .  Index sPk;   
257c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
257d0 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f  * A fake index o
257e0 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70 72  bject for the pr
257f0 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 74  imary key */.  t
25800 52 6f 77 63 6e 74 20 61 69 52 6f 77 45 73 74 50  Rowcnt aiRowEstP
25810 6b 5b 32 5d 3b 20 20 20 20 20 20 2f 2a 20 54 68  k[2];      /* Th
25820 65 20 61 69 52 6f 77 45 73 74 5b 5d 20 76 61 6c  e aiRowEst[] val
25830 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
25840 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69  ndex */.  i16 ai
25850 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20  ColumnPk = -1;  
25860 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f        /* The aCo
25870 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72  lumn[] value for
25880 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
25890 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
258a0 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
258b0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
258c0 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
258d0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
258e0 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c;  /* The FROM 
258f0 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65 72  clause btree ter
25900 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68  m to add */.  Wh
25910 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
25920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
25930 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20  plate WhereLoop 
25940 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
25950 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
25960 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
25970 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
25980 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20  iSortIdx = 1;   
25990 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
259a0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
259b0 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   b;             
259c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f           /* A bo
259d0 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  olean value */. 
259e0 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20   LogEst rSize;  
259f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25a00 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
25a10 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
25a20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65   LogEst rLogSize
25a30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
25a40 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  Logarithm of the
25a50 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
25a60 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
25a70 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
25a80 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC;           /*
25a90 20 54 68 65 20 70 61 72 73 65 64 20 57 48 45 52   The parsed WHER
25aa0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61  E clause */.  Ta
25ab0 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
25ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
25ad0 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
25ae0 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20   */.  .  pNew = 
25af0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
25b00 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
25b10 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
25b20 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
25b30 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53  ->pTabList;.  pS
25b40 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  rc = pTabList->a
25b50 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20   + pNew->iTab;. 
25b60 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54   pTab = pSrc->pT
25b70 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  ab;.  pWC = pBui
25b80 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73  lder->pWC;.  ass
25b90 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28  ert( !IsVirtual(
25ba0 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a  pSrc->pTab) );..
25bb0 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64    if( pSrc->pInd
25bc0 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20  ex ){.    /* An 
25bd0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
25be0 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61  e specifies a pa
25bf0 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74  rticular index t
25c00 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72  o use */.    pPr
25c10 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64  obe = pSrc->pInd
25c20 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ex;.  }else if( 
25c30 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
25c40 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20  ){.    pProbe = 
25c50 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
25c60 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
25c70 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45  ere is no INDEXE
25c80 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72  D BY clause.  Cr
25c90 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65  eate a fake Inde
25ca0 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61  x object in loca
25cb0 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  l.    ** variabl
25cc0 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65  e sPk to represe
25cd0 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72 69  nt the rowid pri
25ce0 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20  mary key index. 
25cf0 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a   Make this.    *
25d00 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65  * fake index the
25d10 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61 69   first in a chai
25d20 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63  n of Index objec
25d30 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74  ts with all of t
25d40 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69  he real.    ** i
25d50 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77  ndices to follow
25d60 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
25d70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
25d80 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
25d90 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73   of real indices
25da0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   on the table */
25db0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b  .    memset(&sPk
25dc0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65  , 0, sizeof(Inde
25dd0 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b 65  x));.    sPk.nKe
25de0 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73 50  yCol = 1;.    sP
25df0 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69  k.aiColumn = &ai
25e00 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50  ColumnPk;.    sP
25e10 6b 2e 61 69 52 6f 77 45 73 74 20 3d 20 61 69 52  k.aiRowEst = aiR
25e20 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b  owEstPk;.    sPk
25e30 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65  .onError = OE_Re
25e40 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70  place;.    sPk.p
25e50 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20  Table = pTab;.  
25e60 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20    aiRowEstPk[0] 
25e70 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 3b  = pTab->nRowEst;
25e80 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b  .    aiRowEstPk[
25e90 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70 46 69 72  1] = 1;.    pFir
25ea0 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d  st = pSrc->pTab-
25eb0 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  >pIndex;.    if(
25ec0 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65   pSrc->notIndexe
25ed0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  d==0 ){.      /*
25ee0 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65   The real indice
25ef0 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  s of the table a
25f00 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72  re only consider
25f10 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20 20  ed if the.      
25f20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71  ** NOT INDEXED q
25f30 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74  ualifier is omit
25f40 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f  ted from the FRO
25f50 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
25f60 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46    sPk.pNext = pF
25f70 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irst;.    }.    
25f80 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20  pProbe = &sPk;. 
25f90 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 73 71 6c   }.  rSize = sql
25fa0 69 74 65 33 4c 6f 67 45 73 74 28 70 54 61 62 2d  ite3LogEst(pTab-
25fb0 3e 6e 52 6f 77 45 73 74 29 3b 0a 20 20 72 4c 6f  >nRowEst);.  rLo
25fc0 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72  gSize = estLog(r
25fd0 53 69 7a 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20  Size);..#ifndef 
25fe0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
25ff0 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 2f 2a  MATIC_INDEX.  /*
26000 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   Automatic index
26010 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75  es */.  if( !pBu
26020 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 0a 20 20  ilder->pOrSet.  
26030 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61   && (pWInfo->pPa
26040 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
26050 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65   SQLITE_AutoInde
26060 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72 63  x)!=0.   && pSrc
26070 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 26  ->pIndex==0.   &
26080 26 20 21 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f  & !pSrc->viaCoro
26090 75 74 69 6e 65 0a 20 20 20 26 26 20 21 70 53 72  utine.   && !pSr
260a0 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a 20 20  c->notIndexed.  
260b0 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 54 61   && HasRowid(pTa
260c0 62 29 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  b).   && !pSrc->
260d0 69 73 43 6f 72 72 65 6c 61 74 65 64 0a 20 20 20  isCorrelated.   
260e0 26 26 20 21 70 53 72 63 2d 3e 69 73 52 65 63 75  && !pSrc->isRecu
260f0 72 73 69 76 65 0a 20 20 29 7b 0a 20 20 20 20 2f  rsive.  ){.    /
26100 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f 2d  * Generate auto-
26110 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70 73  index WhereLoops
26120 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
26130 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57 68  m *pTerm;.    Wh
26140 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 20  ereTerm *pWCEnd 
26150 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e  = pWC->a + pWC->
26160 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70  nTerm;.    for(p
26170 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d  Term=pWC->a; rc=
26180 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54  =SQLITE_OK && pT
26190 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72  erm<pWCEnd; pTer
261a0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
261b0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
261c0 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  ht & pNew->maskS
261d0 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  elf ) continue;.
261e0 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 43 61        if( termCa
261f0 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
26200 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a 20  m, pSrc, 0) ){. 
26210 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
26220 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20  tree.nEq = 1;.  
26230 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
26240 72 65 65 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20  ree.nSkip = 0;. 
26250 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
26260 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
26270 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
26280 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
26290 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
262a0 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
262b0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f      /* TUNING: O
262c0 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72  ne-time cost for
262d0 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61   computing the a
262e0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
262f0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70  s.        ** app
26300 72 6f 78 69 6d 61 74 65 6c 79 20 37 2a 4e 2a 6c  roximately 7*N*l
26310 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69  og2(N) where N i
26320 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
26330 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20  rows in.        
26340 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
26350 6e 67 20 69 6e 64 65 78 65 64 2e 20 2a 2f 0a 20  ng indexed. */. 
26360 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65         pNew->rSe
26370 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b  tup = rLogSize +
26380 20 72 53 69 7a 65 20 2b 20 32 38 3b 20 20 61 73   rSize + 28;  as
26390 73 65 72 74 28 20 32 38 3d 3d 73 71 6c 69 74 65  sert( 28==sqlite
263a0 33 4c 6f 67 45 73 74 28 37 29 20 29 3b 0a 20 20  3LogEst(7) );.  
263b0 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
263c0 20 45 61 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b   Each index look
263d0 75 70 20 79 69 65 6c 64 73 20 32 30 20 72 6f 77  up yields 20 row
263e0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  s in the table. 
263f0 20 54 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   This.        **
26400 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 74 68   is more than th
26410 65 20 75 73 75 61 6c 20 67 75 65 73 73 20 6f 66  e usual guess of
26420 20 31 30 20 72 6f 77 73 2c 20 73 69 6e 63 65 20   10 rows, since 
26430 77 65 20 68 61 76 65 20 6e 6f 20 77 61 79 0a 20  we have no way. 
26440 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f         ** of kno
26450 77 6e 69 6e 67 20 68 6f 77 20 73 65 6c 65 63 74  wning how select
26460 69 76 65 20 74 68 65 20 69 6e 64 65 78 20 77 69  ive the index wi
26470 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65  ll ultimately be
26480 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20 20 20 20  .  It would.    
26490 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e      ** not be un
264a0 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61  reasonable to ma
264b0 6b 65 20 74 68 69 73 20 76 61 6c 75 65 20 6d 75  ke this value mu
264c0 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20  ch larger. */.  
264d0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
264e0 20 3d 20 34 33 3b 20 20 61 73 73 65 72 74 28 20   = 43;  assert( 
264f0 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  43==sqlite3LogEs
26500 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20 20  t(20) );.       
26510 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
26520 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72  lite3LogEstAdd(r
26530 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f  LogSize,pNew->nO
26540 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ut);.        pNe
26550 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
26560 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20  RE_AUTO_INDEX;. 
26570 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65         pNew->pre
26580 72 65 71 20 3d 20 6d 45 78 74 72 61 20 7c 20 70  req = mExtra | p
26590 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
265a0 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
265b0 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
265c0 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
265d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
265e0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
265f0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
26600 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f  IC_INDEX */..  /
26610 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  * Loop over all 
26620 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66  indices.  */.  f
26630 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  or(; rc==SQLITE_
26640 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20 70 50  OK && pProbe; pP
26650 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65  robe=pProbe->pNe
26660 78 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b  xt, iSortIdx++){
26670 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d  .    if( pProbe-
26680 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d  >pPartIdxWhere!=
26690 30 0a 20 20 20 20 20 26 26 20 21 77 68 65 72 65  0.     && !where
266a0 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
266b0 65 78 28 70 4e 65 77 2d 3e 69 54 61 62 2c 20 70  ex(pNew->iTab, p
266c0 57 43 2c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72  WC, pProbe->pPar
266d0 74 49 64 78 57 68 65 72 65 29 20 29 7b 0a 20 20  tIdxWhere) ){.  
266e0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
266f0 2a 20 50 61 72 74 69 61 6c 20 69 6e 64 65 78 20  * Partial index 
26700 69 6e 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  inappropriate fo
26710 72 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  r this query */.
26720 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e      }.    pNew->
26730 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b  u.btree.nEq = 0;
26740 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
26750 65 65 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20  ee.nSkip = 0;.  
26760 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
26770 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53   0;.    pNew->iS
26780 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  ortIdx = 0;.    
26790 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
267a0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
267b0 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20  eq = mExtra;.   
267c0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
267d0 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ize;.    pNew->u
267e0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
267f0 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20  pProbe;.    b = 
26800 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69  indexMightHelpWi
26810 74 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64  thOrderBy(pBuild
26820 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63  er, pProbe, pSrc
26830 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
26840 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44  /* The ONEPASS_D
26850 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76  ESIRED flags nev
26860 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68  er occurs togeth
26870 65 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59  er with ORDER BY
26880 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
26890 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
268a0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
268b0 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
268c0 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69  || b==0 );.    i
268d0 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c  f( pProbe->tnum<
268e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
268f0 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b  nteger primary k
26900 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ey index */.    
26910 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
26920 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20  = WHERE_IPK;..  
26930 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c      /* Full tabl
26940 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20  e scan */.      
26950 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
26960 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20   b ? iSortIdx : 
26970 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  0;.      /* TUNI
26980 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c  NG: Cost of full
26990 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 33   table scan is 3
269a0 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a  *(N + log2(N))..
269b0 20 20 20 20 20 20 2a 2a 20 20 2b 20 20 54 68 65        **  +  The
269c0 20 65 78 74 72 61 20 33 20 66 61 63 74 6f 72 20   extra 3 factor 
269d0 69 73 20 74 6f 20 65 6e 63 6f 75 72 61 67 65 20  is to encourage 
269e0 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64 65 78  the use of index
269f0 65 64 20 6c 6f 6f 6b 75 70 73 0a 20 20 20 20 20  ed lookups.     
26a00 20 2a 2a 20 20 20 20 20 6f 76 65 72 20 66 75 6c   **     over ful
26a10 6c 20 73 63 61 6e 73 2e 20 20 46 49 58 4d 45 20  l scans.  FIXME 
26a20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  */.      pNew->r
26a30 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
26a40 45 73 74 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f  EstAdd(rSize,rLo
26a50 67 53 69 7a 65 29 20 2b 20 31 36 3b 0a 20 20 20  gSize) + 16;.   
26a60 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70     whereLoopOutp
26a70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e  utAdjust(pWC, pN
26a80 65 77 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ew);.      rc = 
26a90 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
26aa0 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
26ab0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
26ac0 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20  t = rSize;.     
26ad0 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
26ae0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26af0 20 20 42 69 74 6d 61 73 6b 20 6d 3b 0a 20 20 20    Bitmask m;.   
26b00 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 69     if( pProbe->i
26b10 73 43 6f 76 65 72 69 6e 67 20 29 7b 0a 20 20 20  sCovering ){.   
26b20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
26b30 67 73 20 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs = WHERE_IDX_O
26b40 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45  NLY | WHERE_INDE
26b50 58 45 44 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d  XED;.        m =
26b60 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
26b70 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 70 53 72  .        m = pSr
26b80 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f  c->colUsed & ~co
26b90 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50 72  lumnsInIndex(pPr
26ba0 6f 62 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  obe);.        pN
26bb0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d  ew->wsFlags = (m
26bc0 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44  ==0) ? (WHERE_ID
26bd0 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44  X_ONLY|WHERE_IND
26be0 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e  EXED) : WHERE_IN
26bf0 44 45 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a  DEXED;.      }..
26c00 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63        /* Full sc
26c10 61 6e 20 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a  an via index */.
26c20 20 20 20 20 20 20 69 66 28 20 62 0a 20 20 20 20        if( b.    
26c30 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28     || !HasRowid(
26c40 70 54 61 62 29 0a 20 20 20 20 20 20 20 7c 7c 20  pTab).       || 
26c50 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ( m==0.         
26c60 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72  && pProbe->bUnor
26c70 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  dered==0.       
26c80 20 20 26 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a    && (pProbe->sz
26c90 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54  IdxRow<pTab->szT
26ca0 61 62 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20  abRow).         
26cb0 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
26cc0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
26cd0 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
26ce0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 73  =0.         && s
26cf0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
26d00 69 67 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20  ig.bUseCis.     
26d10 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
26d20 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e 66  ionEnabled(pWInf
26d30 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  o->pParse->db, S
26d40 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63  QLITE_CoverIdxSc
26d50 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20 29 0a  an).          ).
26d60 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
26d70 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
26d80 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a  = b ? iSortIdx :
26d90 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
26da0 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
26db0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
26dc0 74 20 6f 66 20 61 20 63 6f 76 65 72 69 6e 67 20  t of a covering 
26dd0 69 6e 64 65 78 20 73 63 61 6e 20 69 73 20 4b 2a  index scan is K*
26de0 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20  (N + log2(N)).. 
26df0 20 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 20           **  +  
26e00 54 68 65 20 65 78 74 72 61 20 66 61 63 74 6f 72  The extra factor
26e10 20 4b 20 6f 66 20 62 65 74 77 65 65 6e 20 31 2e   K of between 1.
26e20 31 20 61 6e 64 20 33 2e 30 20 74 68 61 74 20 64  1 and 3.0 that d
26e30 65 70 65 6e 64 73 0a 20 20 20 20 20 20 20 20 20  epends.         
26e40 20 2a 2a 20 20 20 20 20 6f 6e 20 74 68 65 20 72   **     on the r
26e50 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66  elative sizes of
26e60 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74   the table and t
26e70 68 65 20 69 6e 64 65 78 2e 20 20 4b 0a 20 20 20  he index.  K.   
26e80 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 73         **     is
26e90 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 73 6d 61   smaller for sma
26ea0 6c 6c 65 72 20 69 6e 64 69 63 65 73 2c 20 74 68  ller indices, th
26eb0 75 73 20 66 61 76 6f 72 69 6e 67 20 74 68 65 6d  us favoring them
26ec0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
26ed0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72           pNew->r
26ee0 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
26ef0 45 73 74 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f  EstAdd(rSize,rLo
26f00 67 53 69 7a 65 29 20 2b 20 31 20 2b 0a 20 20 20  gSize) + 1 +.   
26f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f20 20 20 20 20 20 28 31 35 2a 70 50 72 6f 62 65 2d       (15*pProbe-
26f30 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54 61 62 2d  >szIdxRow)/pTab-
26f40 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 20  >szTabRow;.     
26f50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26f60 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
26f70 6f 73 74 20 6f 66 20 73 63 61 6e 6e 69 6e 67 20  ost of scanning 
26f80 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  a non-covering i
26f90 6e 64 65 78 20 69 73 20 28 4e 2b 31 29 2a 6c 6f  ndex is (N+1)*lo
26fa0 67 32 28 4e 29 0a 20 20 20 20 20 20 20 20 20 20  g2(N).          
26fb0 2a 2a 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c  ** which we will
26fc0 20 73 69 6d 70 6c 69 66 79 20 74 6f 20 6a 75 73   simplify to jus
26fd0 74 20 4e 2a 6c 6f 67 32 28 4e 29 20 2a 2f 0a 20  t N*log2(N) */. 
26fe0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72           pNew->r
26ff0 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 72 4c  Run = rSize + rL
27000 6f 67 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ogSize;.        
27010 7d 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  }.        whereL
27020 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
27030 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  pWC, pNew);.    
27040 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
27050 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
27060 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
27070 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
27080 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
27090 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
270a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
270b0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
270c0 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
270d0 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
270e0 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64 65 66 20  obe, 0);.#ifdef 
270f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
27100 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
27110 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
27120 62 65 46 72 65 65 28 70 42 75 69 6c 64 65 72 2d  beFree(pBuilder-
27130 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75 69  >pRec);.    pBui
27140 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
27150 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64 65  = 0;.    pBuilde
27160 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e  r->pRec = 0;.#en
27170 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  dif..    /* If t
27180 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45  here was an INDE
27190 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74  XED BY clause, t
271a0 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e  hen only that on
271b0 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a  e index is.    *
271c0 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f  * considered. */
271d0 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70  .    if( pSrc->p
271e0 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 20  Index ) break;. 
271f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
27200 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
27210 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
27220 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c  BLE./*.** Add al
27230 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  l WhereLoop obje
27240 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20  cts for a table 
27250 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e  of the join iden
27260 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75  tified by.** pBu
27270 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61  ilder->pNew->iTa
27280 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69  b.  That table i
27290 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
272a0 62 65 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  be a virtual tab
272b0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
272c0 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  t whereLoopAddVi
272d0 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f  rtual(.  WhereLo
272e0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
272f0 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20 63  der,  /* WHERE c
27300 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f  lause informatio
27310 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d  n */.  Bitmask m
27320 45 78 74 72 61 0a 29 7b 0a 20 20 57 68 65 72 65  Extra.){.  Where
27330 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
27340 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
27350 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78   analysis contex
27360 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  t */.  Parse *pP
27370 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
27380 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
27390 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
273a0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
273b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
273c0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
273d0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
273e0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b  List_item *pSrc;
273f0 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
27400 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
27410 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20  arch */.  Table 
27420 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
27430 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f   *db;.  sqlite3_
27440 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
27450 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73  Info;.  struct s
27460 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
27470 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e  straint *pIdxCon
27480 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  s;.  struct sqli
27490 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
274a0 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
274b0 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ge;.  WhereTerm 
274c0 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pTerm;.  int i,
274d0 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c   j;.  int iTerm,
274e0 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e   mxTerm;.  int n
274f0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e  Constraint;.  in
27500 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20  t seenIn = 0;   
27510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
27520 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70 65 72  ue if an IN oper
27530 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a  ator is seen */.
27540 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20 3d 20    int seenVar = 
27550 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
27560 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d  * True if a non-
27570 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72 61  constant constra
27580 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  int is seen */. 
27590 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20 20 20   int iPhase;    
275a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
275b0 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e   0: const w/o IN
275c0 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e  , 1: const, 2: n
275d0 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a  o IN,  2: IN */.
275e0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
275f0 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  w;.  int rc = SQ
27600 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e  LITE_OK;..  pWIn
27610 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
27620 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20  WInfo;.  pParse 
27630 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
27640 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
27650 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75  >db;.  pWC = pBu
27660 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e  ilder->pWC;.  pN
27670 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
27680 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70  New;.  pSrc = &p
27690 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
276a0 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a  >a[pNew->iTab];.
276b0 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70    pTab = pSrc->p
276c0 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 49  Tab;.  assert( I
276d0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
276e0 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 61  ;.  pIdxInfo = a
276f0 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
27700 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53  (pParse, pWC, pS
27710 72 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  rc, pBuilder->pO
27720 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70  rderBy);.  if( p
27730 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74  IdxInfo==0 ) ret
27740 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
27750 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  ;.  pNew->prereq
27760 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53   = 0;.  pNew->rS
27770 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77  etup = 0;.  pNew
27780 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
27790 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a  E_VIRTUALTABLE;.
277a0 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
277b0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74   0;.  pNew->u.vt
277c0 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
277d0 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64 78  .  pUsage = pIdx
277e0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
277f0 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73 74  tUsage;.  nConst
27800 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f  raint = pIdxInfo
27810 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->nConstraint;. 
27820 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
27830 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 6e  size(db, pNew, n
27840 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a 20  Constraint) ){. 
27850 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
27860 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  (db, pIdxInfo);.
27870 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27880 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
27890 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20 69 50  for(iPhase=0; iP
278a0 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73 65 2b  hase<=3; iPhase+
278b0 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 65 65  +){.    if( !see
278c0 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65 26 31  nIn && (iPhase&1
278d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50  )!=0 ){.      iP
278e0 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  hase++;.      if
278f0 28 20 69 50 68 61 73 65 3e 33 20 29 20 62 72 65  ( iPhase>3 ) bre
27900 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
27910 28 20 21 73 65 65 6e 56 61 72 20 26 26 20 69 50  ( !seenVar && iP
27920 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b 3b 0a  hase>1 ) break;.
27930 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a      pIdxCons = *
27940 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
27950 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
27960 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
27970 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66  onstraint;.    f
27980 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e  or(i=0; i<pIdxIn
27990 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
279a0 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
279b0 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 49 64  ){.      j = pId
279c0 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
279d0 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  et;.      pTerm 
279e0 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20  = &pWC->a[j];.  
279f0 20 20 20 20 73 77 69 74 63 68 28 20 69 50 68 61      switch( iPha
27a00 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  se ){.        ca
27a10 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e 73  se 0:    /* Cons
27a20 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20 49 4e  tants without IN
27a30 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
27a40 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
27a50 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  >usable = 0;.   
27a60 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
27a70 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
27a80 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20  O_IN)!=0 ){.    
27a90 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e 20 3d          seenIn =
27aa0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
27ab0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
27ac0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
27ad0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
27ae0 20 20 20 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a     seenVar = 1;.
27af0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
27b00 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
27b10 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d  rator & WO_IN)==
27b20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
27b30 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
27b40 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
27b50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
27b60 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
27b70 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61   1:    /* Consta
27b80 6e 74 73 20 77 69 74 68 20 49 4e 20 6f 70 65 72  nts with IN oper
27b90 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20  ators */.       
27ba0 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 49     assert( seenI
27bb0 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  n );.          p
27bc0 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
27bd0 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  = (pTerm->prereq
27be0 52 69 67 68 74 3d 3d 30 29 3b 0a 20 20 20 20 20  Right==0);.     
27bf0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27c00 20 20 20 20 63 61 73 65 20 32 3a 20 20 20 20 2f      case 2:    /
27c10 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68  * Variables with
27c20 6f 75 74 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20  out IN */.      
27c30 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e      assert( seen
27c40 56 61 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Var );.         
27c50 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
27c60 65 20 3d 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  e = (pTerm->eOpe
27c70 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d  rator & WO_IN)==
27c80 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
27c90 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61  ak;.        defa
27ca0 75 6c 74 3a 20 20 20 2f 2a 20 56 61 72 69 61 62  ult:   /* Variab
27cb0 6c 65 73 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20  les with IN */. 
27cc0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
27cd0 20 73 65 65 6e 56 61 72 20 26 26 20 73 65 65 6e   seenVar && seen
27ce0 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  In );.          
27cf0 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
27d00 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
27d10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
27d20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
27d30 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f  pUsage, 0, sizeo
27d40 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64  f(pUsage[0])*pId
27d50 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
27d60 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  nt);.    if( pId
27d70 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
27d80 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65  eIdxStr ) sqlite
27d90 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
27da0 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70 49  >idxStr);.    pI
27db0 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d  dxInfo->idxStr =
27dc0 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
27dd0 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20  ->idxNum = 0;.  
27de0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64    pIdxInfo->need
27df0 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30  ToFreeIdxStr = 0
27e00 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
27e10 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
27e20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
27e30 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
27e40 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42   = SQLITE_BIG_DB
27e50 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20  L / (double)2;. 
27e60 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
27e70 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 35 3b  imatedRows = 25;
27e80 0a 20 20 20 20 72 63 20 3d 20 76 74 61 62 42 65  .    rc = vtabBe
27e90 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  stIndex(pParse, 
27ea0 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  pTab, pIdxInfo);
27eb0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
27ec0 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  to whereLoopAddV
27ed0 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 70 49  tab_exit;.    pI
27ee0 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63  dxCons = *(struc
27ef0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
27f00 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
27f10 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
27f20 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  int;.    pNew->p
27f30 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a  rereq = mExtra;.
27f40 20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b      mxTerm = -1;
27f50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
27f60 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73  w->nLSlot>=nCons
27f70 74 72 61 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f  traint );.    fo
27f80 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72  r(i=0; i<nConstr
27f90 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d  aint; i++) pNew-
27fa0 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a  >aLTerm[i] = 0;.
27fb0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
27fc0 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20  .omitMask = 0;. 
27fd0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
27fe0 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20  onstraint; i++, 
27ff0 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20  pIdxCons++){.   
28000 20 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20     if( (iTerm = 
28010 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  pUsage[i].argvIn
28020 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20  dex - 1)>=0 ){. 
28030 20 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43         j = pIdxC
28040 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74  ons->iTermOffset
28050 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54  ;.        if( iT
28060 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  erm>=nConstraint
28070 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30  .         || j<0
28080 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d  .         || j>=
28090 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20  pWC->nTerm.     
280a0 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54      || pNew->aLT
280b0 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20  erm[iTerm]!=0.  
280c0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
280d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
280e0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
280f0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
28100 70 50 61 72 73 65 2c 20 22 25 73 2e 78 42 65 73  pParse, "%s.xBes
28110 74 49 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e 63  tIndex() malfunc
28120 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  tion", pTab->zNa
28130 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
28140 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  oto whereLoopAdd
28150 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 20  Vtab_exit;.     
28160 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73     }.        tes
28170 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43  tcase( iTerm==nC
28180 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20  onstraint-1 );. 
28190 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
281a0 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   j==0 );.       
281b0 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57   testcase( j==pW
281c0 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20  C->nTerm-1 );.  
281d0 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
281e0 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20  WC->a[j];.      
281f0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c    pNew->prereq |
28200 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  = pTerm->prereqR
28210 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
28220 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77  sert( iTerm<pNew
28230 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20  ->nLSlot );.    
28240 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
28250 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b  [iTerm] = pTerm;
28260 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65  .        if( iTe
28270 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65  rm>mxTerm ) mxTe
28280 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20  rm = iTerm;.    
28290 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
282a0 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20  erm==15 );.     
282b0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
282c0 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20  rm==16 );.      
282d0 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26    if( iTerm<16 &
282e0 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74  & pUsage[i].omit
282f0 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e   ) pNew->u.vtab.
28300 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69  omitMask |= 1<<i
28310 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
28320 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
28330 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20  tor & WO_IN)!=0 
28340 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
28350 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d   pUsage[i].omit=
28360 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
28370 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    /* Do not atte
28380 6d 70 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e  mpt to use an IN
28390 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74   constraint if t
283a0 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
283b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
283c0 73 61 79 73 20 74 68 61 74 20 74 68 65 20 65 71  says that the eq
283d0 75 69 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73  uivalent EQ cons
283e0 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65  traint cannot be
283f0 20 73 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e   safely omitted.
28400 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
28410 49 66 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74  If we do attempt
28420 20 74 6f 20 75 73 65 20 73 75 63 68 20 61 20 63   to use such a c
28430 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20  onstraint, some 
28440 72 6f 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20  rows might be.  
28450 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70            ** rep
28460 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74  eated in the out
28470 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  put. */.        
28480 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
28490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
284a0 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61   /* A virtual ta
284b0 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73  ble that is cons
284c0 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e  trained by an IN
284d0 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a   clause may not.
284e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
284f0 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42  sume the ORDER B
28500 59 20 63 6c 61 75 73 65 20 62 65 63 61 75 73 65  Y clause because
28510 20 28 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f   (1) the order o
28520 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20  f IN terms.     
28530 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e       ** is not n
28540 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74  ecessarily relat
28550 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20  ed to the order 
28560 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20  of output terms 
28570 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
28580 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75   (2) Multiple ou
28590 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e  tputs from a sin
285a0 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c  gle IN value wil
285b0 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20  l not merge.    
285c0 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65        ** togethe
285d0 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  r.  */.         
285e0 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
285f0 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a  ByConsumed = 0;.
28600 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28610 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
28620 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29  i>=nConstraint )
28630 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  {.      pNew->nL
28640 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b  Term = mxTerm+1;
28650 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
28660 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65  New->nLTerm<=pNe
28670 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20  w->nLSlot );.   
28680 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
28690 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66  idxNum = pIdxInf
286a0 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20  o->idxNum;.     
286b0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
286c0 65 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66  edFree = pIdxInf
286d0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
286e0 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49  Str;.      pIdxI
286f0 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
28700 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20  dxStr = 0;.     
28710 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
28720 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xStr = pIdxInfo-
28730 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70  >idxStr;.      p
28740 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72  New->u.vtab.isOr
28750 64 65 72 65 64 20 3d 20 28 75 38 29 28 28 70 49  dered = (u8)((pI
28760 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
28770 21 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  !=0).           
28780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28790 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64            && pId
287a0 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
287b0 6e 73 75 6d 65 64 29 3b 0a 20 20 20 20 20 20 70  nsumed);.      p
287c0 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
287d0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
287e0 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
287f0 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78  tFromDouble(pIdx
28800 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
28810 6f 73 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ost);.      pNew
28820 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ->nOut = sqlite3
28830 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f 2d  LogEst(pIdxInfo-
28840 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b  >estimatedRows);
28850 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
28860 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
28870 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66   pNew);.      if
28880 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e  ( pNew->u.vtab.n
28890 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20  eedFree ){.     
288a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
288b0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
288c0 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  Str);.        pN
288d0 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
288e0 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ree = 0;.      }
288f0 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a 77 68  .    }.  }  ..wh
28900 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65  ereLoopAddVtab_e
28910 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64 78 49  xit:.  if( pIdxI
28920 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
28930 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f  dxStr ) sqlite3_
28940 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69  free(pIdxInfo->i
28950 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  dxStr);.  sqlite
28960 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78  3DbFree(db, pIdx
28970 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20  Info);.  return 
28980 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
28990 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
289a0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
289b0 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70  ** Add WhereLoop
289c0 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64   entries to hand
289d0 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68  le OR terms.  Th
289e0 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74  is works for eit
289f0 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72  her.** btrees or
28a00 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
28a10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
28a20 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 57 68  hereLoopAddOr(Wh
28a30 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
28a40 70 42 75 69 6c 64 65 72 2c 20 42 69 74 6d 61 73  pBuilder, Bitmas
28a50 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20 57 68 65  k mExtra){.  Whe
28a60 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
28a70 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
28a80 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  o;.  WhereClause
28a90 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f   *pWC;.  WhereLo
28aa0 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72  op *pNew;.  Wher
28ab0 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70  eTerm *pTerm, *p
28ac0 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20  WCEnd;.  int rc 
28ad0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
28ae0 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65  nt iCur;.  Where
28af0 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20  Clause tempWC;. 
28b00 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
28b10 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57  r sSubBuild;.  W
28b20 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20  hereOrSet sSum, 
28b30 73 43 75 72 2c 20 73 50 72 65 76 3b 0a 20 20 73  sCur, sPrev;.  s
28b40 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
28b50 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20  em *pItem;.  .  
28b60 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
28b70 70 57 43 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  pWC;.  if( pWInf
28b80 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
28b90 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 29  WHERE_AND_ONLY )
28ba0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28bb0 4b 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57  K;.  pWCEnd = pW
28bc0 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72  C->a + pWC->nTer
28bd0 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  m;.  pNew = pBui
28be0 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65  lder->pNew;.  me
28bf0 6d 73 65 74 28 26 73 53 75 6d 2c 20 30 2c 20 73  mset(&sSum, 0, s
28c00 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20  izeof(sSum));.  
28c10 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
28c20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e  pTabList->a + pN
28c30 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69 66 28 20  ew->iTab;.  if( 
28c40 21 48 61 73 52 6f 77 69 64 28 70 49 74 65 6d 2d  !HasRowid(pItem-
28c50 3e 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  >pTab) ) return 
28c60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 43 75  SQLITE_OK;.  iCu
28c70 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  r = pItem->iCurs
28c80 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d  or;..  for(pTerm
28c90 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
28ca0 57 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c  WCEnd && rc==SQL
28cb0 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29  ITE_OK; pTerm++)
28cc0 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  {.    if( (pTerm
28cd0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
28ce0 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20  _OR)!=0.     && 
28cf0 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  (pTerm->u.pOrInf
28d00 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70  o->indexable & p
28d10 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d  New->maskSelf)!=
28d20 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
28d30 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f  WhereClause * co
28d40 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65  nst pOrWC = &pTe
28d50 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
28d60 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  c;.      WhereTe
28d70 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43  rm * const pOrWC
28d80 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b  End = &pOrWC->a[
28d90 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  pOrWC->nTerm];. 
28da0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
28db0 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  pOrTerm;.      i
28dc0 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20  nt once = 1;.   
28dd0 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
28de0 20 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c   .      sSubBuil
28df0 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20  d = *pBuilder;. 
28e00 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
28e10 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
28e20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72     sSubBuild.pOr
28e30 53 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20  Set = &sCur;..  
28e40 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d      for(pOrTerm=
28e50 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72  pOrWC->a; pOrTer
28e60 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54  m<pOrWCEnd; pOrT
28e70 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
28e80 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f  if( (pOrTerm->eO
28e90 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44  perator & WO_AND
28ea0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
28eb0 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20    sSubBuild.pWC 
28ec0 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41  = &pOrTerm->u.pA
28ed0 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  ndInfo->wc;.    
28ee0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
28ef0 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
28f00 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20  r==iCur ){.     
28f10 20 20 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e       tempWC.pWIn
28f20 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  fo = pWC->pWInfo
28f30 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
28f40 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b  WC.pOuter = pWC;
28f50 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
28f60 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  C.op = TK_AND;. 
28f70 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
28f80 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  nTerm = 1;.     
28f90 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20       tempWC.a = 
28fa0 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  pOrTerm;.       
28fb0 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43     sSubBuild.pWC
28fc0 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20   = &tempWC;.    
28fd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28fe0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
28ff0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29000 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66   sCur.n = 0;.#if
29010 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
29020 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
29030 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74        if( IsVirt
29040 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29  ual(pItem->pTab)
29050 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
29060 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
29070 69 72 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c  irtual(&sSubBuil
29080 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20  d, mExtra);.    
29090 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
290a0 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
290b0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
290c0 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73 53 75  oopAddBtree(&sSu
290d0 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b  bBuild, mExtra);
290e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
290f0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
29100 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72  QLITE_OK || sCur
29110 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  .n==0 );.       
29120 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29   if( sCur.n==0 )
29130 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d  {.          sSum
29140 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
29150 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
29160 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65 20   }else if( once 
29170 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65  ){.          whe
29180 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20  reOrMove(&sSum, 
29190 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20  &sCur);.        
291a0 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20    once = 0;.    
291b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
291c0 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65       whereOrMove
291d0 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b  (&sPrev, &sSum);
291e0 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e  .          sSum.
291f0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
29200 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65   for(i=0; i<sPre
29210 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  v.n; i++){.     
29220 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
29230 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a  j<sCur.n; j++){.
29240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
29250 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75  ereOrInsert(&sSu
29260 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72  m, sPrev.a[i].pr
29270 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d  ereq | sCur.a[j]
29280 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20  .prereq,.       
29290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292a0 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45       sqlite3LogE
292b0 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d  stAdd(sPrev.a[i]
292c0 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d  .rRun, sCur.a[j]
292d0 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20  .rRun),.        
292e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292f0 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73      sqlite3LogEs
29300 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e  tAdd(sPrev.a[i].
29310 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e  nOut, sCur.a[j].
29320 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20  nOut));.        
29330 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29340 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
29350 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e    }.      pNew->
29360 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
29370 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30    pNew->aLTerm[0
29380 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
29390 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
293a0 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b   WHERE_MULTI_OR;
293b0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65  .      pNew->rSe
293c0 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tup = 0;.      p
293d0 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
293e0 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  0;.      memset(
293f0 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a  &pNew->u, 0, siz
29400 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20  eof(pNew->u));. 
29410 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63       for(i=0; rc
29420 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
29430 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20  <sSum.n; i++){. 
29440 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
29450 3a 20 4d 75 6c 74 69 70 6c 65 20 62 79 20 33 2e  : Multiple by 3.
29460 35 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  5 for the second
29470 61 72 79 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70  ary table lookup
29480 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
29490 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b  ->rRun = sSum.a[
294a0 69 5d 2e 72 52 75 6e 20 2b 20 31 38 3b 0a 20 20  i].rRun + 18;.  
294b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
294c0 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75   = sSum.a[i].nOu
294d0 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  t;.        pNew-
294e0 3e 70 72 65 72 65 71 20 3d 20 73 53 75 6d 2e 61  >prereq = sSum.a
294f0 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20 20 20  [i].prereq;.    
29500 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
29510 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
29520 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
29530 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
29540 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
29550 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
29560 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
29570 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73  all tables .*/.s
29580 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
29590 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c  oopAddAll(WhereL
295a0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
295b0 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e  lder){.  WhereIn
295c0 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
295d0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
295e0 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20   Bitmask mExtra 
295f0 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  = 0;.  Bitmask m
29600 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74  Prior = 0;.  int
29610 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74   iTab;.  SrcList
29620 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
29630 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
29640 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
29650 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
29660 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
29670 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
29680 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 20  .  int nTabList 
29690 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
296a0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
296b0 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 70 72 69  ITE_OK;.  u8 pri
296c0 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 30 3b 0a  orJoinType = 0;.
296d0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
296e0 77 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76  w;..  /* Loop ov
296f0 65 72 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  er the tables in
29700 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20   the join, from 
29710 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f  left to right */
29720 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
29730 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72  er->pNew;.  wher
29740 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b  eLoopInit(pNew);
29750 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c 20 70  .  for(iTab=0, p
29760 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  Item=pTabList->a
29770 3b 20 69 54 61 62 3c 6e 54 61 62 4c 69 73 74 3b  ; iTab<nTabList;
29780 20 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b   iTab++, pItem++
29790 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61  ){.    pNew->iTa
297a0 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e  b = iTab;.    pN
297b0 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67  ew->maskSelf = g
297c0 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
297d0 73 4d 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d  sMaskSet, pItem-
297e0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69  >iCursor);.    i
297f0 66 28 20 28 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e  f( ((pItem->join
29800 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 54 79  type|priorJoinTy
29810 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  pe) & (JT_LEFT|J
29820 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a  T_CROSS))!=0 ){.
29830 20 20 20 20 20 20 6d 45 78 74 72 61 20 3d 20 6d        mExtra = m
29840 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Prior;.    }.   
29850 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d   priorJoinType =
29860 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65   pItem->jointype
29870 3b 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74  ;.    if( IsVirt
29880 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29  ual(pItem->pTab)
29890 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
298a0 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
298b0 61 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78  al(pBuilder, mEx
298c0 74 72 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tra);.    }else{
298d0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
298e0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42  eLoopAddBtree(pB
298f0 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b  uilder, mExtra);
29900 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
29910 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29920 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
29930 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64  LoopAddOr(pBuild
29940 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  er, mExtra);.   
29950 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d   }.    mPrior |=
29960 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b   pNew->maskSelf;
29970 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64  .    if( rc || d
29980 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
29990 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77  ) break;.  }.  w
299a0 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62  hereLoopClear(db
299b0 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
299c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
299d0 78 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61  xamine a WherePa
299e0 74 68 20 28 77 69 74 68 20 74 68 65 20 61 64 64  th (with the add
299f0 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74  ition of the ext
29a00 72 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20  ra WhereLoop of 
29a10 74 68 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d  the 5th.** param
29a20 65 74 65 72 73 29 20 74 6f 20 73 65 65 20 69 66  eters) to see if
29a30 20 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73   it outputs rows
29a40 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65   in the requeste
29a50 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f  d ORDER BY.** (o
29a60 72 20 47 52 4f 55 50 20 42 59 29 20 77 69 74 68  r GROUP BY) with
29a70 6f 75 74 20 72 65 71 75 69 72 69 6e 67 20 61 20  out requiring a 
29a80 73 65 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70  separate sort op
29a90 65 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  eration.  Return
29aa0 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 30 3a 20 20  :.** .**    0:  
29ab0 4f 52 44 45 52 20 42 59 20 69 73 20 6e 6f 74 20  ORDER BY is not 
29ac0 73 61 74 69 73 66 69 65 64 2e 20 20 53 6f 72 74  satisfied.  Sort
29ad0 69 6e 67 20 72 65 71 75 69 72 65 64 0a 2a 2a 20  ing required.** 
29ae0 20 20 20 31 3a 20 20 4f 52 44 45 52 20 42 59 20     1:  ORDER BY 
29af0 69 73 20 73 61 74 69 73 66 69 65 64 2e 20 20 20  is satisfied.   
29b00 20 20 20 4f 6d 69 74 20 73 6f 72 74 69 6e 67 0a     Omit sorting.
29b10 2a 2a 20 20 20 2d 31 3a 20 20 55 6e 6b 6e 6f 77  **   -1:  Unknow
29b20 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 0a 2a  n at this time.*
29b30 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70  *.** Note that p
29b40 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 48  rocessing for WH
29b50 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64 20  ERE_GROUPBY and 
29b60 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
29b70 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74   is not as.** st
29b80 72 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f 55  rict.  With GROU
29b90 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  P BY and DISTINC
29ba0 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75 69  T the only requi
29bb0 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a 2a  rement is that.*
29bc0 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77  * equivalent row
29bd0 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69 61  s appear immedia
29be0 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74 6f  tely adjacent to
29bf0 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20 47   one another.  G
29c00 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44  ROUP BY.** and D
29c10 49 53 54 49 4e 54 20 64 6f 20 6e 6f 74 20 72 65  ISTINT do not re
29c20 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20 61 70  quire rows to ap
29c30 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61 72 74  pear in any part
29c40 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61 73 20  icular order as 
29c50 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69 76  long.** as equiv
29c60 65 6c 65 6e 74 20 72 6f 77 73 20 61 72 65 20 67  elent rows are g
29c70 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e  rouped together.
29c80 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f 55 50    Thus for GROUP
29c90 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
29ca0 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42 79  .** the pOrderBy
29cb0 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20 6d 61   terms can be ma
29cc0 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f 72 64  tched in any ord
29cd0 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45 52 20  er.  With ORDER 
29ce0 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64  BY, the .** pOrd
29cf0 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73 74 20  erBy terms must 
29d00 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 73 74  be matched in st
29d10 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67  rict left-to-rig
29d20 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ht order..*/.sta
29d30 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74  tic int wherePat
29d40 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
29d50 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  y(.  WhereInfo *
29d60 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68  pWInfo,    /* Th
29d70 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
29d80 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
29d90 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44  rderBy,   /* ORD
29da0 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
29db0 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63 6c  Y or DISTINCT cl
29dc0 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  ause to check */
29dd0 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 50  .  WherePath *pP
29de0 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ath,     /* The 
29df0 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68 65  WherePath to che
29e00 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  ck */.  u16 wctr
29e10 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a  lFlags,       /*
29e20 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 57   Might contain W
29e30 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72 20  HERE_GROUPBY or 
29e40 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
29e50 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c   */.  u16 nLoop,
29e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
29e70 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
29e80 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70   in pPath->aLoop
29e90 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  [] */.  WhereLoo
29ea0 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a  p *pLast,     /*
29eb0 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65 4c   Add this WhereL
29ec0 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  oop to the end o
29ed0 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d  f pPath->aLoop[]
29ee0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70   */.  Bitmask *p
29ef0 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f  RevMask     /* O
29f00 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72  UT: Mask of Wher
29f10 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e  eLoops to run in
29f20 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
29f30 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74  /.){.  u8 revSet
29f40 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
29f50 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20 6b  True if rev is k
29f60 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76  nown */.  u8 rev
29f70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29f80 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72  /* Composite sor
29f90 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
29fa0 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20 20  revIdx;         
29fb0 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74     /* Index sort
29fc0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69   order */.  u8 i
29fd0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20  sOrderDistinct; 
29fe0 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57    /* All prior W
29ff0 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72  hereLoops are or
2a000 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a  der-distinct */.
2a010 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c    u8 distinctCol
2a020 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20  umns;   /* True 
2a030 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20  if the loop has 
2a040 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20  UNIQUE NOT NULL 
2a050 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20  columns */.  u8 
2a060 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20  isMatch;        
2a070 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61     /* iColumn ma
2a080 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20  tches a term of 
2a090 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2a0a0 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65  use */.  u16 nKe
2a0b0 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 2f  yCol;          /
2a0c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20  * Number of key 
2a0d0 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65  columns in pInde
2a0e0 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75  x */.  u16 nColu
2a0f0 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn;          /* 
2a100 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2a110 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73 20  ordered columns 
2a120 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  in the index */.
2a130 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 20    u16 nOrderBy; 
2a140 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2a150 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  r terms in the O
2a160 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
2a170 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20  /.  int iLoop;  
2a180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2a190 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20  ex of WhereLoop 
2a1a0 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20 70  in pPath being p
2a1b0 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e  rocessed */.  in
2a1c0 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
2a1d0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2a1e0 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ters */.  int iC
2a1f0 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ur;             
2a200 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
2a210 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68 65   for current Whe
2a220 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  reLoop */.  int 
2a230 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  iColumn;        
2a240 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75    /* A column nu
2a250 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61 62 6c  mber within tabl
2a260 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65 72  e iCur */.  Wher
2a270 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30  eLoop *pLoop = 0
2a280 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65  ; /* Current Whe
2a290 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f  reLoop being pro
2a2a0 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65  cessed. */.  Whe
2a2b0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
2a2c0 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
2a2d0 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
2a2e0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
2a2f0 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20  r *pOBExpr;     
2a300 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73     /* An express
2a310 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52 44  ion from the ORD
2a320 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
2a330 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
2a340 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41  ;       /* COLLA
2a350 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d  TE function from
2a360 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
2a370 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e  use term */.  In
2a380 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
2a390 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
2a3a0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2a3b0 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69   pLoop */.  sqli
2a3c0 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f  te3 *db = pWInfo
2a3d0 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  ->pParse->db;  /
2a3e0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
2a3f0 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  ction */.  Bitma
2a400 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20 20  sk obSat = 0;   
2a410 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45   /* Mask of ORDE
2a420 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69 73  R BY terms satis
2a430 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  fied so far */. 
2a440 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b   Bitmask obDone;
2a450 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
2a460 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74  f all ORDER BY t
2a470 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  erms */.  Bitmas
2a480 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d  k orderDistinctM
2a490 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  ask;  /* Mask of
2a4a0 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65   all well-ordere
2a4b0 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74  d loops */.  Bit
2a4c0 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20 20  mask ready;     
2a4d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
2a4e0 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20   of inner loops 
2a4f0 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65  */..  /*.  ** We
2a500 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f   say the WhereLo
2a510 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20  op is "one-row" 
2a520 69 66 20 69 74 20 67 65 6e 65 72 61 74 65 73 20  if it generates 
2a530 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
2a540 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74  .  ** row of out
2a550 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f  put.  A WhereLoo
2a560 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20  p is one-row if 
2a570 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
2a580 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
2a590 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e 64   **  (a) All ind
2a5a0 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68  ex columns match
2a5b0 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c 55   with WHERE_COLU
2a5c0 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29  MN_EQ..  **  (b)
2a5d0 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e   The index is un
2a5e0 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68  ique.  ** Any Wh
2a5f0 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20  ereLoop with an 
2a600 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
2a610 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68  constraint on th
2a620 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72  e rowid is one-r
2a630 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f  ow..  ** Every o
2a640 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70  ne-row WhereLoop
2a650 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20 57   will have the W
2a660 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20  HERE_ONEROW bit 
2a670 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a  set in wsFlags..
2a680 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79    **.  ** We say
2a690 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69   the WhereLoop i
2a6a0 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  s "order-distinc
2a6b0 74 22 20 69 66 20 74 68 65 20 73 65 74 20 6f 66  t" if the set of
2a6c0 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20   columns from.  
2a6d0 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f  ** that WhereLoo
2a6e0 70 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68  p that are in th
2a6f0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2a700 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20  e are different 
2a710 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20 72  for every.  ** r
2a720 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c  ow of the WhereL
2a730 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d  oop.  Every one-
2a740 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  row WhereLoop is
2a750 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20   automatically. 
2a760 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   ** order-distin
2a770 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f 6f  ct.   A WhereLoo
2a780 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63 6f  p that has no co
2a790 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52 44  lumns in the ORD
2a7a0 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a  ER BY clause.  *
2a7b0 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64  * is not order-d
2a7c0 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f  istinct. To be o
2a7d0 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69 73  rder-distinct is
2a7e0 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20 73   not quite the s
2a7f0 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20 2a  ame as being.  *
2a800 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20 61  * UNIQUE since a
2a810 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f   UNIQUE column o
2a820 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76 65  r index can have
2a830 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74   multiple rows t
2a840 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55  hat .  ** are NU
2a850 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75  LL and NULL valu
2a860 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e  es are equivalen
2a870 74 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73  t for the purpos
2a880 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74 69  e of order-disti
2a890 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20  nct..  ** To be 
2a8a0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c 20  order-distinct, 
2a8b0 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74  the columns must
2a8c0 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20 4e   be UNIQUE and N
2a8d0 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20  OT NULL..  **.  
2a8e0 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
2a8f0 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61   a table is alwa
2a900 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f  ys UNIQUE and NO
2a910 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76  T NULL so whenev
2a920 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69  er the.  ** rowi
2a930 64 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  d appears in the
2a940 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2a950 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
2a960 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  ing WhereLoop is
2a970 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  .  ** automatica
2a980 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  lly order-distin
2a990 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65  ct..  */..  asse
2a9a0 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
2a9b0 29 3b 0a 0a 20 20 2f 2a 20 53 6f 72 74 61 62 69  );..  /* Sortabi
2a9c0 6c 69 74 79 20 6f 66 20 76 69 72 74 75 61 6c 20  lity of virtual 
2a9d0 74 61 62 6c 65 73 20 69 73 20 64 65 74 65 72 6d  tables is determ
2a9e0 69 6e 65 64 20 62 79 20 74 68 65 20 78 42 65 73  ined by the xBes
2a9f0 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 0a 20 20  tIndex method.  
2aa00 2a 2a 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  ** of the virtua
2aa10 6c 20 74 61 62 6c 65 20 69 74 73 65 6c 66 20 2a  l table itself *
2aa20 2f 0a 20 20 69 66 28 20 70 4c 61 73 74 2d 3e 77  /.  if( pLast->w
2aa30 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
2aa40 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20  IRTUALTABLE ){. 
2aa50 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 4c 6f     testcase( nLo
2aa60 6f 70 3e 30 20 29 3b 20 20 2f 2a 20 54 72 75 65  op>0 );  /* True
2aa70 20 77 68 65 6e 20 6f 75 74 65 72 20 6c 6f 6f 70   when outer loop
2aa80 73 20 61 72 65 20 6f 6e 65 2d 72 6f 77 20 61 6e  s are one-row an
2aa90 64 20 6d 61 74 63 68 20 0a 20 20 20 20 20 20 20  d match .       
2aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aab0 20 20 20 2a 2a 20 6e 6f 20 4f 52 44 45 52 20 42     ** no ORDER B
2aac0 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 72  Y terms */.    r
2aad0 65 74 75 72 6e 20 70 4c 61 73 74 2d 3e 75 2e 76  eturn pLast->u.v
2aae0 74 61 62 2e 69 73 4f 72 64 65 72 65 64 3b 0a 20  tab.isOrdered;. 
2aaf0 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26   }.  if( nLoop &
2ab00 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  & OptimizationDi
2ab10 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
2ab20 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e  E_OrderByIdxJoin
2ab30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  ) ) return 0;.. 
2ab40 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
2ab50 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74  erBy->nExpr;.  t
2ab60 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72 42  estcase( nOrderB
2ab70 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66  y==BMS-1 );.  if
2ab80 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31  ( nOrderBy>BMS-1
2ab90 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
2aba0 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65   Cannot optimize
2abb0 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f 52   overly large OR
2abc0 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f  DER BYs */.  isO
2abd0 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31  rderDistinct = 1
2abe0 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53  ;.  obDone = MAS
2abf0 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d 31  KBIT(nOrderBy)-1
2ac00 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63  ;.  orderDistinc
2ac10 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61  tMask = 0;.  rea
2ac20 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c  dy = 0;.  for(iL
2ac30 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69  oop=0; isOrderDi
2ac40 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c  stinct && obSat<
2ac50 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c  obDone && iLoop<
2ac60 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  =nLoop; iLoop++)
2ac70 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e  {.    if( iLoop>
2ac80 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f  0 ) ready |= pLo
2ac90 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
2aca0 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c    pLoop = iLoop<
2acb0 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61  nLoop ? pPath->a
2acc0 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c  Loop[iLoop] : pL
2acd0 61 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ast;.    assert(
2ace0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
2acf0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
2ad00 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 20  TABLE)==0 );.   
2ad10 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e   iCur = pWInfo->
2ad20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f  pTabList->a[pLoo
2ad30 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72  p->iTab].iCursor
2ad40 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f  ;..    /* Mark o
2ad50 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20  ff any ORDER BY 
2ad60 74 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61  term X that is a
2ad70 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74   column in the t
2ad80 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  able of.    ** t
2ad90 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20  he current loop 
2ada0 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20  for which there 
2adb0 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57  is term in the W
2adc0 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75  HERE.    ** clau
2add0 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  se of the form X
2ade0 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20   IS NULL or X=? 
2adf0 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f  that reference o
2ae00 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a  nly outer.    **
2ae10 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20   loops..    */. 
2ae20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
2ae30 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
2ae40 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
2ae50 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
2ae60 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42  tinue;.      pOB
2ae70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
2ae80 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
2ae90 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2aea0 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
2aeb0 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  OBExpr->op!=TK_C
2aec0 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65  OLUMN ) continue
2aed0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45  ;.      if( pOBE
2aee0 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75  xpr->iTable!=iCu
2aef0 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
2af00 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
2af10 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57  Term(&pWInfo->sW
2af20 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72  C, iCur, pOBExpr
2af30 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->iColumn,.     
2af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af50 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c    ~ready, WO_EQ|
2af60 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20  WO_ISNULL, 0);. 
2af70 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
2af80 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2af90 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
2afa0 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29  eOperator&WO_EQ)
2afb0 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e  !=0 && pOBExpr->
2afc0 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
2afd0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2afe0 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20   *z1, *z2;.     
2aff0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2b000 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
2b010 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f  Info->pParse, pO
2b020 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2b030 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
2b040 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
2b050 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
2b060 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43  .        z1 = pC
2b070 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
2b080 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
2b090 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2b0a0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
2b0b0 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Term->pExpr);.  
2b0c0 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
2b0d0 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
2b0e0 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
2b0f0 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e    z2 = pColl->zN
2b100 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
2b110 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2b120 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e  z1, z2)!=0 ) con
2b130 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
2b140 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
2b150 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a  SKBIT(i);.    }.
2b160 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
2b170 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2b180 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20  _ONEROW)==0 ){. 
2b190 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
2b1a0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2b1b0 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  IPK ){.        p
2b1c0 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
2b1d0 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a     nKeyCol = 0;.
2b1e0 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20          nColumn 
2b1f0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
2b200 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70   if( (pIndex = p
2b210 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
2b220 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64  ndex)==0 || pInd
2b230 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
2b240 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2b250 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
2b260 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c  .        nKeyCol
2b270 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43   = pIndex->nKeyC
2b280 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  ol;.        nCol
2b290 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43  umn = pIndex->nC
2b2a0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61  olumn;.        a
2b2b0 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
2b2c0 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61  nKeyCol+1 || !Ha
2b2d0 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70  sRowid(pIndex->p
2b2e0 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20  Table) );.      
2b2f0 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
2b300 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75  ->aiColumn[nColu
2b310 6d 6e 2d 31 5d 3d 3d 28 2d 31 29 20 7c 7c 20 21  mn-1]==(-1) || !
2b320 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d  HasRowid(pIndex-
2b330 3e 70 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20  >pTable));.     
2b340 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
2b350 63 74 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  ct = pIndex->onE
2b360 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20  rror!=OE_None;. 
2b370 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2b380 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
2b390 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  l columns of the
2b3a0 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20   index and deal 
2b3b0 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20  with the ones.  
2b3c0 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20      ** that are 
2b3d0 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20  not constrained 
2b3e0 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20  by == or IN..   
2b3f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20     */.      rev 
2b400 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20  = revSet = 0;.  
2b410 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75      distinctColu
2b420 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  mns = 0;.      f
2b430 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d  or(j=0; j<nColum
2b440 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
2b450 20 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20   u8 bOnce;   /* 
2b460 54 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20  True to run the 
2b470 4f 52 44 45 52 20 42 59 20 73 65 61 72 63 68 20  ORDER BY search 
2b480 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20  loop */..       
2b490 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d   /* Skip over ==
2b4a0 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65 72   and IS NULL ter
2b4b0 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ms */.        if
2b4c0 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ( j<pLoop->u.btr
2b4d0 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20  ee.nEq.         
2b4e0 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  && pLoop->u.btre
2b4f0 65 2e 6e 53 6b 69 70 3d 3d 30 0a 20 20 20 20 20  e.nSkip==0.     
2b500 20 20 20 20 26 26 20 28 28 69 20 3d 20 70 4c 6f      && ((i = pLo
2b510 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65  op->aLTerm[j]->e
2b520 4f 70 65 72 61 74 6f 72 29 20 26 20 28 57 4f 5f  Operator) & (WO_
2b530 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d  EQ|WO_ISNULL))!=
2b540 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
2b550 20 20 20 20 20 20 20 69 66 28 20 69 20 26 20 57         if( i & W
2b560 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
2b570 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2b580 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
2b590 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t );.           
2b5a0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2b5b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2b5c0 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  }.          cont
2b5d0 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20  inue;  .        
2b5e0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65  }..        /* Ge
2b5f0 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d  t the column num
2b600 62 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ber in the table
2b610 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73   (iColumn) and s
2b620 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ort order.      
2b630 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f    ** (revIdx) fo
2b640 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d  r the j-th colum
2b650 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a  n of the index..
2b660 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2b670 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b     if( pIndex ){
2b680 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75  .          iColu
2b690 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43  mn = pIndex->aiC
2b6a0 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20  olumn[j];.      
2b6b0 20 20 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e      revIdx = pIn
2b6c0 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
2b6d0 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  j];.          if
2b6e0 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65  ( iColumn==pInde
2b6f0 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79  x->pTable->iPKey
2b700 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b   ) iColumn = -1;
2b710 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2b720 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d            iColum
2b730 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
2b740 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20    revIdx = 0;.  
2b750 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2b760 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61   /* An unconstra
2b770 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74  ined column that
2b780 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d   might be NULL m
2b790 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20  eans that this. 
2b7a0 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c         ** WhereL
2b7b0 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d  oop is not well-
2b7c0 6f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20  ordered.        
2b7d0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
2b7e0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a 20  sOrderDistinct. 
2b7f0 20 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c 75          && iColu
2b800 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26  mn>=0.         &
2b810 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74  & j>=pLoop->u.bt
2b820 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20  ree.nEq.        
2b830 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61 62   && pIndex->pTab
2b840 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e  le->aCol[iColumn
2b850 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20  ].notNull==0.   
2b860 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2b870 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2b880 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
2b890 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e  ..        /* Fin
2b8a0 64 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  d the ORDER BY t
2b8b0 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73 70  erm that corresp
2b8c0 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74 68  onds to the j-th
2b8d0 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20   column.        
2b8e0 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ** of the index 
2b8f0 61 6e 64 20 61 6e 64 20 6d 61 72 6b 20 74 68 61  and and mark tha
2b900 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  t ORDER BY term 
2b910 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  off .        */.
2b920 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20          bOnce = 
2b930 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74  1;.        isMat
2b940 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
2b950 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26  for(i=0; bOnce &
2b960 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  & i<nOrderBy; i+
2b970 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
2b980 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
2b990 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
2b9a0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45 78  .          pOBEx
2b9b0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
2b9c0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64  SkipCollate(pOrd
2b9d0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2b9e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
2b9f0 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67  tcase( wctrlFlag
2ba00 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42  s & WHERE_GROUPB
2ba10 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  Y );.          t
2ba20 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c  estcase( wctrlFl
2ba30 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
2ba40 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20 20  INCTBY );.      
2ba50 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
2ba60 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52 4f  ags & (WHERE_GRO
2ba70 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54 49  UPBY|WHERE_DISTI
2ba80 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e  NCTBY))==0 ) bOn
2ba90 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ce = 0;.        
2baa0 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f    if( pOBExpr->o
2bab0 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63  p!=TK_COLUMN ) c
2bac0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2bad0 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
2bae0 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63  iTable!=iCur ) c
2baf0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2bb00 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
2bb10 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  iColumn!=iColumn
2bb20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2bb30 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
2bb40 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mn>=0 ){.       
2bb50 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
2bb60 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2bb70 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
2bb80 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2bb90 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
2bba0 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
2bbb0 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
2bbc0 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  tColl;.         
2bbd0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
2bbe0 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
2bbf0 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  me, pIndex->azCo
2bc00 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74  ll[j])!=0 ) cont
2bc10 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2bc20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d 61  }.          isMa
2bc30 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  tch = 1;.       
2bc40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2bc50 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2bc60 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  isMatch ){.     
2bc70 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
2bc80 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
2bc90 20 20 74 65 73 74 63 61 73 65 28 20 64 69 73 74    testcase( dist
2bca0 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29  inctColumns==0 )
2bcb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69  ;.            di
2bcc0 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20  stinctColumns = 
2bcd0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
2bce0 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c           obSat |
2bcf0 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  = MASKBIT(i);.  
2bd00 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 49          if( (pWI
2bd10 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2bd20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 29  & WHERE_GROUPBY)
2bd30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2bd40 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
2bd50 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 69  the sort order i
2bd60 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20  s compatible in 
2bd70 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
2bd80 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  se..            
2bd90 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69 73  ** Sort order is
2bda0 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20   irrelevant for 
2bdb0 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
2bdc0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
2bdd0 20 20 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a    if( revSet ){.
2bde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2bdf0 28 20 28 72 65 76 20 5e 20 72 65 76 49 64 78 29  ( (rev ^ revIdx)
2be00 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  !=pOrderBy->a[i]
2be10 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74  .sortOrder ) ret
2be20 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20  urn 0;.         
2be30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2be40 20 20 20 20 20 20 20 20 72 65 76 20 3d 20 72 65          rev = re
2be50 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d  vIdx ^ pOrderBy-
2be60 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
2be70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2be80 66 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61  f( rev ) *pRevMa
2be90 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c  sk |= MASKBIT(iL
2bea0 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oop);.          
2beb0 20 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a      revSet = 1;.
2bec0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2bed0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2bef0 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66     /* No match f
2bf00 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
2bf10 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c    if( j==0 || j<
2bf20 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20  nKeyCol ){.     
2bf30 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2bf40 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2bf50 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
2bf60 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
2bf70 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
2bf80 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
2bf90 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
2bfa0 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f       } /* end Lo
2bfb0 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65  op over all inde
2bfc0 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  x columns */.   
2bfd0 20 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 43     if( distinctC
2bfe0 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20  olumns ){.      
2bff0 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
2c000 64 65 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29  derDistinct==0 )
2c010 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65  ;.        isOrde
2c020 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20  rDistinct = 1;. 
2c030 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20       }.    } /* 
2c040 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72  end-if not one-r
2c050 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61  ow */..    /* Ma
2c060 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72  rk off any other
2c070 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
2c080 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 70  that reference p
2c090 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20  Loop */.    if( 
2c0a0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2c0b0 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69  ){.      orderDi
2c0c0 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c  stinctMask |= pL
2c0d0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
2c0e0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2c0f0 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
2c100 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b          Expr *p;
2c110 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53  .        if( MAS
2c120 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
2c130 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2c140 20 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79      p = pOrderBy
2c150 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
2c160 20 20 20 20 20 20 69 66 28 20 28 65 78 70 72 54        if( (exprT
2c170 61 62 6c 65 55 73 61 67 65 28 26 70 57 49 6e 66  ableUsage(&pWInf
2c180 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 29 26  o->sMaskSet, p)&
2c190 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61  ~orderDistinctMa
2c1a0 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
2c1b0 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
2c1c0 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20  KBIT(i);.       
2c1d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2c1e0 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20  .  } /* End the 
2c1f0 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68  loop over all Wh
2c200 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75  ereLoops from ou
2c210 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f  ter-most down to
2c220 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20   inner-most */. 
2c230 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f   if( obSat==obDo
2c240 6e 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ne ) return 1;. 
2c250 20 69 66 28 20 21 69 73 4f 72 64 65 72 44 69 73   if( !isOrderDis
2c260 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30  tinct ) return 0
2c270 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ;.  return -1;.}
2c280 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
2c290 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46  ACE_ENABLED./* F
2c2a0 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  or debugging use
2c2b0 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63   only: */.static
2c2c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65   const char *whe
2c2d0 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65  rePathName(Where
2c2e0 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74  Path *pPath, int
2c2f0 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f   nLoop, WhereLoo
2c300 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61  p *pLast){.  sta
2c310 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36  tic char zName[6
2c320 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  5];.  int i;.  f
2c330 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b  or(i=0; i<nLoop;
2c340 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20   i++){ zName[i] 
2c350 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  = pPath->aLoop[i
2c360 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20  ]->cId; }.  if( 
2c370 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b  pLast ) zName[i+
2c380 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b  +] = pLast->cId;
2c390 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b  .  zName[i] = 0;
2c3a0 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
2c3b0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
2c3c0 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74  * Given the list
2c3d0 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62   of WhereLoop ob
2c3e0 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f 2d  jects at pWInfo-
2c3f0 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f  >pLoops, this ro
2c400 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74  utine.** attempt
2c410 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f  s to find the lo
2c420 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 74  west cost path t
2c430 68 61 74 20 76 69 73 69 74 73 20 65 61 63 68 20  hat visits each 
2c440 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63  WhereLoop.** onc
2c450 65 2e 20 20 54 68 69 73 20 70 61 74 68 20 69 73  e.  This path is
2c460 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74   then loaded int
2c470 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b  o the pWInfo->a[
2c480 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e  ].pWLoop fields.
2c490 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68  .**.** Assume th
2c4a0 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  at the total num
2c4b0 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
2c4c0 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65  ws that will nee
2c4d0 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a  d to be sorted.*
2c4e0 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73  * will be nRowEs
2c4f0 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67  t (in the 10*log
2c500 32 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  2 representation
2c510 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73  ).  Or, ignore s
2c520 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20  orting.** costs 
2c530 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a  if nRowEst==0..*
2c540 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
2c550 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
2c560 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
2c570 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   of a memory all
2c580 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72  ocation.** error
2c590 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
2c5a0 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68  ic int wherePath
2c5b0 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f  Solver(WhereInfo
2c5c0 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74   *pWInfo, LogEst
2c5d0 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74   nRowEst){.  int
2c5e0 20 6d 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20   mxChoice;      
2c5f0 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
2c600 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75  m number of simu
2c610 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74  ltaneous paths t
2c620 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racked */.  int 
2c630 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nLoop;          
2c640 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2c650 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  of terms in the 
2c660 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20  join */.  Parse 
2c670 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
2c680 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
2c690 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
2c6a0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
2c6b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
2c6c0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2c6d0 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b   */.  int iLoop;
2c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6f0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
2c700 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f  over the terms o
2c710 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  f the join */.  
2c720 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20  int ii, jj;     
2c730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2c740 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
2c750 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20 20 20  int mxI = 0;    
2c760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2c770 65 78 20 6f 66 20 6e 65 78 74 20 65 6e 74 72 79  ex of next entry
2c780 20 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20   to replace */. 
2c790 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b 20 20   LogEst rCost;  
2c7a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2c7b0 73 74 20 6f 66 20 61 20 70 61 74 68 20 2a 2f 0a  st of a path */.
2c7c0 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20    LogEst nOut;  
2c7d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2c7e0 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 73  umber of outputs
2c7f0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43   */.  LogEst mxC
2c800 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ost = 0;        
2c810 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20  /* Maximum cost 
2c820 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68  of a set of path
2c830 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78  s */.  LogEst mx
2c840 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Out = 0;        
2c850 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 4f 75 74   /* Maximum nOut
2c860 20 76 61 6c 75 65 20 6f 6e 20 74 68 65 20 73 65   value on the se
2c870 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20  t of paths */.  
2c880 4c 6f 67 45 73 74 20 72 53 6f 72 74 43 6f 73 74  LogEst rSortCost
2c890 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73  ;         /* Cos
2c8a0 74 20 74 6f 20 64 6f 20 61 20 73 6f 72 74 20 2a  t to do a sort *
2c8b0 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72  /.  int nTo, nFr
2c8c0 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  om;           /*
2c8d0 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   Number of valid
2c8e0 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b   entries in aTo[
2c8f0 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f  ] and aFrom[] */
2c900 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 46  .  WherePath *aF
2c910 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rom;         /* 
2c920 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20  All nFrom paths 
2c930 61 74 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  at the previous 
2c940 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65  level */.  Where
2c950 50 61 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20  Path *aTo;      
2c960 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20       /* The nTo 
2c970 62 65 73 74 20 70 61 74 68 73 20 61 74 20 74 68  best paths at th
2c980 65 20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20  e current level 
2c990 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
2c9a0 70 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f  pFrom;         /
2c9b0 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  * An element of 
2c9c0 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20  aFrom[] that we 
2c9d0 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
2c9e0 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
2c9f0 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  To;           /*
2ca00 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61   An element of a
2ca10 54 6f 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65  To[] that we are
2ca20 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20   working on */. 
2ca30 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f   WhereLoop *pWLo
2ca40 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  op;        /* On
2ca50 65 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f  e of the WhereLo
2ca60 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  op objects */.  
2ca70 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20  WhereLoop **pX; 
2ca80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2ca90 64 20 74 6f 20 64 69 76 79 20 75 70 20 74 68 65  d to divy up the
2caa0 20 70 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a   pSpace memory *
2cab0 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65  /.  char *pSpace
2cac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2cad0 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72   Temporary memor
2cae0 79 20 75 73 65 64 20 62 79 20 74 68 69 73 20 72  y used by this r
2caf0 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 70 50 61  outine */..  pPa
2cb00 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
2cb10 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61  arse;.  db = pPa
2cb20 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70  rse->db;.  nLoop
2cb30 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   = pWInfo->nLeve
2cb40 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  l;.  /* TUNING: 
2cb50 46 6f 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69  For simple queri
2cb60 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73  es, only the bes
2cb70 74 20 70 61 74 68 20 69 73 20 74 72 61 63 6b 65  t path is tracke
2cb80 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61  d..  ** For 2-wa
2cb90 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62  y joins, the 5 b
2cba0 65 73 74 20 70 61 74 68 73 20 61 72 65 20 66 6f  est paths are fo
2cbb0 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72  llowed..  ** For
2cbc0 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d   joins of 3 or m
2cbd0 6f 72 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63  ore tables, trac
2cbe0 6b 20 74 68 65 20 31 30 20 62 65 73 74 20 70 61  k the 10 best pa
2cbf0 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63  ths */.  mxChoic
2cc00 65 20 3d 20 28 6e 4c 6f 6f 70 3d 3d 31 29 20 3f  e = (nLoop==1) ?
2cc10 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f   1 : (nLoop==2 ?
2cc20 20 35 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65   5 : 10);.  asse
2cc30 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66  rt( nLoop<=pWInf
2cc40 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  o->pTabList->nSr
2cc50 63 20 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43  c );.  WHERETRAC
2cc60 45 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20  E(0x002, ("---- 
2cc70 62 65 67 69 6e 20 73 6f 6c 76 65 72 5c 6e 22 29  begin solver\n")
2cc80 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
2cc90 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
2cca0 20 73 70 61 63 65 20 66 6f 72 20 61 54 6f 20 61   space for aTo a
2ccb0 6e 64 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 69 69  nd aFrom */.  ii
2ccc0 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65   = (sizeof(Where
2ccd0 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65  Path)+sizeof(Whe
2cce0 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a  reLoop*)*nLoop)*
2ccf0 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 70 53  mxChoice*2;.  pS
2cd00 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62  pace = sqlite3Db
2cd10 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 69 69  MallocRaw(db, ii
2cd20 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d  );.  if( pSpace=
2cd30 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2cd40 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20  TE_NOMEM;.  aTo 
2cd50 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29 70 53  = (WherePath*)pS
2cd60 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20  pace;.  aFrom = 
2cd70 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20  aTo+mxChoice;.  
2cd80 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c  memset(aFrom, 0,
2cd90 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d   sizeof(aFrom[0]
2cda0 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72  ));.  pX = (Wher
2cdb0 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d  eLoop**)(aFrom+m
2cdc0 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28  xChoice);.  for(
2cdd0 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70  ii=mxChoice*2, p
2cde0 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20  From=aTo; ii>0; 
2cdf0 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70  ii--, pFrom++, p
2ce00 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20  X += nLoop){.   
2ce10 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20   pFrom->aLoop = 
2ce20 70 58 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  pX;.  }..  /* Se
2ce30 65 64 20 74 68 65 20 73 65 61 72 63 68 20 77 69  ed the search wi
2ce40 74 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72  th a single Wher
2ce50 65 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67  ePath containing
2ce60 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73   zero WhereLoops
2ce70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49  ..  **.  ** TUNI
2ce80 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74  NG: Do not let t
2ce90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65  he number of ite
2cea0 72 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65  rations go above
2ceb0 20 32 35 2e 20 20 49 66 20 74 68 65 20 63 6f 73   25.  If the cos
2cec0 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74  t.  ** of comput
2ced0 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ing an automatic
2cee0 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61   index is not pa
2cef0 69 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74  id back within t
2cf00 68 65 20 66 69 72 73 74 20 32 35 0a 20 20 2a 2a  he first 25.  **
2cf10 20 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e   rows, then do n
2cf20 6f 74 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d  ot use the autom
2cf30 61 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20  atic index. */. 
2cf40 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d   aFrom[0].nRow =
2cf50 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75   MIN(pParse->nQu
2cf60 65 72 79 4c 6f 6f 70 2c 20 34 36 29 3b 20 20 61  eryLoop, 46);  a
2cf70 73 73 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74  ssert( 46==sqlit
2cf80 65 33 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a  e3LogEst(25) );.
2cf90 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 0a 20 20    nFrom = 1;..  
2cfa0 2f 2a 20 50 72 65 63 6f 6d 70 75 74 65 20 74 68  /* Precompute th
2cfb0 65 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  e cost of sortin
2cfc0 67 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75  g the final resu
2cfd0 6c 74 20 73 65 74 2c 20 69 66 20 74 68 65 20 63  lt set, if the c
2cfe0 61 6c 6c 65 72 0a 20 20 2a 2a 20 74 6f 20 73 71  aller.  ** to sq
2cff0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2d000 29 20 77 61 73 20 63 6f 6e 63 65 72 6e 65 64 20  ) was concerned 
2d010 61 62 6f 75 74 20 73 6f 72 74 69 6e 67 20 2a 2f  about sorting */
2d020 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 30  .  rSortCost = 0
2d030 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  ;.  if( pWInfo->
2d040 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e  pOrderBy==0 || n
2d050 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20  RowEst==0 ){.   
2d060 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65   aFrom[0].isOrde
2d070 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  redValid = 1;.  
2d080 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 55  }else{.    /* TU
2d090 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20  NING: Estimated 
2d0a0 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
2d0b0 69 73 20 34 38 2a 4e 2a 6c 6f 67 32 28 4e 29 20  is 48*N*log2(N) 
2d0c0 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 0a 20  where N is the. 
2d0d0 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
2d0e0 6f 75 74 70 75 74 20 72 6f 77 73 2e 20 54 68 65  output rows. The
2d0f0 20 34 38 20 69 73 20 74 68 65 20 65 78 70 65 63   48 is the expec
2d100 74 65 64 20 73 69 7a 65 20 6f 66 20 61 20 72 6f  ted size of a ro
2d110 77 20 74 6f 20 73 6f 72 74 2e 20 0a 20 20 20 20  w to sort. .    
2d120 2a 2a 20 46 49 58 4d 45 3a 20 20 63 6f 6d 70 75  ** FIXME:  compu
2d130 74 65 20 61 20 62 65 74 74 65 72 20 65 73 74 69  te a better esti
2d140 6d 61 74 65 20 6f 66 20 74 68 65 20 34 38 20 6d  mate of the 48 m
2d150 75 6c 74 69 70 6c 69 65 72 20 62 61 73 65 64 20  ultiplier based 
2d160 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  on the.    ** re
2d170 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
2d180 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 72 53 6f  ions. */.    rSo
2d190 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77 45 73 74  rtCost = nRowEst
2d1a0 20 2b 20 65 73 74 4c 6f 67 28 6e 52 6f 77 45 73   + estLog(nRowEs
2d1b0 74 29 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41  t);.    WHERETRA
2d1c0 43 45 28 30 78 30 30 32 2c 28 22 2d 2d 2d 2d 20  CE(0x002,("---- 
2d1d0 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64 5c 6e  sort cost=%-3d\n
2d1e0 22 2c 20 72 53 6f 72 74 43 6f 73 74 29 29 3b 0a  ", rSortCost));.
2d1f0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
2d200 65 20 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c  e successively l
2d210 6f 6e 67 65 72 20 57 68 65 72 65 50 61 74 68 73  onger WherePaths
2d220 20 75 73 69 6e 67 20 74 68 65 20 70 72 65 76 69   using the previ
2d230 6f 75 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20  ous generation. 
2d240 20 2a 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68   ** of WherePath
2d250 73 20 61 73 20 74 68 65 20 62 61 73 69 73 20 66  s as the basis f
2d260 6f 72 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65  or the next.  Ke
2d270 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ep track of the 
2d280 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65  mxChoice.  ** be
2d290 73 74 20 70 61 74 68 73 20 61 74 20 65 61 63 68  st paths at each
2d2a0 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20   generation */. 
2d2b0 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c   for(iLoop=0; iL
2d2c0 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70  oop<nLoop; iLoop
2d2d0 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30  ++){.    nTo = 0
2d2e0 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20  ;.    for(ii=0, 
2d2f0 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c  pFrom=aFrom; ii<
2d300 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72  nFrom; ii++, pFr
2d310 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72  om++){.      for
2d320 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e  (pWLoop=pWInfo->
2d330 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20  pLoops; pWLoop; 
2d340 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70  pWLoop=pWLoop->p
2d350 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20  NextLoop){.     
2d360 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e     Bitmask maskN
2d370 65 77 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d  ew;.        Bitm
2d380 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b  ask revMask = 0;
2d390 0a 20 20 20 20 20 20 20 20 75 38 20 69 73 4f 72  .        u8 isOr
2d3a0 64 65 72 65 64 56 61 6c 69 64 20 3d 20 70 46 72  deredValid = pFr
2d3b0 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c  om->isOrderedVal
2d3c0 69 64 3b 0a 20 20 20 20 20 20 20 20 75 38 20 69  id;.        u8 i
2d3d0 73 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d  sOrdered = pFrom
2d3e0 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20  ->isOrdered;.   
2d3f0 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70       if( (pWLoop
2d400 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46 72 6f  ->prereq & ~pFro
2d410 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20  m->maskLoop)!=0 
2d420 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2d430 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d      if( (pWLoop-
2d440 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46 72 6f  >maskSelf & pFro
2d450 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20  m->maskLoop)!=0 
2d460 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2d470 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
2d480 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20  oint, pWLoop is 
2d490 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
2d4a0 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e  e the next loop.
2d4b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d   .        ** Com
2d4c0 70 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f  pute its cost */
2d4d0 0a 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d  .        rCost =
2d4e0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
2d4f0 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70  d(pWLoop->rSetup
2d500 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20  ,pWLoop->rRun + 
2d510 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20  pFrom->nRow);.  
2d520 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71        rCost = sq
2d530 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72  lite3LogEstAdd(r
2d540 43 6f 73 74 2c 20 70 46 72 6f 6d 2d 3e 72 43 6f  Cost, pFrom->rCo
2d550 73 74 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75  st);.        nOu
2d560 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20  t = pFrom->nRow 
2d570 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a  + pWLoop->nOut;.
2d580 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20          maskNew 
2d590 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
2d5a0 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
2d5b0 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66  Self;.        if
2d5c0 28 20 21 69 73 4f 72 64 65 72 65 64 56 61 6c 69  ( !isOrderedVali
2d5d0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
2d5e0 77 69 74 63 68 28 20 77 68 65 72 65 50 61 74 68  witch( wherePath
2d5f0 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
2d600 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20  (pWInfo,.       
2d610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d620 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
2d630 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d  , pFrom, pWInfo-
2d640 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20  >wctrlFlags,.   
2d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d660 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f      iLoop, pWLoo
2d670 70 2c 20 26 72 65 76 4d 61 73 6b 29 20 29 7b 0a  p, &revMask) ){.
2d680 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
2d690 20 31 3a 20 20 2f 2a 20 59 65 73 2e 20 20 70 46   1:  /* Yes.  pF
2d6a0 72 6f 6d 2b 70 57 4c 6f 6f 70 20 64 6f 65 73 20  rom+pWLoop does 
2d6b0 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45  satisfy the ORDE
2d6c0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
2d6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
2d6e0 72 64 65 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  rdered = 1;.    
2d6f0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
2d700 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  redValid = 1;.  
2d710 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2d720 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  k;.            c
2d730 61 73 65 20 30 3a 20 20 2f 2a 20 4e 6f 2e 20 20  ase 0:  /* No.  
2d740 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 77 69 6c  pFrom+pWLoop wil
2d750 6c 20 72 65 71 75 69 72 65 20 61 20 73 65 70 61  l require a sepa
2d760 72 61 74 65 20 73 6f 72 74 20 2a 2f 0a 20 20 20  rate sort */.   
2d770 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
2d780 65 72 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  ered = 0;.      
2d790 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
2d7a0 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20  dValid = 1;.    
2d7b0 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20            rCost 
2d7c0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
2d7d0 64 64 28 72 43 6f 73 74 2c 20 72 53 6f 72 74 43  dd(rCost, rSortC
2d7e0 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ost);.          
2d7f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2d800 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
2d810 2f 2a 20 43 61 6e 6e 6f 74 20 74 65 6c 6c 20 79  /* Cannot tell y
2d820 65 74 2e 20 20 54 72 79 20 61 67 61 69 6e 20 6f  et.  Try again o
2d830 6e 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  n the next itera
2d840 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
2d850 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2d860 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d870 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d880 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f    revMask = pFro
2d890 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20  m->revLoop;.    
2d8a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
2d8b0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2d8c0 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62   pWLoop should b
2d8d0 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6d  e added to the m
2d8e0 78 43 68 6f 69 63 65 20 62 65 73 74 20 73 6f 20  xChoice best so 
2d8f0 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  far */.        f
2d900 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f  or(jj=0, pTo=aTo
2d910 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20  ; jj<nTo; jj++, 
2d920 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pTo++){.        
2d930 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c    if( pTo->maskL
2d940 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20  oop==maskNew.   
2d950 20 20 20 20 20 20 20 20 26 26 20 70 54 6f 2d 3e          && pTo->
2d960 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3d 3d  isOrderedValid==
2d970 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 0a 20  isOrderedValid. 
2d980 20 20 20 20 20 20 20 20 20 20 26 26 20 28 28 70            && ((p
2d990 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73 74  To->rCost<=rCost
2d9a0 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e   && pTo->nRow<=n
2d9b0 4f 75 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  Out) ||.        
2d9c0 20 20 20 20 20 20 20 20 28 70 54 6f 2d 3e 72 43          (pTo->rC
2d9d0 6f 73 74 3e 3d 72 43 6f 73 74 20 26 26 20 70 54  ost>=rCost && pT
2d9e0 6f 2d 3e 6e 52 6f 77 3e 3d 6e 4f 75 74 29 29 0a  o->nRow>=nOut)).
2d9f0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
2da00 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2da10 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a  e( jj==nTo-1 );.
2da20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2da30 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
2da40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2da50 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a   if( jj>=nTo ){.
2da60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54            if( nT
2da70 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 26 26 20 72  o>=mxChoice && r
2da80 43 6f 73 74 3e 3d 6d 78 43 6f 73 74 20 29 7b 0a  Cost>=mxCost ){.
2da90 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
2daa0 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
2dab0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2dac0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2dad0 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
2dae0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2daf0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53  e3DebugPrintf("S
2db00 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  kip   %s cost=%-
2db10 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
2db20 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2db30 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
2db40 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
2db50 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
2db60 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  , nOut,.        
2db70 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
2db80 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72  redValid ? (isOr
2db90 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e  dered ? 'Y' : 'N
2dba0 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
2dbb0 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
2dbc0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
2dbd0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2dbe0 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  }.          /* A
2dbf0 64 64 20 61 20 6e 65 77 20 50 61 74 68 20 74 6f  dd a new Path to
2dc00 20 74 68 65 20 61 54 6f 5b 5d 20 73 65 74 20 2a   the aTo[] set *
2dc10 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2dc20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a  nTo<mxChoice ){.
2dc30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2dc40 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
2dc50 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74 20   of the aTo set 
2dc60 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  by one */.      
2dc70 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b        jj = nTo++
2dc80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2dc90 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
2dca0 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61  * New path repla
2dcb0 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f  ces the prior wo
2dcc0 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e  rst to keep coun
2dcd0 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65  t below mxChoice
2dce0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2dcf0 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20  jj = mxI;.      
2dd00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2dd10 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a  pTo = &aTo[jj];.
2dd20 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
2dd30 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
2dd40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
2dd50 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
2dd60 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
2dd70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
2dd80 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20  bugPrintf("New  
2dd90 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
2dda0 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
2ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddc0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
2ddd0 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
2dde0 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
2ddf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2de00 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64    isOrderedValid
2de10 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20   ? (isOrdered ? 
2de20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27  'Y' : 'N') : '?'
2de30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  );.          }.#
2de40 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65  endif.        }e
2de50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
2de60 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72  f( pTo->rCost<=r
2de70 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f  Cost && pTo->nRo
2de80 77 3c 3d 6e 4f 75 74 20 29 7b 0a 23 69 66 64 65  w<=nOut ){.#ifde
2de90 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
2dea0 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20  BLED /* 0x4 */. 
2deb0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
2dec0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
2ded0 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
2dee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2def0 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
2df00 20 20 20 20 20 20 20 20 20 20 20 20 22 53 6b 69              "Ski
2df10 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  p   %s cost=%-3d
2df20 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  ,%3d order=%c",.
2df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df40 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
2df50 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
2df60 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
2df70 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut,.            
2df80 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56        isOrderedV
2df90 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65  alid ? (isOrdere
2dfa0 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a  d ? 'Y' : 'N') :
2dfb0 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
2dfc0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2dfd0 67 50 72 69 6e 74 66 28 22 20 20 20 76 73 20 25  gPrintf("   vs %
2dfe0 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 64 20 6f  s cost=%-3d,%d o
2dff0 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
2e000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
2e010 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c  erePathName(pTo,
2e020 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54   iLoop+1, 0), pT
2e030 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e  o->rCost, pTo->n
2e040 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Row,.           
2e050 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
2e060 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54  deredValid ? (pT
2e070 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27  o->isOrdered ? '
2e080 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29  Y' : 'N') : '?')
2e090 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2e0a0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
2e0b0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f     testcase( pTo
2e0c0 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29  ->rCost==rCost )
2e0d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  ;.            co
2e0e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2e0f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65    }.          te
2e100 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f  stcase( pTo->rCo
2e110 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20  st==rCost+1 );. 
2e120 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65           /* A ne
2e130 77 20 61 6e 64 20 62 65 74 74 65 72 20 73 63 6f  w and better sco
2e140 72 65 20 66 6f 72 20 61 20 70 72 65 76 69 6f 75  re for a previou
2e150 73 6c 79 20 63 72 65 61 74 65 64 20 65 71 75 69  sly created equi
2e160 76 61 6c 65 6e 74 20 70 61 74 68 20 2a 2f 0a 23  valent path */.#
2e170 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
2e180 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
2e190 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
2e1a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
2e1b0 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
2e1c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2e1d0 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
2e1e0 20 20 20 20 20 20 20 20 20 20 22 55 70 64 61 74            "Updat
2e1f0 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25  e %s cost=%-3d,%
2e200 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20  3d order=%c",.  
2e210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
2e220 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
2e230 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
2e240 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a  ), rCost, nOut,.
2e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e260 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f  isOrderedValid ?
2e270 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59   (isOrdered ? 'Y
2e280 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b  ' : 'N') : '?');
2e290 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2e2a0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2e2b0 22 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d 25  "  was %s cost=%
2e2c0 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  -3d,%3d order=%c
2e2d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2e2e0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
2e2f0 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c  me(pTo, iLoop+1,
2e300 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c   0), pTo->rCost,
2e310 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20   pTo->nRow,.    
2e320 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d              pTo-
2e330 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20  >isOrderedValid 
2e340 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  ? (pTo->isOrdere
2e350 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a  d ? 'Y' : 'N') :
2e360 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
2e370 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
2e380 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70    }.        /* p
2e390 57 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65  WLoop is a winne
2e3a0 72 2e 20 20 41 64 64 20 69 74 20 74 6f 20 74 68  r.  Add it to th
2e3b0 65 20 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f  e set of best so
2e3c0 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   far */.        
2e3d0 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20  pTo->maskLoop = 
2e3e0 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20  pFrom->maskLoop 
2e3f0 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  | pWLoop->maskSe
2e400 6c 66 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  lf;.        pTo-
2e410 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61  >revLoop = revMa
2e420 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  sk;.        pTo-
2e430 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20  >nRow = nOut;.  
2e440 20 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74        pTo->rCost
2e450 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20   = rCost;.      
2e460 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
2e470 56 61 6c 69 64 20 3d 20 69 73 4f 72 64 65 72 65  Valid = isOrdere
2e480 64 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20  dValid;.        
2e490 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d  pTo->isOrdered =
2e4a0 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20   isOrdered;.    
2e4b0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e      memcpy(pTo->
2e4c0 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c  aLoop, pFrom->aL
2e4d0 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72  oop, sizeof(Wher
2e4e0 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a  eLoop*)*iLoop);.
2e4f0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f          pTo->aLo
2e500 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f  op[iLoop] = pWLo
2e510 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  op;.        if( 
2e520 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b  nTo>=mxChoice ){
2e530 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d  .          mxI =
2e540 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78   0;.          mx
2e550 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43  Cost = aTo[0].rC
2e560 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  ost;.          m
2e570 78 4f 75 74 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52  xOut = aTo[0].nR
2e580 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ow;.          fo
2e590 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f  r(jj=1, pTo=&aTo
2e5a0 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65  [1]; jj<mxChoice
2e5b0 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; jj++, pTo++){.
2e5c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2e5d0 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73  pTo->rCost>mxCos
2e5e0 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74  t || (pTo->rCost
2e5f0 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70 54 6f 2d  ==mxCost && pTo-
2e600 3e 6e 52 6f 77 3e 6d 78 4f 75 74 29 20 29 7b 0a  >nRow>mxOut) ){.
2e610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78                mx
2e620 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73  Cost = pTo->rCos
2e630 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
2e640 20 6d 78 4f 75 74 20 3d 20 70 54 6f 2d 3e 6e 52   mxOut = pTo->nR
2e650 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow;.            
2e660 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20    mxI = jj;.    
2e670 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e680 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2e690 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23        }.    }..#
2e6a0 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
2e6b0 5f 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32  _ENABLED  /* >=2
2e6c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
2e6d0 74 65 33 57 68 65 72 65 54 72 61 63 65 3e 3d 32  te3WhereTrace>=2
2e6e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2e6f0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d  3DebugPrintf("--
2e700 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25  -- after round %
2e710 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70  d ----\n", iLoop
2e720 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
2e730 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e  0, pTo=aTo; ii<n
2e740 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29  To; ii++, pTo++)
2e750 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2e760 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
2e770 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77  s cost=%-3d nrow
2e780 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c  =%-3d order=%c",
2e790 0a 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72  .           wher
2e7a0 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
2e7b0 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
2e7c0 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
2e7d0 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  w,.           pT
2e7e0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  o->isOrderedVali
2e7f0 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65  d ? (pTo->isOrde
2e800 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29  red ? 'Y' : 'N')
2e810 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
2e820 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65   if( pTo->isOrde
2e830 72 65 64 56 61 6c 69 64 20 26 26 20 70 54 6f 2d  redValid && pTo-
2e840 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20 20  >isOrdered ){.  
2e850 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2e860 65 62 75 67 50 72 69 6e 74 66 28 22 20 72 65 76  ebugPrintf(" rev
2e870 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d  =0x%llx\n", pTo-
2e880 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  >revLoop);.     
2e890 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e8a0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2e8b0 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
2e8c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2e8d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
2e8e0 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f    /* Swap the ro
2e8f0 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64  les of aFrom and
2e900 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78   aTo for the nex
2e910 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  t generation */.
2e920 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b      pFrom = aTo;
2e930 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d  .    aTo = aFrom
2e940 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46  ;.    aFrom = pF
2e950 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d  rom;.    nFrom =
2e960 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28   nTo;.  }..  if(
2e970 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20   nFrom==0 ){.   
2e980 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2e990 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65  (pParse, "no que
2e9a0 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20  ry solution");. 
2e9b0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2e9c0 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20  (db, pSpace);.  
2e9d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e9e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20  ERROR;.  }.  .  
2e9f0 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65  /* Find the lowe
2ea00 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70  st cost path.  p
2ea10 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66  From will be lef
2ea20 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  t pointing to th
2ea30 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72  at path */.  pFr
2ea40 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f  om = aFrom;.  fo
2ea50 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d  r(ii=1; ii<nFrom
2ea60 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
2ea70 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46   pFrom->rCost>aF
2ea80 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20  rom[ii].rCost ) 
2ea90 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69  pFrom = &aFrom[i
2eaa0 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  i];.  }.  assert
2eab0 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
2eac0 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20  ==nLoop );.  /* 
2ead0 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20  Load the lowest 
2eae0 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70  cost path into p
2eaf0 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69  WInfo */.  for(i
2eb00 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c  Loop=0; iLoop<nL
2eb10 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20  oop; iLoop++){. 
2eb20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70     WhereLevel *p
2eb30 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e  Level = pWInfo->
2eb40 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70  a + iLoop;.    p
2eb50 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20  Level->pWLoop = 
2eb60 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e  pWLoop = pFrom->
2eb70 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20  aLoop[iLoop];.  
2eb80 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20    pLevel->iFrom 
2eb90 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a  = pWLoop->iTab;.
2eba0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62      pLevel->iTab
2ebb0 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Cur = pWInfo->pT
2ebc0 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
2ebd0 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72  ->iFrom].iCursor
2ebe0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57 49  ;.  }.  if( (pWI
2ebf0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2ec00 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
2ec10 54 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26 20  TINCT)!=0.   && 
2ec20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
2ec30 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
2ec40 49 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26 26  INCTBY)==0.   &&
2ec50 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
2ec60 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e  ct==WHERE_DISTIN
2ec70 43 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52  CT_NOOP.   && nR
2ec80 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42  owEst.  ){.    B
2ec90 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a  itmask notUsed;.
2eca0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65      int rc = whe
2ecb0 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
2ecc0 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70  rderBy(pWInfo, p
2ecd0 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65  WInfo->pResultSe
2ece0 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20  t, pFrom,.      
2ecf0 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
2ed00 5f 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f  _DISTINCTBY, nLo
2ed10 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  op-1, pFrom->aLo
2ed20 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f  op[nLoop-1], &no
2ed30 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20  tUsed);.    if( 
2ed40 72 63 3d 3d 31 20 29 20 70 57 49 6e 66 6f 2d 3e  rc==1 ) pWInfo->
2ed50 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
2ed60 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
2ed70 45 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46  ED;.  }.  if( pF
2ed80 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 20 29  rom->isOrdered )
2ed90 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  {.    if( pWInfo
2eda0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
2edb0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
2edc0 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
2edd0 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
2ede0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
2edf0 52 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  RED;.    }else{.
2ee00 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f        pWInfo->bO
2ee10 42 53 61 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  BSat = 1;.      
2ee20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20  pWInfo->revMask 
2ee30 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70  = pFrom->revLoop
2ee40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57  ;.    }.  }.  pW
2ee50 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20  Info->nRowOut = 
2ee60 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20  pFrom->nRow;..  
2ee70 2f 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72  /* Free temporar
2ee80 79 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74  y memory and ret
2ee90 75 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20  urn success */. 
2eea0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2eeb0 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65  b, pSpace);.  re
2eec0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2eed0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75  }../*.** Most qu
2eee0 65 72 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61  eries use only a
2eef0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74   single table (t
2ef00 68 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e  hey are not join
2ef10 73 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73  s) and have.** s
2ef20 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61  imple == constra
2ef30 69 6e 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64  ints against ind
2ef40 65 78 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68  exed fields.  Th
2ef50 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
2ef60 70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74  pts.** to plan t
2ef70 68 6f 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65  hose simple case
2ef80 73 20 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73  s using much les
2ef90 73 20 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20  s ceremony than 
2efa0 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70  the.** general-p
2efb0 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61  urpose query pla
2efc0 6e 6e 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62  nner, and thereb
2efd0 79 20 79 69 65 6c 64 20 66 61 73 74 65 72 20 73  y yield faster s
2efe0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29  qlite3_prepare()
2eff0 0a 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68  .** times for th
2f000 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a  e common case..*
2f010 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  *.** Return non-
2f020 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c  zero on success,
2f030 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20 63   if this query c
2f040 61 6e 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79  an be handled by
2f050 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c   this.** no-fril
2f060 6c 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  ls query planner
2f070 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69  .  Return zero i
2f080 66 20 74 68 69 73 20 71 75 65 72 79 20 6e 65 65  f this query nee
2f090 64 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72  ds the .** gener
2f0a0 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79  al-purpose query
2f0b0 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61   planner..*/.sta
2f0c0 74 69 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f  tic int whereSho
2f0d0 72 74 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42  rtCut(WhereLoopB
2f0e0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
2f0f0 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
2f100 70 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  pWInfo;.  struct
2f110 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2f120 49 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61  Item;.  WhereCla
2f130 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72  use *pWC;.  Wher
2f140 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
2f150 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
2f160 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20  ;.  int iCur;.  
2f170 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a  int j;.  Table *
2f180 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70  pTab;.  Index *p
2f190 49 64 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f  Idx;.  .  pWInfo
2f1a0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
2f1b0 6e 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  nfo;.  if( pWInf
2f1c0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
2f1d0 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c  WHERE_FORCE_TABL
2f1e0 45 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  E ) return 0;.  
2f1f0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
2f200 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d  pTabList->nSrc>=
2f210 31 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70  1 );.  pItem = p
2f220 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
2f230 3e 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74  >a;.  pTab = pIt
2f240 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20  em->pTab;.  if( 
2f250 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
2f260 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
2f270 28 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20  ( pItem->zIndex 
2f280 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43  ) return 0;.  iC
2f290 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  ur = pItem->iCur
2f2a0 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57  sor;.  pWC = &pW
2f2b0 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f  Info->sWC;.  pLo
2f2c0 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  op = pBuilder->p
2f2d0 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  New;.  pLoop->ws
2f2e0 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f  Flags = 0;.  pLo
2f2f0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  op->u.btree.nSki
2f300 70 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d  p = 0;.  pTerm =
2f310 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
2f320 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45  Cur, -1, 0, WO_E
2f330 51 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65  Q, 0);.  if( pTe
2f340 72 6d 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d  rm ){.    pLoop-
2f350 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
2f360 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
2f370 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f  _IPK|WHERE_ONERO
2f380 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c  W;.    pLoop->aL
2f390 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b  Term[0] = pTerm;
2f3a0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  .    pLoop->nLTe
2f3b0 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f  rm = 1;.    pLoo
2f3c0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  p->u.btree.nEq =
2f3d0 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e   1;.    /* TUNIN
2f3e0 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72 6f 77  G: Cost of a row
2f3f0 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20  id lookup is 10 
2f400 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52  */.    pLoop->rR
2f410 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d  un = 33;  /* 33=
2f420 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
2f430 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  0) */.  }else{. 
2f440 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
2f450 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
2f460 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
2f470 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2f480 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70   pLoop->aLTermSp
2f490 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65  ace==pLoop->aLTe
2f4a0 72 6d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  rm );.      asse
2f4b0 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70 4c  rt( ArraySize(pL
2f4c0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  oop->aLTermSpace
2f4d0 29 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 69 66  )==4 );.      if
2f4e0 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
2f4f0 3d 4f 45 5f 4e 6f 6e 65 20 0a 20 20 20 20 20 20  =OE_None .      
2f500 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49   || pIdx->pPartI
2f510 64 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20 20  dxWhere!=0 .    
2f520 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79     || pIdx->nKey
2f530 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28 70 4c  Col>ArraySize(pL
2f540 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  oop->aLTermSpace
2f550 29 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74 69  ) .      ) conti
2f560 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  nue;.      for(j
2f570 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; j<pIdx->nKey
2f580 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
2f590 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
2f5a0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70  erm(pWC, iCur, p
2f5b0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
2f5c0 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78  , 0, WO_EQ, pIdx
2f5d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2f5e0 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Term==0 ) break;
2f5f0 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
2f600 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72  aLTerm[j] = pTer
2f610 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
2f620 20 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b   if( j!=pIdx->nK
2f630 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65  eyCol ) continue
2f640 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77  ;.      pLoop->w
2f650 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
2f660 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f  OLUMN_EQ|WHERE_O
2f670 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45  NEROW|WHERE_INDE
2f680 58 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70  XED;.      if( p
2f690 49 64 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  Idx->isCovering 
2f6a0 7c 7c 20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73  || (pItem->colUs
2f6b0 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49  ed & ~columnsInI
2f6c0 6e 64 65 78 28 70 49 64 78 29 29 3d 3d 30 20 29  ndex(pIdx))==0 )
2f6d0 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  {.        pLoop-
2f6e0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
2f6f0 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20  E_IDX_ONLY;.    
2f700 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d    }.      pLoop-
2f710 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20  >nLTerm = j;.   
2f720 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
2f730 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20  e.nEq = j;.     
2f740 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2f750 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  pIndex = pIdx;. 
2f760 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
2f770 43 6f 73 74 20 6f 66 20 61 20 75 6e 69 71 75 65  Cost of a unique
2f780 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73   index lookup is
2f790 20 31 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f   15 */.      pLo
2f7a0 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20  op->rRun = 39;  
2f7b0 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65 33 4c 6f  /* 39==sqlite3Lo
2f7c0 67 45 73 74 28 31 35 29 20 2a 2f 0a 20 20 20 20  gEst(15) */.    
2f7d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2f7e0 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e   }.  if( pLoop->
2f7f0 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 70  wsFlags ){.    p
2f800 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f  Loop->nOut = (Lo
2f810 67 45 73 74 29 31 3b 0a 20 20 20 20 70 57 49 6e  gEst)1;.    pWIn
2f820 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20  fo->a[0].pWLoop 
2f830 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 6f  = pLoop;.    pLo
2f840 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67  op->maskSelf = g
2f850 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
2f860 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b  sMaskSet, iCur);
2f870 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  .    pWInfo->a[0
2f880 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75 72  ].iTabCur = iCur
2f890 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52  ;.    pWInfo->nR
2f8a0 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 69  owOut = 1;.    i
2f8b0 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
2f8c0 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 62 4f  rBy ) pWInfo->bO
2f8d0 42 53 61 74 20 3d 20 20 31 3b 0a 20 20 20 20 69  BSat =  1;.    i
2f8e0 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
2f8f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
2f900 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
2f910 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
2f920 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
2f930 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a  ISTINCT_UNIQUE;.
2f940 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
2f950 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c  ITE_DEBUG.    pL
2f960 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a  oop->cId = '0';.
2f970 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
2f980 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
2f990 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
2f9a0 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e  nerate the begin
2f9b0 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ning of the loop
2f9c0 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20   used for WHERE 
2f9d0 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
2f9e0 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  g..** The return
2f9f0 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e   value is a poin
2fa00 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65  ter to an opaque
2fa10 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2fa20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f  contains.** info
2fa30 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74  rmation needed t
2fa40 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
2fa50 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68  loop.  Later, th
2fa60 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
2fa70 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f  e.** should invo
2fa80 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ke sqlite3WhereE
2fa90 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65  nd() with the re
2faa0 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
2fab0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
2fac0 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c  n order to compl
2fad0 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ete the WHERE cl
2fae0 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
2faf0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
2fb00 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20  or occurs, this 
2fb10 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
2fb20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
2fb30 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f  basic idea is to
2fb40 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f   do a nested loo
2fb50 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20  p, one loop for 
2fb60 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a  each table in.**
2fb70 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2fb80 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28   of a select.  (
2fb90 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54  INSERT and UPDAT
2fba0 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  E statements are
2fbb0 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20   the.** same as 
2fbc0 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e  a SELECT with on
2fbd0 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
2fbe0 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
2fbf0 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65  ause.)  For.** e
2fc00 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53  xample, if the S
2fc10 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a  QL is this:.**.*
2fc20 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  *       SELECT *
2fc30 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33   FROM t1, t2, t3
2fc40 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a   WHERE ...;.**.*
2fc50 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20  * Then the code 
2fc60 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e  generated is con
2fc70 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74  ceptually like t
2fc80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
2fc90 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
2fca0 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20   row1 in t1 do  
2fcb0 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
2fcc0 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
2fcd0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
2fce0 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d  in t2 do      |-
2fcf0 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
2fd00 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20  eBegin().**     
2fd10 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
2fd20 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a  3 in t3 do   /.*
2fd30 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  *            ...
2fd40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64  .**          end
2fd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd60 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
2fd70 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
2fd80 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
2fd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d                |-
2fda0 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
2fdb0 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65  eEnd().**      e
2fdc0 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
2fdd0 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a             /.**.
2fde0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
2fdf0 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74   loops might not
2fe00 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68   be nested in th
2fe10 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68  e order in which
2fe20 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20   they.** appear 
2fe30 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2fe40 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e  se if a differen
2fe50 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65  t order is bette
2fe60 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a  r able to make.*
2fe70 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  * use of indices
2fe80 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61  .  Note also tha
2fe90 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70  t when the IN op
2fea0 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69  erator appears i
2feb0 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
2fec0 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20  lause, it might 
2fed0 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69  result in additi
2fee0 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70  onal nested loop
2fef0 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e  s for.** scannin
2ff00 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61  g through all va
2ff10 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68  lues on the righ
2ff20 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
2ff30 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  he IN..**.** The
2ff40 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72  re are Btree cur
2ff50 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
2ff60 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e  with each table.
2ff70 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72    t1 uses cursor
2ff80 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c  .** number pTabL
2ff90 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
2ffa0 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20  r.  t2 uses the 
2ffb0 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d  cursor pTabList-
2ffc0 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a  >a[1].iCursor..*
2ffd0 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  * And so forth. 
2ffe0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
2fff0 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
30000 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20  open those VDBE 
30010 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73  cursors.** and s
30020 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
30030 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
30040 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  ode to close the
30050 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  m..**.** The cod
30060 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68  e that sqlite3Wh
30070 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72  ereBegin() gener
30080 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20  ates leaves the 
30090 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a  cursors named.**
300a0 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69   in pTabList poi
300b0 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61  nting at their a
300c0 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69  ppropriate entri
300d0 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63  es.  The [...] c
300e0 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f  ode.** can use O
300f0 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f  P_Column and OP_
30100 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e  Rowid opcodes on
30110 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74   these cursors t
30120 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74  o extract.** dat
30130 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f  a from the vario
30140 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65  us tables of the
30150 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   loop..**.** If 
30160 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
30170 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66   is empty, the f
30180 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73  oreach loops mus
30190 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69  t each scan thei
301a0 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c  r.** entire tabl
301b0 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65  es.  Thus a thre
301c0 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e  e-way join is an
301d0 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f   O(N^3) operatio
301e0 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68  n.  But if.** th
301f0 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  e tables have in
30200 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20  dices and there 
30210 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  are terms in the
30220 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
30230 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  at.** refer to t
30240 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20  hose indices, a 
30250 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73  complete table s
30260 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64  can can be avoid
30270 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
30280 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68  de will run much
30290 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f   faster.  Most o
302a0 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68  f the work of th
302b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68  is routine is ch
302c0 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65  ecking.** to see
302d0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
302e0 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62  dices that can b
302f0 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  e used to speed 
30300 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  up the loop..**.
30310 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20  ** Terms of the 
30320 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65  WHERE clause are
30330 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69   also used to li
30340 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61  mit which rows a
30350 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20  ctually.** make 
30360 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20  it to the "..." 
30370 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
30380 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65   the loop.  Afte
30390 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22  r each "foreach"
303a0 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68  ,.** terms of th
303b0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
303c0 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72  hat use only ter
303d0 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20  ms in that loop 
303e0 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f  and outer.** loo
303f0 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ps are evaluated
30400 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20   and if false a 
30410 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f  jump is made aro
30420 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65  und all subseque
30430 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70  nt.** inner loop
30440 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65  s (or around the
30450 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65   "..." if the te
30460 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  st occurs within
30470 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d   the inner-.** m
30480 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20  ost loop).**.** 
30490 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a  OUTER JOINS.**.*
304a0 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20  * An outer join 
304b0 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64  of tables t1 and
304c0 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c   t2 is conceptal
304d0 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c  ly coded as foll
304e0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f  ows:.**.**    fo
304f0 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
30500 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67   do.**      flag
30510 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72   = 0.**      for
30520 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
30530 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61  do.**        sta
30540 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  rt:.**          
30550 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
30560 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20  flag = 1.**     
30570 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20   end.**      if 
30580 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  flag==0 then.** 
30590 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20         move the 
305a0 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61  row2 cursor to a
305b0 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20   null row.**    
305c0 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a      goto start.*
305d0 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20  *      fi.**    
305e0 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20  end.**.** ORDER 
305f0 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53  BY CLAUSE PROCES
30600 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65  SING.**.** pOrde
30610 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  rBy is a pointer
30620 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
30630 20 63 6c 61 75 73 65 20 28 6f 72 20 74 68 65 20   clause (or the 
30640 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a  GROUP BY clause.
30650 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52 45 5f  ** if the WHERE_
30660 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20  GROUPBY flag is 
30670 73 65 74 20 69 6e 20 77 63 74 72 6c 46 6c 61 67  set in wctrlFlag
30680 73 29 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  s) of a SELECT s
30690 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74  tatement.** if t
306a0 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66  here is one.  If
306b0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
306c0 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20  ER BY clause or 
306d0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
306e0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  ** is called fro
306f0 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  m an UPDATE or D
30700 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  ELETE statement,
30710 20 74 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69   then pOrderBy i
30720 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
30730 65 20 69 49 64 78 43 75 72 20 70 61 72 61 6d 65  e iIdxCur parame
30740 74 65 72 20 69 73 20 74 68 65 20 63 75 72 73 6f  ter is the curso
30750 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69  r number of an i
30760 6e 64 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48  ndex.  If .** WH
30770 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
30780 59 20 69 73 20 73 65 74 2c 20 69 49 64 78 43 75  Y is set, iIdxCu
30790 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  r is the cursor 
307a0 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64  number of an ind
307b0 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72  ex.** to use for
307c0 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65   OR clause proce
307d0 73 73 69 6e 67 2e 20 20 54 68 65 20 57 48 45 52  ssing.  The WHER
307e0 45 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  E clause should 
307f0 75 73 65 20 74 68 69 73 0a 2a 2a 20 73 70 65 63  use this.** spec
30800 69 66 69 63 20 63 75 72 73 6f 72 2e 20 20 49 66  ific cursor.  If
30810 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
30820 45 53 49 52 45 44 20 69 73 20 73 65 74 2c 20 74  ESIRED is set, t
30830 68 65 6e 20 69 49 64 78 43 75 72 20 69 73 0a 2a  hen iIdxCur is.*
30840 2a 20 74 68 65 20 66 69 72 73 74 20 63 75 72 73  * the first curs
30850 6f 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  or in an array o
30860 66 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c  f cursors for al
30870 6c 20 69 6e 64 69 63 65 73 2e 20 20 69 49 64 78  l indices.  iIdx
30880 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  Cur should.** be
30890 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
308a0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
308b0 20 63 75 72 73 6f 72 20 64 65 70 65 6e 64 69 6e   cursor dependin
308c0 67 20 6f 6e 20 77 68 69 63 68 20 69 6e 64 65 78  g on which index
308d0 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a   is.** used..*/.
308e0 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74  WhereInfo *sqlit
308f0 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20  e3WhereBegin(.  
30900 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
30910 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
30920 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
30930 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
30940 73 74 2c 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  st,    /* FROM c
30950 6c 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f 66  lause: A list of
30960 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62   all tables to b
30970 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45  e scanned */.  E
30980 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
30990 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
309a0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
309b0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
309c0 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20  ,   /* An ORDER 
309d0 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55  BY clause, or NU
309e0 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
309f0 20 2a 70 52 65 73 75 6c 74 53 65 74 2c 20 2f 2a   *pResultSet, /*
30a00 20 52 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   Result set of t
30a10 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 75 31  he query */.  u1
30a20 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20  6 wctrlFlags,   
30a30 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
30a40 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20  e WHERE_* flags 
30a50 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74  defined in sqlit
30a60 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20  eInt.h */.  int 
30a70 69 49 64 78 43 75 72 20 20 20 20 20 20 20 20 20  iIdxCur         
30a80 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e    /* If WHERE_ON
30a90 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73  ETABLE_ONLY is s
30aa0 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72  et, index cursor
30ab0 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
30ac0 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20  int nByteWInfo; 
30ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
30ae0 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  m. bytes allocat
30af0 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f  ed for WhereInfo
30b00 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74   struct */.  int
30b10 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20   nTabList;      
30b20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
30b30 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
30b40 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57   pTabList */.  W
30b50 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
30b60 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c  ;         /* Wil
30b70 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74  l become the ret
30b80 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
30b90 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
30ba0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
30bb0 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68  ->pVdbe;   /* Th
30bc0 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61  e virtual databa
30bd0 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42  se engine */.  B
30be0 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b  itmask notReady;
30bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
30c00 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
30c10 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64  t yet positioned
30c20 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42   */.  WhereLoopB
30c30 75 69 6c 64 65 72 20 73 57 4c 42 3b 20 20 20 20  uilder sWLB;    
30c40 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f   /* The WhereLoo
30c50 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57  p builder */.  W
30c60 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
30c70 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65  skSet;    /* The
30c80 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b   expression mask
30c90 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c   set */.  WhereL
30ca0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20  evel *pLevel;   
30cb0 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
30cc0 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f   level in pWInfo
30cd0 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  ->a[] */.  Where
30ce0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
30cf0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
30d00 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65   to a single Whe
30d10 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
30d20 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
30d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30d40 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
30d50 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
30d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30d70 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
30d80 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
30d90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30da0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
30db0 6f 64 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61  ode */...  /* Va
30dc0 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a  riable initializ
30dd0 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20  ation */.  db = 
30de0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65  pParse->db;.  me
30df0 6d 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73  mset(&sWLB, 0, s
30e00 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 20 20  izeof(sWLB));.  
30e10 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20  sWLB.pOrderBy = 
30e20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  pOrderBy;..  /* 
30e30 44 69 73 61 62 6c 65 20 74 68 65 20 44 49 53 54  Disable the DIST
30e40 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f  INCT optimizatio
30e50 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74  n if SQLITE_Dist
30e60 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20 76  inctOpt is set v
30e70 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ia.  ** sqlite3_
30e80 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45  test_ctrl(SQLITE
30e90 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
30ea0 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a  ZATIONS,...) */.
30eb0 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
30ec0 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
30ed0 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70  QLITE_DistinctOp
30ee0 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72 6c 46  t) ){.    wctrlF
30ef0 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 57  lags &= ~WHERE_W
30f00 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20  ANT_DISTINCT;.  
30f10 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62  }..  /* The numb
30f20 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
30f30 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
30f40 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68  is limited by th
30f50 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  e number of.  **
30f60 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61   bits in a Bitma
30f70 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  sk .  */.  testc
30f80 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e  ase( pTabList->n
30f90 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66  Src==BMS );.  if
30fa0 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
30fb0 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69  >BMS ){.    sqli
30fc0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
30fd0 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20  se, "at most %d 
30fe0 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e  tables in a join
30ff0 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74  ", BMS);.    ret
31000 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
31010 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   This function n
31020 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  ormally generate
31030 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  s a nested loop 
31040 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  for all tables i
31050 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74  n .  ** pTabList
31060 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57 48  .  But if the WH
31070 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
31080 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  Y flag is set, t
31090 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20  hen we should.  
310a0 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65  ** only generate
310b0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69   code for the fi
310c0 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61  rst table in pTa
310d0 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65  bList and assume
310e0 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63   that.  ** any c
310f0 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65  ursors associate
31100 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65 6e  d with subsequen
31110 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69  t tables are uni
31120 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
31130 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77  .  nTabList = (w
31140 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
31150 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
31160 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d   ? 1 : pTabList-
31170 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  >nSrc;..  /* All
31180 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
31190 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e  lize the WhereIn
311a0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
311b0 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
311c0 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61  e.  ** return va
311d0 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c  lue. A single al
311e0 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64  location is used
311f0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68   to store the Wh
31200 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72  ereInfo.  ** str
31210 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  uct, the content
31220 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61  s of WhereInfo.a
31230 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61  [], the WhereCla
31240 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  use structure.  
31250 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65  ** and the Where
31260 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
31270 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c  e. Since WhereCl
31280 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ause contains an
31290 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65   8-byte.  ** fie
312a0 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b  ld (type Bitmask
312b0 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69  ) it must be ali
312c0 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74  gned on an 8-byt
312d0 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20  e boundary on.  
312e0 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63  ** some architec
312f0 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65  tures. Hence the
31300 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e   ROUND8() below.
31310 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e  .  */.  nByteWIn
31320 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  fo = ROUND8(size
31330 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e  of(WhereInfo)+(n
31340 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f  TabList-1)*sizeo
31350 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a  f(WhereLevel));.
31360 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
31370 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
31380 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20  b, nByteWInfo + 
31390 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
313a0 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ));.  if( db->ma
313b0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
313c0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
313d0 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20  db, pWInfo);.   
313e0 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20   pWInfo = 0;.   
313f0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
31400 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49  Error;.  }.  pWI
31410 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
31420 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  s[0] = pWInfo->a
31430 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d  iCurOnePass[1] =
31440 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e   -1;.  pWInfo->n
31450 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74  Level = nTabList
31460 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  ;.  pWInfo->pPar
31470 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
31480 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20  WInfo->pTabList 
31490 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = pTabList;.  pW
314a0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d  Info->pOrderBy =
314b0 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49   pOrderBy;.  pWI
314c0 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 20  nfo->pResultSet 
314d0 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20  = pResultSet;.  
314e0 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d  pWInfo->iBreak =
314f0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
31500 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e  Label(v);.  pWIn
31510 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d  fo->wctrlFlags =
31520 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70   wctrlFlags;.  p
31530 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
31540 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d  ryLoop = pParse-
31550 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70  >nQueryLoop;.  p
31560 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66  MaskSet = &pWInf
31570 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73  o->sMaskSet;.  s
31580 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49  WLB.pWInfo = pWI
31590 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20  nfo;.  sWLB.pWC 
315a0 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a  = &pWInfo->sWC;.
315b0 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57    sWLB.pNew = (W
315c0 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61  hereLoop*)(((cha
315d0 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65  r*)pWInfo)+nByte
315e0 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  WInfo);.  assert
315f0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
31600 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77  GNMENT(sWLB.pNew
31610 29 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  ) );.  whereLoop
31620 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b  Init(sWLB.pNew);
31630 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
31640 45 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77  EBUG.  sWLB.pNew
31650 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e  ->cId = '*';.#en
31660 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20  dif..  /* Split 
31670 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
31680 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73   into separate s
31690 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68  ubexpressions wh
316a0 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75  ere each.  ** su
316b0 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
316c0 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41  eparated by an A
316d0 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  ND operator..  *
316e0 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28  /.  initMaskSet(
316f0 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65  pMaskSet);.  whe
31700 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26 70 57  reClauseInit(&pW
31710 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49 6e 66  Info->sWC, pWInf
31720 6f 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74  o);.  whereSplit
31730 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70  (&pWInfo->sWC, p
31740 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a  Where, TK_AND);.
31750 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
31760 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
31770 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74  , -1); /* Insert
31780 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69   the cookie veri
31790 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 20  fier Goto */.   
317a0 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63   .  /* Special c
317b0 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61  ase: a WHERE cla
317c0 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73  use that is cons
317d0 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20  tant.  Evaluate 
317e0 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  the.  ** express
317f0 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a  ion and either j
31800 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20  ump over all of 
31810 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c  the code or fall
31820 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 66 6f   thru..  */.  fo
31830 72 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c 42 2e  r(ii=0; ii<sWLB.
31840 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b  pWC->nTerm; ii++
31850 29 7b 0a 20 20 20 20 69 66 28 20 6e 54 61 62 4c  ){.    if( nTabL
31860 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ist==0 || sqlite
31870 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
31880 6f 74 4a 6f 69 6e 28 73 57 4c 42 2e 70 57 43 2d  otJoin(sWLB.pWC-
31890 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b  >a[ii].pExpr) ){
318a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
318b0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
318c0 2c 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69  , sWLB.pWC->a[ii
318d0 5d 2e 70 45 78 70 72 2c 20 70 57 49 6e 66 6f 2d  ].pExpr, pWInfo-
318e0 3e 69 42 72 65 61 6b 2c 0a 20 20 20 20 20 20 20  >iBreak,.       
318f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31900 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e    SQLITE_JUMPIFN
31910 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 57 4c 42  ULL);.      sWLB
31920 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 77 74 46 6c  .pWC->a[ii].wtFl
31930 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
31940 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  D;.    }.  }..  
31950 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
31960 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a   No FROM clause.
31970 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c    */.  if( nTabL
31980 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ist==0 ){.    if
31990 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 57 49  ( pOrderBy ) pWI
319a0 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 31 3b  nfo->bOBSat = 1;
319b0 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c  .    if( wctrlFl
319c0 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
319d0 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20  _DISTINCT ){.   
319e0 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
319f0 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
31a00 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20  TINCT_UNIQUE;.  
31a10 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73    }.  }..  /* As
31a20 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20  sign a bit from 
31a30 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65  the bitmask to e
31a40 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65  very term in the
31a50 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20   FROM clause..  
31a60 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73 73  **.  ** When ass
31a70 69 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20 76  igning bitmask v
31a80 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c  alues to FROM cl
31a90 61 75 73 65 20 63 75 72 73 6f 72 73 2c 20 69 74  ause cursors, it
31aa0 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 74 68   must be.  ** th
31ab0 65 20 63 61 73 65 20 74 68 61 74 20 69 66 20 58  e case that if X
31ac0 20 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20   is the bitmask 
31ad0 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 46 52 4f  for the N-th FRO
31ae0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68  M clause term th
31af0 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69 74 6d  en.  ** the bitm
31b00 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d  ask for all FROM
31b10 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 6f   clause terms to
31b20 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65   the left of the
31b30 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20   N-th term.  ** 
31b40 69 73 20 28 58 2d 31 29 2e 20 20 20 41 6e 20 65  is (X-1).   An e
31b50 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74  xpression from t
31b60 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20  he ON clause of 
31b70 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20  a LEFT JOIN can 
31b80 75 73 65 0a 20 20 2a 2a 20 69 74 73 20 45 78 70  use.  ** its Exp
31b90 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
31ba0 65 20 76 61 6c 75 65 20 74 6f 20 66 69 6e 64 20  e value to find 
31bb0 74 68 65 20 62 69 74 6d 61 73 6b 20 6f 66 20 74  the bitmask of t
31bc0 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20  he right table. 
31bd0 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e   ** of the join.
31be0 20 20 53 75 62 74 72 61 63 74 69 6e 67 20 6f 6e    Subtracting on
31bf0 65 20 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74  e from the right
31c00 20 74 61 62 6c 65 20 62 69 74 6d 61 73 6b 20 67   table bitmask g
31c10 69 76 65 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d  ives a.  ** bitm
31c20 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  ask for all tabl
31c30 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
31c40 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f  f the join.  Kno
31c50 77 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b  wing the bitmask
31c60 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61  .  ** for all ta
31c70 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
31c80 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20   of a left join 
31c90 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54  is important.  T
31ca0 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a  icket #3015..  *
31cb0 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  *.  ** Note that
31cc0 20 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72   bitmasks are cr
31cd0 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54  eated for all pT
31ce0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62  abList->nSrc tab
31cf0 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62  les in.  ** pTab
31d00 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74  List, not just t
31d10 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73  he first nTabLis
31d20 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c  t tables.  nTabL
31d30 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a  ist is normally.
31d40 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70 54    ** equal to pT
31d50 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75 74  abList->nSrc but
31d60 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65   might be shorte
31d70 6e 65 64 20 74 6f 20 31 20 69 66 20 74 68 65 0a  ned to 1 if the.
31d80 20 20 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41    ** WHERE_ONETA
31d90 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73  BLE_ONLY flag is
31da0 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   set..  */.  for
31db0 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69  (ii=0; ii<pTabLi
31dc0 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b  st->nSrc; ii++){
31dd0 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28  .    createMask(
31de0 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
31df0 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f  st->a[ii].iCurso
31e00 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  r);.  }.#ifndef 
31e10 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42  NDEBUG.  {.    B
31e20 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74  itmask toTheLeft
31e30 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69   = 0;.    for(ii
31e40 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d  =0; ii<pTabList-
31e50 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  >nSrc; ii++){.  
31e60 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20      Bitmask m = 
31e70 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
31e80 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69  , pTabList->a[ii
31e90 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].iCursor);.    
31ea0 20 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d    assert( (m-1)=
31eb0 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20  =toTheLeft );.  
31ec0 20 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d      toTheLeft |=
31ed0 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   m;.    }.  }.#e
31ee0 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79  ndif..  /* Analy
31ef0 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75  ze all of the su
31f00 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e  bexpressions.  N
31f10 6f 74 65 20 74 68 61 74 20 65 78 70 72 41 6e 61  ote that exprAna
31f20 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a  lyze() might.  *
31f30 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74 75 61  * add new virtua
31f40 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65  l terms onto the
31f50 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
31f60 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f  E clause.  We do
31f70 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74   not.  ** want t
31f80 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20  o analyze these 
31f90 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73  virtual terms, s
31fa0 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e  o start analyzin
31fb0 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a  g at the end.  *
31fc0 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61  * and work forwa
31fd0 72 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 61  rd so that the a
31fe0 64 64 65 64 20 76 69 72 74 75 61 6c 20 74 65 72  dded virtual ter
31ff0 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f  ms are never pro
32000 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  cessed..  */.  e
32010 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54  xprAnalyzeAll(pT
32020 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d  abList, &pWInfo-
32030 3e 73 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d  >sWC);.  if( db-
32040 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
32050 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
32060 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a  eginError;.  }..
32070 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45    /* If the ORDE
32080 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42  R BY (or GROUP B
32090 59 29 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  Y) clause contai
320a0 6e 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ns references to
320b0 20 67 65 6e 65 72 61 6c 0a 20 20 2a 2a 20 65 78   general.  ** ex
320c0 70 72 65 73 73 69 6f 6e 73 2c 20 74 68 65 6e 20  pressions, then 
320d0 77 65 20 77 6f 6e 27 74 20 62 65 20 61 62 6c 65  we won't be able
320e0 20 74 6f 20 73 61 74 69 73 66 79 20 69 74 20 75   to satisfy it u
320f0 73 69 6e 67 20 69 6e 64 69 63 65 73 2c 20 73 6f  sing indices, so
32100 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61  .  ** go ahead a
32110 6e 64 20 64 69 73 61 62 6c 65 20 69 74 20 6e 6f  nd disable it no
32120 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  w..  */.  if( pO
32130 72 64 65 72 42 79 20 26 26 20 28 77 63 74 72 6c  rderBy && (wctrl
32140 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
32150 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 20  NT_DISTINCT)!=0 
32160 29 7b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  ){.    for(ii=0;
32170 20 69 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45   ii<pOrderBy->nE
32180 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  xpr; ii++){.    
32190 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
321a0 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
321b0 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d  ollate(pOrderBy-
321c0 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20  >a[ii].pExpr);. 
321d0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
321e0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op!=TK_COLUMN ){
321f0 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
32200 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
32210 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
32220 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
32230 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
32240 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
32250 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
32260 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
32270 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
32280 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
32290 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 69 66 28  TINCT ){.    if(
322a0 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e   isDistinctRedun
322b0 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61  dant(pParse, pTa
322c0 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e  bList, &pWInfo->
322d0 73 57 43 2c 20 70 52 65 73 75 6c 74 53 65 74 29  sWC, pResultSet)
322e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
322f0 20 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e   DISTINCT markin
32300 67 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20  g is pointless. 
32310 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20   Ignore it. */. 
32320 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
32330 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
32340 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a  ISTINCT_UNIQUE;.
32350 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
32360 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
32370 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44     /* Try to ORD
32380 45 52 20 42 59 20 74 68 65 20 72 65 73 75 6c 74  ER BY the result
32390 20 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69 73   set to make dis
323a0 74 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e 67  tinct processing
323b0 20 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20 20   easier */.     
323c0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
323d0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49 53  ags |= WHERE_DIS
323e0 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20 70  TINCTBY;.      p
323f0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
32400 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20  = pResultSet;.  
32410 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f    }.  }..  /* Co
32420 6e 73 74 72 75 63 74 20 74 68 65 20 57 68 65 72  nstruct the Wher
32430 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f  eLoop objects */
32440 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
32450 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d  ffff,("*** Optim
32460 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e  izer Start ***\n
32470 22 29 29 3b 0a 20 20 2f 2a 20 44 69 73 70 6c 61  "));.  /* Displa
32480 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  y all terms of t
32490 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
324a0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57  */.#if defined(W
324b0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
324c0 44 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  D) && defined(SQ
324d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
324e0 5f 45 58 50 4c 41 49 4e 29 0a 20 20 69 66 28 20  _EXPLAIN).  if( 
324f0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
32500 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
32510 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65   int i;.    Vdbe
32520 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
32530 64 62 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dbe;.    sqlite3
32540 45 78 70 6c 61 69 6e 42 65 67 69 6e 28 76 29 3b  ExplainBegin(v);
32550 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
32560 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b  sWLB.pWC->nTerm;
32570 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
32580 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
32590 66 28 76 2c 20 22 23 25 2d 32 64 20 22 2c 20 69  f(v, "#%-2d ", i
325a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
325b0 45 78 70 6c 61 69 6e 50 75 73 68 28 76 29 3b 0a  ExplainPush(v);.
325c0 20 20 20 20 20 20 77 68 65 72 65 45 78 70 6c 61        whereExpla
325d0 69 6e 54 65 72 6d 28 76 2c 20 26 73 57 4c 42 2e  inTerm(v, &sWLB.
325e0 70 57 43 2d 3e 61 5b 69 5d 29 3b 0a 20 20 20 20  pWC->a[i]);.    
325f0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
32600 50 6f 70 28 76 29 3b 0a 20 20 20 20 20 20 73 71  Pop(v);.      sq
32610 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 76  lite3ExplainNL(v
32620 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
32630 69 74 65 33 45 78 70 6c 61 69 6e 46 69 6e 69 73  ite3ExplainFinis
32640 68 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  h(v);.    sqlite
32650 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 73  3DebugPrintf("%s
32660 22 2c 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  ", sqlite3VdbeEx
32670 70 6c 61 6e 61 74 69 6f 6e 28 76 29 29 3b 0a 20  planation(v));. 
32680 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
32690 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20 77  nTabList!=1 || w
326a0 68 65 72 65 53 68 6f 72 74 43 75 74 28 26 73 57  hereShortCut(&sW
326b0 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  LB)==0 ){.    rc
326c0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41   = whereLoopAddA
326d0 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20 20 69  ll(&sWLB);.    i
326e0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65  f( rc ) goto whe
326f0 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
32700 0a 20 20 20 20 2f 2a 20 44 69 73 70 6c 61 79 20  .    /* Display 
32710 61 6c 6c 20 6f 66 20 74 68 65 20 57 68 65 72 65  all of the Where
32720 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69 66 20  Loop objects if 
32730 77 68 65 72 65 74 72 61 63 65 20 69 73 20 65 6e  wheretrace is en
32740 61 62 6c 65 64 20 2a 2f 0a 23 69 66 64 65 66 20  abled */.#ifdef 
32750 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
32760 45 44 20 2f 2a 20 21 3d 30 20 2a 2f 0a 20 20 20  ED /* !=0 */.   
32770 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
32780 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eTrace ){.      
32790 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20  WhereLoop *p;.  
327a0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
327b0 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4c 61   static char zLa
327c0 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35 36  bel[] = "0123456
327d0 37 38 39 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d  789abcdefghijklm
327e0 6e 6f 70 71 72 73 74 75 76 77 79 78 7a 22 0a 20  nopqrstuvwyxz". 
327f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32810 20 20 20 20 20 20 22 41 42 43 44 45 46 47 48 49        "ABCDEFGHI
32820 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58  JKLMNOPQRSTUVWYX
32830 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d  Z";.      for(p=
32840 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
32850 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  i=0; p; p=p->pNe
32860 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20  xtLoop, i++){.  
32870 20 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a        p->cId = z
32880 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a  Label[i%sizeof(z
32890 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20  Label)];.       
328a0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
328b0 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20  p, sWLB.pWC);.  
328c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
328d0 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50  if.  .    whereP
328e0 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f  athSolver(pWInfo
328f0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62  , 0);.    if( db
32900 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
32910 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
32920 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70  Error;.    if( p
32930 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
32940 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65 50  ){.       whereP
32950 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f  athSolver(pWInfo
32960 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  , pWInfo->nRowOu
32970 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28  t+1);.       if(
32980 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
32990 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
329a0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ginError;.    }.
329b0 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f    }.  if( pWInfo
329c0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ->pOrderBy==0 &&
329d0 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
329e0 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65  LITE_ReverseOrde
329f0 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57  r)!=0 ){.     pW
32a00 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
32a10 28 42 69 74 6d 61 73 6b 29 28 2d 31 29 3b 0a 20  (Bitmask)(-1);. 
32a20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
32a30 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45 52 28 64  >nErr || NEVER(d
32a40 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
32a50 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
32a60 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
32a70 7d 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  }.#ifdef WHERETR
32a80 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 21  ACE_ENABLED /* !
32a90 3d 30 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  =0 */.  if( sqli
32aa0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b  te3WhereTrace ){
32ab0 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
32ac0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
32ad0 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69  ntf("---- Soluti
32ae0 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49  on nRow=%d", pWI
32af0 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20  nfo->nRowOut);. 
32b00 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 62     if( pWInfo->b
32b10 4f 42 53 61 74 20 29 7b 0a 20 20 20 20 20 20 73  OBSat ){.      s
32b20 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
32b30 66 28 22 20 4f 52 44 45 52 42 59 3d 30 78 25 6c  f(" ORDERBY=0x%l
32b40 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76  lx", pWInfo->rev
32b50 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Mask);.    }.   
32b60 20 73 77 69 74 63 68 28 20 70 57 49 6e 66 6f 2d   switch( pWInfo-
32b70 3e 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  >eDistinct ){.  
32b80 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
32b90 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20  ISTINCT_UNIQUE: 
32ba0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
32bb0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
32bc0 44 49 53 54 49 4e 43 54 3d 75 6e 69 71 75 65 22  DISTINCT=unique"
32bd0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
32be0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32bf0 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
32c00 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20  NCT_ORDERED: {. 
32c10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
32c20 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
32c30 54 49 4e 43 54 3d 6f 72 64 65 72 65 64 22 29 3b  TINCT=ordered");
32c40 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
32c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
32c60 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  se WHERE_DISTINC
32c70 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20  T_UNORDERED: {. 
32c80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
32c90 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
32ca0 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64 22  TINCT=unordered"
32cb0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
32cc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32cd0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
32ce0 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
32cf0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
32d00 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
32d10 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72  i++){.      wher
32d20 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e 66  eLoopPrint(pWInf
32d30 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c  o->a[ii].pWLoop,
32d40 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20   sWLB.pWC);.    
32d50 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f  }.  }.#endif.  /
32d60 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69  * Attempt to omi
32d70 74 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74 68  t tables from th
32d80 65 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e  e join that do n
32d90 6f 74 20 65 66 66 65 63 74 20 74 68 65 20 72 65  ot effect the re
32da0 73 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20 70 57  sult */.  if( pW
32db0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a  Info->nLevel>=2.
32dc0 20 20 20 26 26 20 70 52 65 73 75 6c 74 53 65 74     && pResultSet
32dd0 21 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69  !=0.   && Optimi
32de0 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
32df0 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f  , SQLITE_OmitNoo
32e00 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20  pJoin).  ){.    
32e10 42 69 74 6d 61 73 6b 20 74 61 62 55 73 65 64 20  Bitmask tabUsed 
32e20 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
32e30 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
32e40 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20  ResultSet);.    
32e50 69 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42  if( sWLB.pOrderB
32e60 79 20 29 20 74 61 62 55 73 65 64 20 7c 3d 20 65  y ) tabUsed |= e
32e70 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
32e80 65 28 70 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42  e(pMaskSet, sWLB
32e90 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  .pOrderBy);.    
32ea0 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 6e  while( pWInfo->n
32eb0 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20 20 20 20  Level>=2 ){.    
32ec0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
32ed0 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20  rm, *pEnd;.     
32ee0 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d   pLoop = pWInfo-
32ef0 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  >a[pWInfo->nLeve
32f00 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20  l-1].pWLoop;.   
32f10 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
32f20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f  pTabList->a[pLoo
32f30 70 2d 3e 69 54 61 62 5d 2e 6a 6f 69 6e 74 79 70  p->iTab].jointyp
32f40 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20  e & JT_LEFT)==0 
32f50 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
32f60 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
32f70 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
32f80 49 4e 43 54 29 3d 3d 30 0a 20 20 20 20 20 20 20  INCT)==0.       
32f90 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
32fa0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
32fb0 57 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  W)==0.      ){. 
32fc0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
32fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
32fe0 28 74 61 62 55 73 65 64 20 26 20 70 4c 6f 6f 70  (tabUsed & pLoop
32ff0 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29  ->maskSelf)!=0 )
33000 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 45   break;.      pE
33010 6e 64 20 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61  nd = sWLB.pWC->a
33020 20 2b 20 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65   + sWLB.pWC->nTe
33030 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54  rm;.      for(pT
33040 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b  erm=sWLB.pWC->a;
33050 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65   pTerm<pEnd; pTe
33060 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
33070 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
33080 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  qAll & pLoop->ma
33090 73 6b 53 65 6c 66 29 21 3d 30 0a 20 20 20 20 20  skSelf)!=0.     
330a0 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50      && !ExprHasP
330b0 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
330c0 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
330d0 6e 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  n).        ){.  
330e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
330f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
33100 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
33110 3c 70 45 6e 64 20 29 20 62 72 65 61 6b 3b 0a 20  <pEnd ) break;. 
33120 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
33130 30 78 66 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f  0xffff, ("-> dro
33140 70 20 6c 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73  p loop %c not us
33150 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49  ed\n", pLoop->cI
33160 64 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  d));.      pWInf
33170 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20  o->nLevel--;.   
33180 20 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20     nTabList--;. 
33190 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45     }.  }.  WHERE
331a0 54 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a  TRACE(0xffff,("*
331b0 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e  ** Optimizer Fin
331c0 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  ished ***\n"));.
331d0 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65    pWInfo->pParse
331e0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20  ->nQueryLoop += 
331f0 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b  pWInfo->nRowOut;
33200 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
33210 6c 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54  ller is an UPDAT
33220 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
33230 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65  ement that is re
33240 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f  questing.  ** to
33250 20 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20   use a one-pass 
33260 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72  algorithm, deter
33270 6d 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20  mine if this is 
33280 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a  appropriate..  *
33290 2a 20 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61  * The one-pass a
332a0 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f  lgorithm only wo
332b0 72 6b 73 20 69 66 20 74 68 65 20 57 48 45 52 45  rks if the WHERE
332c0 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
332d0 6e 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74  ns.  ** the stat
332e0 65 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20  ement to update 
332f0 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20  a single row..  
33300 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  */.  assert( (wc
33310 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
33320 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
33330 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e  )==0 || pWInfo->
33340 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69  nLevel==1 );.  i
33350 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
33360 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
33370 45 53 49 52 45 44 29 21 3d 30 20 0a 20 20 20 26  ESIRED)!=0 .   &
33380 26 20 28 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  & (pWInfo->a[0].
33390 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  pWLoop->wsFlags 
333a0 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21  & WHERE_ONEROW)!
333b0 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f  =0 ){.    pWInfo
333c0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b  ->okOnePass = 1;
333d0 0a 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69  .    if( HasRowi
333e0 64 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  d(pTabList->a[0]
333f0 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  .pTab) ){.      
33400 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
33410 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20  oop->wsFlags &= 
33420 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b  ~WHERE_IDX_ONLY;
33430 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
33440 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73   Open all tables
33450 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
33460 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73   and any indices
33470 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20   selected for.  
33480 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f  ** searching tho
33490 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
334a0 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42    notReady = ~(B
334b0 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28  itmask)0;.  for(
334c0 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  ii=0, pLevel=pWI
334d0 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c  nfo->a; ii<nTabL
334e0 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65  ist; ii++, pLeve
334f0 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  l++){.    Table 
33500 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61  *pTab;     /* Ta
33510 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
33520 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20     int iDb;     
33530 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
33540 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
33550 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20  ing table/index 
33560 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  */.    struct Sr
33570 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
33580 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49  Item;..    pTabI
33590 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
335a0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
335b0 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54  ];.    pTab = pT
335c0 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
335d0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
335e0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
335f0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
33600 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  .    pLoop = pLe
33610 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20  vel->pWLoop;.   
33620 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46   if( (pTab->tabF
33630 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
33640 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d  ral)!=0 || pTab-
33650 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
33660 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
33670 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66  */.    }else.#if
33680 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
33690 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
336a0 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
336b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
336c0 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
336d0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
336e0 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e  ar *pVTab = (con
336f0 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
33700 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
33710 54 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  Tab);.      int 
33720 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
33730 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
33740 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
33750 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69  4(v, OP_VOpen, i
33760 43 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62  Cur, 0, 0, pVTab
33770 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
33780 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74  }else if( IsVirt
33790 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
337a0 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20     /* noop */.  
337b0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
337c0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
337d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
337e0 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20  DX_ONLY)==0.    
337f0 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c       && (wctrlFl
33800 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54  ags & WHERE_OMIT
33810 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20  _OPEN_CLOSE)==0 
33820 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  ){.      int op 
33830 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20  = OP_OpenRead;. 
33840 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d       if( pWInfo-
33850 3e 6f 6b 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20  >okOnePass ){.  
33860 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70        op = OP_Op
33870 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20  enWrite;.       
33880 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
33890 65 50 61 73 73 5b 30 5d 20 3d 20 70 54 61 62 49  ePass[0] = pTabI
338a0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
338b0 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c      };.      sql
338c0 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
338d0 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  arse, pTabItem->
338e0 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54  iCursor, iDb, pT
338f0 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 61  ab, op);.      a
33900 73 73 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d  ssert( pTabItem-
33910 3e 69 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c  >iCursor==pLevel
33920 2d 3e 69 54 61 62 43 75 72 20 29 3b 0a 20 20 20  ->iTabCur );.   
33930 20 20 20 74 65 73 74 63 61 73 65 28 20 21 70 57     testcase( !pW
33940 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
33950 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42  && pTab->nCol==B
33960 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  MS-1 );.      te
33970 73 74 63 61 73 65 28 20 21 70 57 49 6e 66 6f 2d  stcase( !pWInfo-
33980 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54  >okOnePass && pT
33990 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b  ab->nCol==BMS );
339a0 0a 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e  .      if( !pWIn
339b0 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26  fo->okOnePass &&
339c0 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20   pTab->nCol<BMS 
339d0 26 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  && HasRowid(pTab
339e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74  ) ){.        Bit
339f0 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65  mask b = pTabIte
33a00 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20  m->colUsed;.    
33a10 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20      int n = 0;. 
33a20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20         for(; b; 
33a30 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20  b=b>>1, n++){}. 
33a40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
33a50 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 73 71  beChangeP4(v, sq
33a60 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
33a70 41 64 64 72 28 76 29 2d 31 2c 20 0a 20 20 20 20  Addr(v)-1, .    
33a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a90 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
33aa0 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34  NT_TO_PTR(n), P4
33ab0 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20  _INT32);.       
33ac0 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62   assert( n<=pTab
33ad0 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
33ae0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
33af0 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
33b00 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
33b10 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
33b20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
33b30 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
33b40 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
33b50 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20  RE_INDEXED ){.  
33b60 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d      Index *pIx =
33b70 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
33b80 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 6e  pIndex;.      in
33b90 74 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20  t iIndexCur;.   
33ba0 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f     int op = OP_O
33bb0 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 2f  penRead;.      /
33bc0 2a 20 69 49 64 78 43 75 72 20 69 73 20 61 6c 77  * iIdxCur is alw
33bd0 61 79 73 20 73 65 74 20 69 66 20 74 6f 20 61 20  ays set if to a 
33be0 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69  positive value i
33bf0 66 20 4f 4e 45 50 41 53 53 20 69 73 20 70 6f 73  f ONEPASS is pos
33c00 73 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61  sible */.      a
33c10 73 73 65 72 74 28 20 69 49 64 78 43 75 72 21 3d  ssert( iIdxCur!=
33c20 30 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63  0 || (pWInfo->wc
33c30 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
33c40 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
33c50 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )==0 );.      if
33c60 28 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50  ( pWInfo->okOneP
33c70 61 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 49  ass ){.        I
33c80 6e 64 65 78 20 2a 70 4a 20 3d 20 70 54 61 62 49  ndex *pJ = pTabI
33c90 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65  tem->pTab->pInde
33ca0 78 3b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65  x;.        iInde
33cb0 78 43 75 72 20 3d 20 69 49 64 78 43 75 72 3b 0a  xCur = iIdxCur;.
33cc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
33cd0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
33ce0 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
33cf0 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68  ED );.        wh
33d00 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4a 29 20  ile( ALWAYS(pJ) 
33d10 26 26 20 70 4a 21 3d 70 49 78 20 29 7b 0a 20 20  && pJ!=pIx ){.  
33d20 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
33d30 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  r++;.          p
33d40 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b 0a 20  J = pJ->pNext;. 
33d50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33d60 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69   op = OP_OpenWri
33d70 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e  te;.        pWIn
33d80 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
33d90 5b 31 5d 20 3d 20 69 49 6e 64 65 78 43 75 72 3b  [1] = iIndexCur;
33da0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
33db0 20 69 49 64 78 43 75 72 20 26 26 20 28 77 63 74   iIdxCur && (wct
33dc0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
33dd0 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d  ONETABLE_ONLY)!=
33de0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49 6e  0 ){.        iIn
33df0 64 65 78 43 75 72 20 3d 20 69 49 64 78 43 75 72  dexCur = iIdxCur
33e00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
33e10 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
33e20 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
33e30 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
33e40 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
33e50 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20   = iIndexCur;.  
33e60 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d      assert( pIx-
33e70 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
33e80 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
33e90 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 43   assert( iIndexC
33ea0 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ur>=0 );.      s
33eb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
33ec0 28 76 2c 20 6f 70 2c 20 69 49 6e 64 65 78 43 75  (v, op, iIndexCu
33ed0 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44  r, pIx->tnum, iD
33ee0 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
33ef0 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
33f00 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a  o(pParse, pIx);.
33f10 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
33f20 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d  t((v, "%s", pIx-
33f30 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  >zName));.    }.
33f40 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
33f50 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
33f60 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 6e 6f  se, iDb);.    no
33f70 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61  tReady &= ~getMa
33f80 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
33f90 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e  kSet, pTabItem->
33fa0 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20  iCursor);.  }.  
33fb0 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73  pWInfo->iTop = s
33fc0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
33fd0 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
33fe0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
33ff0 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
34000 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47  inError;..  /* G
34010 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
34020 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63   to do the searc
34030 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69  h.  Each iterati
34040 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20  on of the for.  
34050 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65  ** loop below ge
34060 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72  nerates code for
34070 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64   a single nested
34080 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a   loop of the VM.
34090 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20    ** program..  
340a0 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20  */.  notReady = 
340b0 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66  ~(Bitmask)0;.  f
340c0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62  or(ii=0; ii<nTab
340d0 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  List; ii++){.   
340e0 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
340f0 6f 2d 3e 61 5b 69 69 5d 3b 0a 23 69 66 6e 64 65  o->a[ii];.#ifnde
34100 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
34110 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20  TOMATIC_INDEX.  
34120 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
34130 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
34140 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
34150 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  X)!=0 ){.      c
34160 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69  onstructAutomati
34170 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26  cIndex(pParse, &
34180 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a 20 20 20  pWInfo->sWC,.   
34190 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54               &pT
341a0 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
341b0 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61  ->iFrom], notRea
341c0 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20  dy, pLevel);.   
341d0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
341e0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
341f0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
34200 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
34210 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
34220 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
34230 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c 20 70 4c  , pLevel, ii, pL
34240 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74  evel->iFrom, wct
34250 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 70 4c  rlFlags);.    pL
34260 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 20 3d  evel->addrBody =
34270 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
34280 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
34290 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f 64 65 4f  notReady = codeO
342a0 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e  neLoopStart(pWIn
342b0 66 6f 2c 20 69 69 2c 20 6e 6f 74 52 65 61 64 79  fo, ii, notReady
342c0 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69  );.    pWInfo->i
342d0 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65  Continue = pLeve
342e0 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 7d  l->addrCont;.  }
342f0 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a  ..  /* Done. */.
34300 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
34310 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57  ent((v, "Begin W
34320 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20  HERE-core"));.  
34330 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a  return pWInfo;..
34340 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
34350 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  f malloc fails *
34360 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  /.whereBeginErro
34370 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20  r:.  if( pWInfo 
34380 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
34390 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e  QueryLoop = pWIn
343a0 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
343b0 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 49 6e  oop;.    whereIn
343c0 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
343d0 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
343e0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
343f0 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  erate the end of
34400 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e   the WHERE loop.
34410 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f    See comments o
34420 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65  n .** sqlite3Whe
34430 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64  reBegin() for ad
34440 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
34450 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
34460 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57 68  lite3WhereEnd(Wh
34470 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
34480 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
34490 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
344a0 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  se;.  Vdbe *v = 
344b0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
344c0 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c   int i;.  WhereL
344d0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20  evel *pLevel;.  
344e0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
344f0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
34500 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
34510 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69  pTabList;.  sqli
34520 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
34530 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  ->db;..  /* Gene
34540 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  rate loop termin
34550 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f  ation code..  */
34560 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d  .  VdbeModuleCom
34570 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48  ment((v, "End WH
34580 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 73  ERE-core"));.  s
34590 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
345a0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
345b0 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c  for(i=pWInfo->nL
345c0 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  evel-1; i>=0; i-
345d0 2d 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  -){.    int addr
345e0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  ;.    pLevel = &
345f0 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
34600 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
34610 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 73 71  ->pWLoop;.    sq
34620 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
34630 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
34640 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20  >addrCont);.    
34650 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d  if( pLevel->op!=
34660 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
34670 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34680 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  p2(v, pLevel->op
34690 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
346a0 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20  evel->p2);.     
346b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
346c0 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  geP5(v, pLevel->
346d0 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  p5);.    }.    i
346e0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
346f0 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  s & WHERE_IN_ABL
34700 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  E && pLevel->u.i
34710 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20  n.nIn>0 ){.     
34720 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a   struct InLoop *
34730 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  pIn;.      int j
34740 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
34750 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
34760 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e  v, pLevel->addrN
34770 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  xt);.      for(j
34780 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49  =pLevel->u.in.nI
34790 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e  n, pIn=&pLevel->
347a0 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31  u.in.aInLoop[j-1
347b0 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e  ]; j>0; j--, pIn
347c0 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  --){.        sql
347d0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
347e0 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  (v, pIn->addrInT
347f0 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73  op+1);.        s
34800 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
34810 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f  (v, pIn->eEndLoo
34820 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20  pOp, pIn->iCur, 
34830 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b  pIn->addrInTop);
34840 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34850 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
34860 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31  pIn->addrInTop-1
34870 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
34880 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
34890 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  b, pLevel->u.in.
348a0 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a  aInLoop);.    }.
348b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
348c0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
348d0 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
348e0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
348f0 3e 61 64 64 72 53 6b 69 70 20 29 7b 0a 20 20 20  >addrSkip ){.   
34900 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34910 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
34920 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72   0, pLevel->addr
34930 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 56 64 62  Skip);.      Vdb
34940 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65  eComment((v, "ne
34950 78 74 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20  xt skip-scan on 
34960 25 73 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  %s", pLoop->u.bt
34970 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
34980 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e));.      sqlit
34990 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
349a0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b  , pLevel->addrSk
349b0 69 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ip);.      sqlit
349c0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
349d0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b  , pLevel->addrSk
349e0 69 70 2d 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ip-2);.    }.   
349f0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
34a00 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
34a10 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
34a20 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
34a30 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  fPos, pLevel->iL
34a40 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20  eftJoin);.      
34a50 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
34a60 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
34a70 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20  IDX_ONLY)==0.   
34a80 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f          || (pLoo
34a90 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
34aa0 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29  RE_INDEXED)!=0 )
34ab0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f  ;.      if( (pLo
34ac0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
34ad0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
34ae0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
34af0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
34b00 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61   OP_NullRow, pTa
34b10 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
34b20 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
34b30 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
34b40 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
34b50 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20  NDEXED ){.      
34b60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34b70 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
34b80 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  w, pLevel->iIdxC
34b90 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ur);.      }.   
34ba0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
34bb0 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a  p==OP_Return ){.
34bc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
34bd0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
34be0 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70  Gosub, pLevel->p
34bf0 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46  1, pLevel->addrF
34c00 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  irst);.      }el
34c10 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
34c20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
34c30 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
34c40 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
34c50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
34c60 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
34c70 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
34c80 20 7d 0a 20 20 20 20 56 64 62 65 4d 6f 64 75 6c   }.    VdbeModul
34c90 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e  eComment((v, "En
34ca0 64 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20  d WHERE-loop%d: 
34cb0 25 73 22 2c 20 69 2c 0a 20 20 20 20 20 20 20 20  %s", i,.        
34cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
34cd0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
34ce0 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e  [pLevel->iFrom].
34cf0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
34d00 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72   }..  /* The "br
34d10 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65  eak" point is he
34d20 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68  re, just past th
34d30 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74  e end of the out
34d40 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65  er loop..  ** Se
34d50 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  t it..  */.  sql
34d60 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
34d70 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e  abel(v, pWInfo->
34d80 69 42 72 65 61 6b 29 3b 0a 0a 20 20 61 73 73 65  iBreak);..  asse
34d90 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  rt( pWInfo->nLev
34da0 65 6c 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53  el<=pTabList->nS
34db0 72 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  rc );.  for(i=0,
34dc0 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
34dd0 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  a; i<pWInfo->nLe
34de0 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c  vel; i++, pLevel
34df0 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  ++){.    Index *
34e00 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 73 74  pIdx = 0;.    st
34e10 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
34e20 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70  m *pTabItem = &p
34e30 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
34e40 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54  l->iFrom];.    T
34e50 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
34e60 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
34e70 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
34e80 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20   );.    pLoop = 
34e90 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
34ea0 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  .    /* Close al
34eb0 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73  l of the cursors
34ec0 20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65   that were opene
34ed0 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  d by sqlite3Wher
34ee0 65 42 65 67 69 6e 2e 0a 20 20 20 20 2a 2a 20 45  eBegin..    ** E
34ef0 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 63 6c  xcept, do not cl
34f00 6f 73 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  ose cursors that
34f10 20 77 69 6c 6c 20 62 65 20 72 65 75 73 65 64 20   will be reused 
34f20 62 79 20 74 68 65 20 4f 52 20 6f 70 74 69 6d 69  by the OR optimi
34f30 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 28 57  zation.    ** (W
34f40 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43  HERE_OMIT_OPEN_C
34f50 4c 4f 53 45 29 2e 20 20 41 6e 64 20 64 6f 20 6e  LOSE).  And do n
34f60 6f 74 20 63 6c 6f 73 65 20 74 68 65 20 4f 50 5f  ot close the OP_
34f70 4f 70 65 6e 57 72 69 74 65 20 63 75 72 73 6f 72  OpenWrite cursor
34f80 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  s.    ** created
34f90 20 66 6f 72 20 74 68 65 20 4f 4e 45 50 41 53 53   for the ONEPASS
34fa0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20   optimization.. 
34fb0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
34fc0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
34fd0 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30  TF_Ephemeral)==0
34fe0 0a 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 70  .     && pTab->p
34ff0 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20 26  Select==0.     &
35000 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
35010 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d  Flags & WHERE_OM
35020 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d  IT_OPEN_CLOSE)==
35030 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  0.    ){.      i
35040 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77  nt ws = pLoop->w
35050 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66  sFlags;.      if
35060 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65  ( !pWInfo->okOne
35070 50 61 73 73 20 26 26 20 28 77 73 20 26 20 57 48  Pass && (ws & WH
35080 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
35090 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
350a0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
350b0 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49   OP_Close, pTabI
350c0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
350d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
350e0 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44   (ws & WHERE_IND
350f0 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20  EXED)!=0.       
35100 26 26 20 28 77 73 20 26 20 28 57 48 45 52 45 5f  && (ws & (WHERE_
35110 49 50 4b 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49  IPK|WHERE_AUTO_I
35120 4e 44 45 58 29 29 3d 3d 30 20 0a 20 20 20 20 20  NDEX))==0 .     
35130 20 20 26 26 20 70 4c 65 76 65 6c 2d 3e 69 49 64    && pLevel->iId
35140 78 43 75 72 21 3d 70 57 49 6e 66 6f 2d 3e 61 69  xCur!=pWInfo->ai
35150 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 0a 20 20  CurOnePass[1].  
35160 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
35170 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
35180 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c  (v, OP_Close, pL
35190 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a  evel->iIdxCur);.
351a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
351b0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63     /* If this sc
351c0 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  an uses an index
351d0 2c 20 6d 61 6b 65 20 56 44 42 45 20 63 6f 64 65  , make VDBE code
351e0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74   substitutions t
351f0 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20 20 20  o read data.    
35200 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ** from the inde
35210 78 20 69 6e 73 74 65 61 64 20 6f 66 20 66 72 6f  x instead of fro
35220 6d 20 74 68 65 20 74 61 62 6c 65 20 77 68 65 72  m the table wher
35230 65 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 6e 20  e possible.  In 
35240 73 6f 6d 65 20 63 61 73 65 73 0a 20 20 20 20 2a  some cases.    *
35250 2a 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  * this optimizat
35260 69 6f 6e 20 70 72 65 76 65 6e 74 73 20 74 68 65  ion prevents the
35270 20 74 61 62 6c 65 20 66 72 6f 6d 20 65 76 65 72   table from ever
35280 20 62 65 69 6e 67 20 72 65 61 64 2c 20 77 68 69   being read, whi
35290 63 68 20 63 61 6e 0a 20 20 20 20 2a 2a 20 79 69  ch can.    ** yi
352a0 65 6c 64 20 61 20 73 69 67 6e 69 66 69 63 61 6e  eld a significan
352b0 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f  t performance bo
352c0 6f 73 74 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20  ost..    ** .   
352d0 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65   ** Calls to the
352e0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
352f0 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74  in between sqlit
35300 65 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64  e3WhereBegin and
35310 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57  .    ** sqlite3W
35320 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76  hereEnd will hav
35330 65 20 63 72 65 61 74 65 64 20 63 6f 64 65 20 74  e created code t
35340 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  hat references t
35350 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  he table.    ** 
35360 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20  directly.  This 
35370 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74  loop scans all t
35380 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67  hat code looking
35390 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20   for opcodes.   
353a0 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e   ** that referen
353b0 63 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  ce the table and
353c0 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69   converts them i
353d0 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74  nto opcodes that
353e0 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
353f0 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  e the index..   
35400 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f   */.    if( pLoo
35410 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
35420 45 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45 52  ERE_INDEXED|WHER
35430 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20  E_IDX_ONLY) ){. 
35440 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f       pIdx = pLoo
35450 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
35460 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  x;.    }else if(
35470 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
35480 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
35490 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d   ){.      pIdx =
354a0 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69   pLevel->u.pCovi
354b0 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  dx;.    }.    if
354c0 28 20 70 49 64 78 20 26 26 20 21 64 62 2d 3e 6d  ( pIdx && !db->m
354d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
354e0 20 20 20 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74       int k, last
354f0 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  ;.      VdbeOp *
35500 70 4f 70 3b 0a 0a 20 20 20 20 20 20 6c 61 73 74  pOp;..      last
35510 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
35520 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
35530 20 20 20 20 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e      k = pLevel->
35540 61 64 64 72 42 6f 64 79 3b 0a 20 20 20 20 20 20  addrBody;.      
35550 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
35560 65 47 65 74 4f 70 28 76 2c 20 6b 29 3b 0a 20 20  eGetOp(v, k);.  
35570 20 20 20 20 66 6f 72 28 3b 20 6b 3c 6c 61 73 74      for(; k<last
35580 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; k++, pOp++){. 
35590 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
355a0 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62  p1!=pLevel->iTab
355b0 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
355c0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
355d0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75  >opcode==OP_Colu
355e0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
355f0 69 6e 74 20 78 20 3d 20 70 4f 70 2d 3e 70 32 3b  int x = pOp->p2;
35600 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
35610 74 28 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3d  t( pIdx->pTable=
35620 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20  =pTab );.       
35630 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
35640 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
35650 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b        Index *pPk
35660 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
35670 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
35680 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 20 3d  .            x =
35690 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 78   pPk->aiColumn[x
356a0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ];.          }. 
356b0 20 20 20 20 20 20 20 20 20 78 20 3d 20 73 71 6c           x = sql
356c0 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
356d0 78 28 70 49 64 78 2c 20 78 29 3b 0a 20 20 20 20  x(pIdx, x);.    
356e0 20 20 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29        if( x>=0 )
356f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f  {.            pO
35700 70 2d 3e 70 32 20 3d 20 78 3b 0a 20 20 20 20 20  p->p2 = x;.     
35710 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
35720 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
35730 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
35740 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
35750 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
35760 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
35770 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20 29 3b 0a  )==0 || x>=0 );.
35780 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
35790 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
357a0 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  P_Rowid ){.     
357b0 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70       pOp->p1 = p
357c0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
357d0 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f            pOp->o
357e0 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f  pcode = OP_IdxRo
357f0 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  wid;.        }. 
35800 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
35810 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65  ..  /* Final cle
35820 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72  anup.  */.  pPar
35830 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
35840 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
35850 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72  ueryLoop;.  wher
35860 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57  eInfoFree(db, pW
35870 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Info);.  return;
35880 0a 7d 0a                                         .}.