/ Hex Artifact Content
Login

Artifact 95d30485879122acc5284d4523e01399b23b6148:


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 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
e140: 76 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  v);..  /* Count 
e150: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
e160: 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
e170: 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
e180: 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75  index.  ** and u
e190: 73 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45  sed to match WHE
e1a0: 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
e1b0: 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43  aints */.  nKeyC
e1c0: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
e1d0: 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
e1e0: 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e   pWCEnd = &pWC->
e1f0: 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  a[pWC->nTerm];. 
e200: 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
e210: 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f  >pWLoop;.  idxCo
e220: 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54  ls = 0;.  for(pT
e230: 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
e240: 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
e250: 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d  +){.    if( term
e260: 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54  CanDriveIndex(pT
e270: 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  erm, pSrc, notRe
e280: 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  ady) ){.      in
e290: 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e  t iCol = pTerm->
e2a0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
e2b0: 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73      Bitmask cMas
e2c0: 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20  k = iCol>=BMS ? 
e2d0: 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a  MASKBIT(BMS-1) :
e2e0: 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a   MASKBIT(iCol);.
e2f0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
e300: 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  iCol==BMS );.   
e310: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
e320: 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  l==BMS-1 );.    
e330: 20 20 69 66 28 20 21 73 65 6e 74 57 61 72 6e 69    if( !sentWarni
e340: 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ng ){.        sq
e350: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
e360: 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44  _WARNING_AUTOIND
e370: 45 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  EX,.            
e380: 22 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78  "automatic index
e390: 20 6f 6e 20 25 73 28 25 73 29 22 2c 20 70 54 61   on %s(%s)", pTa
e3a0: 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  ble->zName,.    
e3b0: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e          pTable->
e3c0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
e3d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 74 57  );.        sentW
e3e0: 61 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20  arning = 1;.    
e3f0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69    }.      if( (i
e400: 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d  dxCols & cMask)=
e410: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
e420: 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
e430: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
e440: 6f 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 20  oop, nKeyCol+1) 
e450: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
e460: 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b    pLoop->aLTerm[
e470: 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65  nKeyCol++] = pTe
e480: 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43  rm;.        idxC
e490: 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20  ols |= cMask;.  
e4a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
e4b0: 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f    assert( nKeyCo
e4c0: 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  l>0 );.  pLoop->
e4d0: 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c  u.btree.nEq = pL
e4e0: 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b  oop->nLTerm = nK
e4f0: 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  eyCol;.  pLoop->
e500: 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
e510: 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52  COLUMN_EQ | WHER
e520: 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45  E_IDX_ONLY | WHE
e530: 52 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20  RE_INDEXED.     
e540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e550: 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  | WHERE_AUTO_IND
e560: 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  EX;..  /* Count 
e570: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64  the number of ad
e580: 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73  ditional columns
e590: 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74   needed to creat
e5a0: 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e  e a.  ** coverin
e5b0: 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76  g index.  A "cov
e5c0: 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20  ering index" is 
e5d0: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  an index that co
e5e0: 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20  ntains all.  ** 
e5f0: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65  columns that are
e600: 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71   needed by the q
e610: 75 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f  uery.  With a co
e620: 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68  vering index, th
e630: 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  e.  ** original 
e640: 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64  table never need
e650: 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64  s to be accessed
e660: 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64  .  Automatic ind
e670: 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62  ices must.  ** b
e680: 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  e a covering ind
e690: 65 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69  ex because the i
e6a0: 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ndex will not be
e6b0: 20 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a   updated if the.
e6c0: 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61    ** original ta
e6d0: 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20  ble changes and 
e6e0: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61  the index and ta
e6f0: 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20  ble cannot both 
e700: 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20  be used.  ** if 
e710: 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73  they go out of s
e720: 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72  ync..  */.  extr
e730: 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f  aCols = pSrc->co
e740: 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c  lUsed & (~idxCol
e750: 73 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d  s | MASKBIT(BMS-
e760: 31 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20  1));.  mxBitCol 
e770: 3d 20 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  = (pTable->nCol 
e780: 3e 3d 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d  >= BMS-1) ? BMS-
e790: 31 20 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  1 : pTable->nCol
e7a0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  ;.  testcase( pT
e7b0: 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d  able->nCol==BMS-
e7c0: 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  1 );.  testcase(
e7d0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42   pTable->nCol==B
e7e0: 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d  MS-2 );.  for(i=
e7f0: 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69  0; i<mxBitCol; i
e800: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74  ++){.    if( ext
e810: 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54  raCols & MASKBIT
e820: 28 69 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b  (i) ) nKeyCol++;
e830: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d  .  }.  if( pSrc-
e840: 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42  >colUsed & MASKB
e850: 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20  IT(BMS-1) ){.   
e860: 20 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62   nKeyCol += pTab
e870: 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b  le->nCol - BMS +
e880: 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d   1;.  }.  pLoop-
e890: 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
e8a0: 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48  E_COLUMN_EQ | WH
e8b0: 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20  ERE_IDX_ONLY;.. 
e8c0: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68   /* Construct th
e8d0: 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74  e Index object t
e8e0: 6f 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20  o describe this 
e8f0: 69 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64 78 20  index */.  pIdx 
e900: 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74  = sqlite3Allocat
e910: 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 70 50 61  eIndexObject(pPa
e920: 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c  rse->db, nKeyCol
e930: 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64  +1, 0, &zNotUsed
e940: 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30  );.  if( pIdx==0
e950: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f   ) return;.  pLo
e960: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
e970: 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64  ex = pIdx;.  pId
e980: 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f  x->zName = "auto
e990: 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d  -index";.  pIdx-
e9a0: 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65  >pTable = pTable
e9b0: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78  ;.  n = 0;.  idx
e9c0: 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Cols = 0;.  for(
e9d0: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
e9e0: 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72  erm<pWCEnd; pTer
e9f0: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65  m++){.    if( te
ea00: 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
ea10: 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74  pTerm, pSrc, not
ea20: 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20  Ready) ){.      
ea30: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d  int iCol = pTerm
ea40: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
ea50: 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d        Bitmask cM
ea60: 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20  ask = iCol>=BMS 
ea70: 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  ? MASKBIT(BMS-1)
ea80: 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29   : MASKBIT(iCol)
ea90: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
eaa0: 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ( iCol==BMS-1 );
eab0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
eac0: 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20   iCol==BMS );.  
ead0: 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73      if( (idxCols
eae0: 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   & cMask)==0 ){.
eaf0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58          Expr *pX
eb00: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
eb10: 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73  .        idxCols
eb20: 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20   |= cMask;.     
eb30: 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
eb40: 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  n[n] = pTerm->u.
eb50: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
eb60: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
eb70: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
eb80: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
eb90: 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70  pX->pLeft, pX->p
eba0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
ebb0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
ebc0: 3d 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20  = ALWAYS(pColl) 
ebd0: 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a  ? pColl->zName :
ebe0: 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20   "BINARY";.     
ebf0: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     n++;.      }.
ec00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
ec10: 72 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f  rt( (u32)n==pLoo
ec20: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29  p->u.btree.nEq )
ec30: 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69  ;..  /* Add addi
ec40: 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e  tional columns n
ec50: 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68  eeded to make th
ec60: 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
ec70: 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f  x into.  ** a co
ec80: 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  vering index */.
ec90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42    for(i=0; i<mxB
eca0: 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  itCol; i++){.   
ecb0: 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26   if( extraCols &
ecc0: 20 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20   MASKBIT(i) ){. 
ecd0: 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
ece0: 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[n] = i;.    
ecf0: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
ed00: 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  ] = "BINARY";.  
ed10: 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
ed20: 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
ed30: 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
ed40: 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66  (BMS-1) ){.    f
ed50: 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54  or(i=BMS-1; i<pT
ed60: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  able->nCol; i++)
ed70: 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69  {.      pIdx->ai
ed80: 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20  Column[n] = i;. 
ed90: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
eda0: 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b  l[n] = "BINARY";
edb0: 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
edc0: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
edd0: 6e 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20  n==nKeyCol );.  
ede0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
edf0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 49 64 78 2d 3e  ] = -1;.  pIdx->
ee00: 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e  azColl[n] = "BIN
ee10: 41 52 59 22 3b 0a 0a 20 20 2f 2a 20 43 72 65 61  ARY";..  /* Crea
ee20: 74 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  te the automatic
ee30: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65   index */.  asse
ee40: 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  rt( pLevel->iIdx
ee50: 43 75 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76  Cur>=0 );.  pLev
ee60: 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50  el->iIdxCur = pP
ee70: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
ee80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ee90: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f  2(v, OP_OpenAuto
eea0: 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69  index, pLevel->i
eeb0: 49 64 78 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b  IdxCur, nKeyCol+
eec0: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
eed0: 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50  eSetP4KeyInfo(pP
eee0: 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 56  arse, pIdx);.  V
eef0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
ef00: 66 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d  for %s", pTable-
ef10: 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20  >zName));..  /* 
ef20: 46 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74  Fill the automat
ef30: 69 63 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f  ic index with co
ef40: 6e 74 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54  ntent */.  addrT
ef50: 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
ef60: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77  AddOp1(v, OP_Rew
ef70: 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ind, pLevel->iTa
ef80: 62 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72  bCur); VdbeCover
ef90: 61 67 65 28 76 29 3b 0a 20 20 72 65 67 52 65 63  age(v);.  regRec
efa0: 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
efb0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
efc0: 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  .  sqlite3Genera
efd0: 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73  teIndexKey(pPars
efe0: 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d  e, pIdx, pLevel-
eff0: 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52 65 63  >iTabCur, regRec
f000: 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  ord, 0, 0, 0, 0)
f010: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
f020: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
f030: 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69  nsert, pLevel->i
f040: 49 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72  IdxCur, regRecor
f050: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
f060: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
f070: 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
f080: 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  T);.  sqlite3Vdb
f090: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
f0a0: 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  xt, pLevel->iTab
f0b0: 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b  Cur, addrTop+1);
f0c0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
f0d0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
f0e0: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
f0f0: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54  E_STMTSTATUS_AUT
f100: 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74  OINDEX);.  sqlit
f110: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
f120: 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71  , addrTop);.  sq
f130: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
f140: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
f150: 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20  ecord);.  .  /* 
f160: 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73  Jump here when s
f170: 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74  kipping the init
f180: 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20  ialization */.  
f190: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
f1a0: 65 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29  ere(v, addrInit)
f1b0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
f1c0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
f1d0: 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69  TIC_INDEX */..#i
f1e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f1f0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
f200: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
f210: 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71  d populate an sq
f220: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
f230: 20 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69   structure. It i
f240: 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e  s the .** respon
f250: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
f260: 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
f270: 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65  ally release the
f280: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79   structure.** by
f290: 20 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69   passing the poi
f2a0: 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
f2b0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74   this function t
f2c0: 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  o sqlite3_free()
f2d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
f2e0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
f2f0: 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66  allocateIndexInf
f300: 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  o(.  Parse *pPar
f310: 73 65 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73  se,.  WhereClaus
f320: 65 20 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74  e *pWC,.  struct
f330: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
f340: 53 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  Src,.  ExprList 
f350: 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69  *pOrderBy.){.  i
f360: 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  nt i, j;.  int n
f370: 54 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73  Term;.  struct s
f380: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
f390: 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e  straint *pIdxCon
f3a0: 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  s;.  struct sqli
f3b0: 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
f3c0: 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a  y *pIdxOrderBy;.
f3d0: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
f3e0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
f3f0: 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b  t_usage *pUsage;
f400: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
f410: 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65  erm;.  int nOrde
f420: 72 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  rBy;.  sqlite3_i
f430: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
f440: 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  nfo;..  /* Count
f450: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
f460: 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c  ossible WHERE cl
f470: 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
f480: 20 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20   referring.  ** 
f490: 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  to this virtual 
f4a0: 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69  table */.  for(i
f4b0: 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d  =nTerm=0, pTerm=
f4c0: 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
f4d0: 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
f4e0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  ++){.    if( pTe
f4f0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21  rm->leftCursor !
f500: 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  = pSrc->iCursor 
f510: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
f520: 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f  assert( IsPowerO
f530: 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65  fTwo(pTerm->eOpe
f540: 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49  rator & ~WO_EQUI
f550: 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  V) );.    testca
f560: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
f570: 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a  ator & WO_IN );.
f580: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
f590: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
f5a0: 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
f5b0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
f5c0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
f5d0: 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28  O_ALL );.    if(
f5e0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
f5f0: 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c  or & ~(WO_ISNULL
f600: 7c 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20 29  |WO_EQUIV))==0 )
f610: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
f620: 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
f630: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29  s & TERM_VNULL )
f640: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e   continue;.    n
f650: 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  Term++;.  }..  /
f660: 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42  * If the ORDER B
f670: 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  Y clause contain
f680: 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69  s only columns i
f690: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20  n the current . 
f6a0: 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c   ** virtual tabl
f6b0: 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  e then allocate 
f6c0: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f  space for the aO
f6d0: 72 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20  rderBy part of. 
f6e0: 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f   ** the sqlite3_
f6f0: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
f700: 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72  ture..  */.  nOr
f710: 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28  derBy = 0;.  if(
f720: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
f730: 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42   int n = pOrderB
f740: 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f  y->nExpr;.    fo
f750: 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
f760: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
f770: 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
f780: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
f790: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
f7a0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45  =TK_COLUMN || pE
f7b0: 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72  xpr->iTable!=pSr
f7c0: 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65  c->iCursor ) bre
f7d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
f7e0: 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e  ( i==n){.      n
f7f0: 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20  OrderBy = n;.   
f800: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
f810: 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  ocate the sqlite
f820: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
f830: 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49  ucture.  */.  pI
f840: 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  dxInfo = sqlite3
f850: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
f860: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
f870: 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20  *pIdxInfo).     
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f890: 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28        + (sizeof(
f8a0: 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a  *pIdxCons) + siz
f8b0: 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54  eof(*pUsage))*nT
f8c0: 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20  erm.            
f8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
f8e0: 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64   sizeof(*pIdxOrd
f8f0: 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29  erBy)*nOrderBy )
f900: 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
f910: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
f920: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
f930: 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  e, "out of memor
f940: 79 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  y");.    return 
f950: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  0;.  }..  /* Ini
f960: 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75  tialize the stru
f970: 63 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69  cture.  The sqli
f980: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
f990: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
f9a0: 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c  s.  ** many fiel
f9b0: 64 73 20 74 68 61 74 20 61 72 65 20 64 65 63 6c  ds that are decl
f9c0: 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20  ared "const" to 
f9d0: 70 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64  prevent xBestInd
f9e0: 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61  ex from.  ** cha
f9f0: 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20  nging them.  We 
fa00: 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20  have to do some 
fa10: 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e  funky casting in
fa20: 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69   order to.  ** i
fa30: 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20  nitialize those 
fa40: 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70  fields..  */.  p
fa50: 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63  IdxCons = (struc
fa60: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
fa70: 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64  constraint*)&pId
fa80: 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78  xInfo[1];.  pIdx
fa90: 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72 75 63  OrderBy = (struc
faa0: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
fab0: 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f  orderby*)&pIdxCo
fac0: 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73  ns[nTerm];.  pUs
fad0: 61 67 65 20 3d 20 28 73 74 72 75 63 74 20 73 71  age = (struct sq
fae0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
faf0: 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70  traint_usage*)&p
fb00: 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65  IdxOrderBy[nOrde
fb10: 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26  rBy];.  *(int*)&
fb20: 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
fb30: 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20  raint = nTerm;. 
fb40: 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66   *(int*)&pIdxInf
fb50: 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f  o->nOrderBy = nO
fb60: 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75  rderBy;.  *(stru
fb70: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
fb80: 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
fb90: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
fba0: 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b  aint = pIdxCons;
fbb0: 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
fbc0: 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
fbd0: 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  y**)&pIdxInfo->a
fbe0: 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72  OrderBy = pIdxOr
fbf0: 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63  derBy;.  *(struc
fc00: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
fc10: 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
fc20: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
fc30: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d  onstraintUsage =
fc40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc80: 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 66      pUsage;..  f
fc90: 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d  or(i=j=0, pTerm=
fca0: 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
fcb0: 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
fcc0: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a  ++){.    u8 op;.
fcd0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
fce0: 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72  eftCursor != pSr
fcf0: 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e  c->iCursor ) con
fd00: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
fd10: 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28  t( IsPowerOfTwo(
fd20: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
fd30: 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b   & ~WO_EQUIV) );
fd40: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
fd50: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
fd60: 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74  & WO_IN );.    t
fd70: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
fd80: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
fd90: 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73  SNULL );.    tes
fda0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
fdb0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c  perator & WO_ALL
fdc0: 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65   );.    if( (pTe
fdd0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
fde0: 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45  ~(WO_ISNULL|WO_E
fdf0: 51 55 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74  QUIV))==0 ) cont
fe00: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
fe10: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
fe20: 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74  ERM_VNULL ) cont
fe30: 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f  inue;.    pIdxCo
fe40: 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20  ns[j].iColumn = 
fe50: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
fe60: 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  umn;.    pIdxCon
fe70: 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  s[j].iTermOffset
fe80: 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28   = i;.    op = (
fe90: 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  u8)pTerm->eOpera
fea0: 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20  tor & WO_ALL;.  
feb0: 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20    if( op==WO_IN 
fec0: 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20  ) op = WO_EQ;.  
fed0: 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70    pIdxCons[j].op
fee0: 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68   = op;.    /* Th
fef0: 65 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d  e direct assignm
ff00: 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69  ent in the previ
ff10: 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73  ous line is poss
ff20: 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73  ible only becaus
ff30: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f  e.    ** the WO_
ff40: 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45   and SQLITE_INDE
ff50: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f  X_CONSTRAINT_ co
ff60: 64 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61  des are identica
ff70: 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66  l.  The.    ** f
ff80: 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
ff90: 20 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63   verify this fac
ffa0: 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  t. */.    assert
ffb0: 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f  ( WO_EQ==SQLITE_
ffc0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
ffd0: 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _EQ );.    asser
ffe0: 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45  t( WO_LT==SQLITE
fff0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
10000 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65  T_LT );.    asse
10010 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54  rt( WO_LE==SQLIT
10020 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
10030 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73  NT_LE );.    ass
10040 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49  ert( WO_GT==SQLI
10050 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
10060 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73  INT_GT );.    as
10070 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c  sert( WO_GE==SQL
10080 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
10090 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61  AINT_GE );.    a
100a0 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d  ssert( WO_MATCH=
100b0 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
100c0 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29  NSTRAINT_MATCH )
100d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
100e0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
100f0 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f   (WO_IN|WO_EQ|WO
10100 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
10110 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20  WO_GE|WO_MATCH) 
10120 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a  );.    j++;.  }.
10130 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
10140 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
10150 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
10160 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
10170 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64  xpr;.    pIdxOrd
10180 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20  erBy[i].iColumn 
10190 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
101a0 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42  ;.    pIdxOrderB
101b0 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64  y[i].desc = pOrd
101c0 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
101d0 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  rder;.  }..  ret
101e0 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a  urn pIdxInfo;.}.
101f0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  ./*.** The table
10200 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63   object referenc
10210 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
10220 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
10230 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
10240 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65  .** must represe
10250 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  nt a virtual tab
10260 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  le. This functio
10270 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42  n invokes the xB
10280 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65  estIndex().** me
10290 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74  thod of the virt
102a0 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74  ual table with t
102b0 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
102c0 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61  _info object tha
102d0 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73  t.** comes in as
102e0 20 74 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e   the 3rd argumen
102f0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
10300 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  on..**.** If an 
10310 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50  error occurs, pP
10320 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65  arse is populate
10330 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20  d with an error 
10340 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a  message and a.**
10350 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
10360 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
10370 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74  erwise, 0 is ret
10380 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75  urned and the ou
10390 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20  tput.** part of 
103a0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
103b0 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
103c0 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74   is left populat
103d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  ed..**.** Whethe
103e0 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f  r or not an erro
103f0 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69  r is returned, i
10400 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
10410 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a  ibility of the.*
10420 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  * caller to even
10430 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69  tually free p->i
10440 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64  dxStr if p->need
10450 54 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e 64  ToFreeIdxStr ind
10460 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74  icates.** that t
10470 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 2e  his is required.
10480 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
10490 74 61 62 42 65 73 74 49 6e 64 65 78 28 50 61 72  tabBestIndex(Par
104a0 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
104b0 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33  e *pTab, sqlite3
104c0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
104d0 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
104e0 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33  *pVtab = sqlite3
104f0 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65  GetVTable(pParse
10500 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74  ->db, pTab)->pVt
10510 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ab;.  int i;.  i
10520 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f  nt rc;..  TRACE_
10530 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20  IDX_INPUTS(p);. 
10540 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f   rc = pVtab->pMo
10550 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78  dule->xBestIndex
10560 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52  (pVtab, p);.  TR
10570 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
10580 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53  p);..  if( rc!=S
10590 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
105a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
105b0 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50  OMEM ){.      pP
105c0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
105d0 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
105e0 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62  }else if( !pVtab
105f0 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
10600 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
10610 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
10620 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
10630 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  c));.    }else{.
10640 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
10650 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
10660 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  s", pVtab->zErrM
10670 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  sg);.    }.  }. 
10680 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56   sqlite3_free(pV
10690 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
106a0 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
106b0 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  = 0;..  for(i=0;
106c0 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
106d0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  t; i++){.    if(
106e0 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74   !p->aConstraint
106f0 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d  [i].usable && p-
10700 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
10710 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30  e[i].argvIndex>0
10720 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10730 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
10740 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61  , .          "ta
10750 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64  ble %s: xBestInd
10760 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69  ex returned an i
10770 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54  nvalid plan", pT
10780 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
10790 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
107a0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a  pParse->nErr;.}.
107b0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
107c0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
107d0 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a  IRTUALTABLE) */.
107e0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
107f0 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
10800 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT4./*.** Esti
10810 6d 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f  mate the locatio
10820 6e 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61  n of a particula
10830 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20  r key among all 
10840 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e  keys in an.** in
10850 64 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20  dex.  Store the 
10860 72 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74  results in aStat
10870 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
10880 2a 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20  **    aStat[0]  
10890 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20      Est. number 
108a0 6f 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61  of rows less tha
108b0 6e 20 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74  n pVal.**    aSt
108c0 61 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20  at[1]      Est. 
108d0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65  number of rows e
108e0 71 75 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a  qual to pVal.**.
108f0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
10900 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  _OK on success..
10910 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
10920 68 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20  hereKeyStats(.  
10930 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
10950 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
10960 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  on */.  Index *p
10970 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
10980 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
10990 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20  consider domain 
109a0 6f 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  of */.  Unpacked
109b0 52 65 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20  Record *pRec,   
109c0 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66      /* Vector of
109d0 20 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69   values to consi
109e0 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75  der */.  int rou
109f0 6e 64 55 70 2c 20 20 20 20 20 20 20 20 20 20 20  ndUp,           
10a00 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70       /* Round up
10a10 20 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64   if true.  Round
10a20 20 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a   down if false *
10a30 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74  /.  tRowcnt *aSt
10a40 61 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  at              
10a50 2f 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72  /* OUT: stats wr
10a60 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  itten here */.){
10a70 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a  .  IndexSample *
10a80 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e  aSample = pIdx->
10a90 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69  aSample;.  int i
10aa0 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
10ab0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
10ac0 6f 66 20 72 65 71 75 69 72 65 64 20 73 74 61 74  of required stat
10ad0 73 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e  s in anEq[] etc.
10ae0 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d   */.  int iMin =
10af0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
10b00 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61    /* Smallest sa
10b10 6d 70 6c 65 20 6e 6f 74 20 79 65 74 20 74 65 73  mple not yet tes
10b20 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  ted */.  int i =
10b30 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20   pIdx->nSample; 
10b40 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74       /* Smallest
10b50 20 73 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74   sample larger t
10b60 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
10b70 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 54  pRec */.  int iT
10b80 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  est;            
10b90 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61        /* Next sa
10ba0 6d 70 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a  mple to test */.
10bb0 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20    int res;      
10bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10bd0 20 52 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61   Result of compa
10be0 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  rison operation 
10bf0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
10c00 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45  TE_DEBUG.  UNUSE
10c10 44 5f 50 41 52 41 4d 45 54 45 52 28 20 70 50 61  D_PARAMETER( pPa
10c20 72 73 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rse );.#endif.  
10c30 61 73 73 65 72 74 28 20 70 52 65 63 21 3d 30 20  assert( pRec!=0 
10c40 29 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 52 65 63  );.  iCol = pRec
10c50 2d 3e 6e 46 69 65 6c 64 20 2d 20 31 3b 0a 20 20  ->nField - 1;.  
10c60 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 53  assert( pIdx->nS
10c70 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73  ample>0 );.  ass
10c80 65 72 74 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c  ert( pRec->nFiel
10c90 64 3e 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78  d>0 && iCol<pIdx
10ca0 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a  ->nSampleCol );.
10cb0 20 20 64 6f 7b 0a 20 20 20 20 69 54 65 73 74 20    do{.    iTest 
10cc0 3d 20 28 69 4d 69 6e 2b 69 29 2f 32 3b 0a 20 20  = (iMin+i)/2;.  
10cd0 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56    res = sqlite3V
10ce0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
10cf0 28 61 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e  (aSample[iTest].
10d00 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 54 65 73 74  n, aSample[iTest
10d10 5d 2e 70 2c 20 70 52 65 63 2c 20 30 29 3b 0a 20  ].p, pRec, 0);. 
10d20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
10d30 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65        iMin = iTe
10d40 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  st+1;.    }else{
10d50 0a 20 20 20 20 20 20 69 20 3d 20 69 54 65 73 74  .      i = iTest
10d60 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
10d70 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 20  ( res && iMin<i 
10d80 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
10d90 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
10da0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
10db0 74 20 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65  t statements che
10dc0 63 6b 20 74 68 61 74 20 74 68 65 20 62 69 6e 61  ck that the bina
10dd0 72 79 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20  ry search code. 
10de0 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20   ** above found 
10df0 74 68 65 20 72 69 67 68 74 20 61 6e 73 77 65 72  the right answer
10e00 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72  . This block ser
10e10 76 65 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f  ves no purpose o
10e20 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74  ther.  ** than t
10e30 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73  o invoke the ass
10e40 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20  erts.  */.  if( 
10e50 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  res==0 ){.    /*
10e60 20 49 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20   If (res==0) is 
10e70 74 72 75 65 2c 20 74 68 65 6e 20 73 61 6d 70 6c  true, then sampl
10e80 65 20 24 69 20 6d 75 73 74 20 62 65 20 65 71 75  e $i must be equ
10e90 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20  al to pRec */.  
10ea0 20 20 61 73 73 65 72 74 28 20 69 3c 70 49 64 78    assert( i<pIdx
10eb0 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20  ->nSample );.   
10ec0 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69   assert( 0==sqli
10ed0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
10ee0 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e  pare(aSample[i].
10ef0 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c  n, aSample[i].p,
10f00 20 70 52 65 63 2c 20 30 29 0a 20 20 20 20 20 20   pRec, 0).      
10f10 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62     || pParse->db
10f20 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
10f30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
10f40 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 70 52 65  * Otherwise, pRe
10f50 63 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65  c must be smalle
10f60 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 24 69  r than sample $i
10f70 20 61 6e 64 20 6c 61 72 67 65 72 20 74 68 61 6e   and larger than
10f80 0a 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28  .    ** sample (
10f90 24 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61  $i-1).  */.    a
10fa0 73 73 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e  ssert( i==pIdx->
10fb0 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20  nSample .       
10fc0 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65    || sqlite3Vdbe
10fd0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
10fe0 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d  ample[i].n, aSam
10ff0 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 2c 20  ple[i].p, pRec, 
11000 30 29 3e 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  0)>0.         ||
11010 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
11020 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
11030 20 61 73 73 65 72 74 28 20 69 3d 3d 30 0a 20 20   assert( i==0.  
11040 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
11050 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
11060 72 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e  re(aSample[i-1].
11070 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e  n, aSample[i-1].
11080 70 2c 20 70 52 65 63 2c 20 30 29 3c 30 0a 20 20  p, pRec, 0)<0.  
11090 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
110a0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
110b0 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ed );.  }.#endif
110c0 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45   /* ifdef SQLITE
110d0 5f 44 45 42 55 47 20 2a 2f 0a 0a 20 20 2f 2a 20  _DEBUG */..  /* 
110e0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61  At this point, a
110f0 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65  Sample[i] is the
11100 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 74 68   first sample th
11110 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  at is greater th
11120 61 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c  an.  ** or equal
11130 20 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69 66   to pVal.  Or if
11140 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i==pIdx->nSampl
11150 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70  e, then all samp
11160 6c 65 73 20 61 72 65 20 6c 65 73 73 0a 20 20 2a  les are less.  *
11170 2a 20 74 68 61 6e 20 70 56 61 6c 2e 20 20 49 66  * than pVal.  If
11180 20 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61   aSample[i]==pVa
11190 6c 2c 20 74 68 65 6e 20 72 65 73 3d 3d 30 2e 0a  l, then res==0..
111a0 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d    */.  if( res==
111b0 30 20 29 7b 0a 20 20 20 20 61 53 74 61 74 5b 30  0 ){.    aStat[0
111c0 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  ] = aSample[i].a
111d0 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61  nLt[iCol];.    a
111e0 53 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c  Stat[1] = aSampl
111f0 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b  e[i].anEq[iCol];
11200 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52  .  }else{.    tR
11210 6f 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55  owcnt iLower, iU
11220 70 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20  pper, iGap;.    
11230 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20  if( i==0 ){.    
11240 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    iLower = 0;.  
11250 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 53 61      iUpper = aSa
11260 6d 70 6c 65 5b 30 5d 2e 61 6e 4c 74 5b 69 43 6f  mple[0].anLt[iCo
11270 6c 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l];.    }else{. 
11280 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 69 3e       iUpper = i>
11290 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3f  =pIdx->nSample ?
112a0 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 5b   pIdx->aiRowEst[
112b0 30 5d 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  0] : aSample[i].
112c0 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  anLt[iCol];.    
112d0 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70    iLower = aSamp
112e0 6c 65 5b 69 2d 31 5d 2e 61 6e 45 71 5b 69 43 6f  le[i-1].anEq[iCo
112f0 6c 5d 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31  l] + aSample[i-1
11300 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anLt[iCol];.  
11310 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 31 5d    }.    aStat[1]
11320 20 3d 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   = (pIdx->nKeyCo
11330 6c 3e 69 43 6f 6c 20 3f 20 70 49 64 78 2d 3e 61  l>iCol ? pIdx->a
11340 41 76 67 45 71 5b 69 43 6f 6c 5d 20 3a 20 31 29  AvgEq[iCol] : 1)
11350 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72  ;.    if( iLower
11360 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20  >=iUpper ){.    
11370 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20    iGap = 0;.    
11380 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61  }else{.      iGa
11390 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f  p = iUpper - iLo
113a0 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  wer;.    }.    i
113b0 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20  f( roundUp ){.  
113c0 20 20 20 20 69 47 61 70 20 3d 20 28 69 47 61 70      iGap = (iGap
113d0 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65  *2)/3;.    }else
113e0 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69  {.      iGap = i
113f0 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20  Gap/3;.    }.   
11400 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77   aStat[0] = iLow
11410 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 7d  er + iGap;.  }.}
11420 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11430 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
11440 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a  R_STAT4 */../*.*
11450 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11460 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d  is used to estim
11470 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
11480 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
11490 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62   be visited.** b
114a0 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e  y scanning an in
114b0 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20  dex for a range 
114c0 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72  of values. The r
114d0 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e  ange may have an
114e0 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c   upper.** bound,
114f0 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20   a lower bound, 
11500 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45  or both. The WHE
11510 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
11520 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70 70  that set the upp
11530 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20  er.** and lower 
11540 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72 65  bounds are repre
11550 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72  sented by pLower
11560 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70   and pUpper resp
11570 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a  ectively. For.**
11580 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
11590 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70 20  ng that index p 
115a0 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a  is on t1(a):.**.
115b0 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
115c0 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44   WHERE a > ? AND
115d0 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20   a < ? ....**   
115e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115f0 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f   |_____|   |____
11600 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  _|.**           
11610 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
11620 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
11630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
11640 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72 0a  Lower    pUpper.
11650 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
11660 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72 20  of the upper or 
11670 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e  lower bound is n
11680 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  ot present, then
11690 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20   NULL is passed 
116a0 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74  in.** place of t
116b0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
116c0 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a   WhereTerm..**.*
116d0 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 28  * The value in (
116e0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
116f0 75 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73 20  u.btree.nEq) is 
11700 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
11710 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e   index.** column
11720 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20   subject to the 
11730 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
11740 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74  . Or, equivalent
11750 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ly, the number o
11760 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f  f.** equality co
11770 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69  nstraints optimi
11780 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f  zed by the propo
11790 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20  sed index scan. 
117a0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20  For example,.** 
117b0 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70  assuming index p
117c0 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c   is on t1(a, b),
117d0 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65   and the SQL que
117e0 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  ry is:.**.**   .
117f0 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
11800 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f   a = ? AND b > ?
11810 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND b < ? ....*
11820 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73  *.** then nEq is
11830 20 73 65 74 20 74 6f 20 31 20 28 61 73 20 74 68   set to 1 (as th
11840 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74  e range restrict
11850 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73  ed column, b, is
11860 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
11870 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
11880 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20   of the index). 
11890 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  Or, if the query
118a0 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e   is:.**.**   ...
118b0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
118c0 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
118d0 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
118e0 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  q is set to 0..*
118f0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
11900 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
11910 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74  d, *pnOut is set
11920 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4c   to the sqlite3L
11930 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a 2a  ogEst() of the.*
11940 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
11950 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
11960 73 63 61 6e 20 69 73 20 65 78 70 65 63 74 65 64  scan is expected
11970 20 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f 75   to visit withou
11980 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e  t .** considerin
11990 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73  g the range cons
119a0 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71 20  traints. If nEq 
119b0 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 74 68  is 0, this is th
119c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20  e number of .** 
119d0 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65  rows in the inde
119e0 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65  x. Assuming no e
119f0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 6e  rror occurs, *pn
11a00 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65 64 20  Out is adjusted 
11a10 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f 20  (reduced).** to 
11a20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
11a30 72 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74 73  range contraints
11a40 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
11a50 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68  er..** .** In th
11a60 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c  e absence of sql
11a70 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c 59 5a  ite_stat4 ANALYZ
11a80 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20 73 75  E data, or if su
11a90 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74 20 62  ch data cannot b
11aa0 65 0a 2a 2a 20 75 73 65 64 2c 20 65 61 63 68 20  e.** used, each 
11ab0 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79  range inequality
11ac0 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61   reduces the sea
11ad0 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20 66  rch space by a f
11ae0 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20  actor of 4. .** 
11af0 48 65 6e 63 65 20 61 20 70 61 69 72 20 6f 66 20  Hence a pair of 
11b00 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f  constraints (x>?
11b10 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65   AND x<?) reduce
11b20 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 6e  s the expected n
11b30 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73  umber of.** rows
11b40 20 76 69 73 69 74 65 64 20 62 79 20 61 20 66 61   visited by a fa
11b50 63 74 6f 72 20 6f 66 20 31 36 2e 0a 2a 2f 0a 73  ctor of 16..*/.s
11b60 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52  tatic int whereR
11b70 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50  angeScanEst(.  P
11b80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
11b90 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
11ba0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
11bb0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
11bc0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
11bd0 70 42 75 69 6c 64 65 72 2c 0a 20 20 57 68 65 72  pBuilder,.  Wher
11be0 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20  eTerm *pLower,  
11bf0 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20   /* Lower bound 
11c00 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
11c10 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20  : "x>123" Might 
11c20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
11c30 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20  reTerm *pUpper, 
11c40 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64    /* Upper bound
11c50 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
11c60 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74  x: "x<455" Might
11c70 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
11c80 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20  ereLoop *pLoop  
11c90 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65     /* Modify the
11ca0 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62 65   .nOut and maybe
11cb0 20 2e 72 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f   .rRun fields */
11cc0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
11cd0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
11ce0 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f  nOut = pLoop->nO
11cf0 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65  ut;.  LogEst nNe
11d00 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  w;..#ifdef SQLIT
11d10 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
11d20 52 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20  R_STAT4.  Index 
11d30 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  *p = pLoop->u.bt
11d40 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ree.pIndex;.  in
11d50 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  t nEq = pLoop->u
11d60 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69  .btree.nEq;..  i
11d70 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 0a  f( p->nSample>0.
11d80 20 20 20 26 26 20 6e 45 71 3d 3d 70 42 75 69 6c     && nEq==pBuil
11d90 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 0a 20  der->nRecValid. 
11da0 20 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d    && nEq<p->nSam
11db0 70 6c 65 43 6f 6c 0a 20 20 20 26 26 20 4f 70 74  pleCol.   && Opt
11dc0 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
11dd0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c  (pParse->db, SQL
11de0 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20 29 7b  ITE_Stat3) .  ){
11df0 0a 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65 63  .    UnpackedRec
11e00 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69  ord *pRec = pBui
11e10 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20  lder->pRec;.    
11e20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20  tRowcnt a[2];.  
11e30 20 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20 2f    u8 aff;..    /
11e40 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77 65  * Variable iLowe
11e50 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  r will be set to
11e60 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66   the estimate of
11e70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
11e80 6f 77 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74  ows in .    ** t
11e90 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61 72  he index that ar
11ea0 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  e less than the 
11eb0 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  lower bound of t
11ec0 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20  he range query. 
11ed0 54 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 77 65 72  The.    ** lower
11ee0 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68 65   bound being the
11ef0 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f   concatenation o
11f00 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68 65  f $P and $L, whe
11f10 72 65 20 24 50 20 69 73 20 74 68 65 0a 20 20 20  re $P is the.   
11f20 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66   ** key-prefix f
11f30 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71  ormed by the nEq
11f40 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20   values matched 
11f50 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20  against the nEq 
11f60 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 2a 2a  left-most.    **
11f70 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
11f80 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73  index, and $L is
11f90 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c   the value in pL
11fa0 6f 77 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ower..    **.   
11fb0 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65   ** Or, if pLowe
11fc0 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20  r is NULL or $L 
11fd0 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63  cannot be extrac
11fe0 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65 63  ted from it (bec
11ff0 61 75 73 65 20 69 74 0a 20 20 20 20 2a 2a 20 69  ause it.    ** i
12000 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76  s not a simple v
12010 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72  ariable or liter
12020 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c  al value), the l
12030 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  ower bound of th
12040 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 69  e.    ** range i
12050 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20 71  s $P. Due to a q
12060 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79 20  uirk in the way 
12070 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20  whereKeyStats() 
12080 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20 20  works, even.    
12090 2a 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61 69  ** if $L is avai
120a0 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79 53  lable, whereKeyS
120b0 74 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65 64  tats() is called
120c0 20 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20 61   for both ($P) a
120d0 6e 64 20 0a 20 20 20 20 2a 2a 20 28 24 50 3a 24  nd .    ** ($P:$
120e0 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67 65  L) and the large
120f0 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65 74  r of the two ret
12100 75 72 6e 65 64 20 76 61 6c 75 65 73 20 75 73 65  urned values use
12110 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
12120 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70   Similarly, iUpp
12130 65 72 20 69 73 20 74 6f 20 62 65 20 73 65 74 20  er is to be set 
12140 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  to the estimate 
12150 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
12160 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 6c 65 73   rows.    ** les
12170 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72  s than the upper
12180 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61   bound of the ra
12190 6e 67 65 20 71 75 65 72 79 2e 20 57 68 65 72 65  nge query. Where
121a0 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
121b0 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65  .    ** is eithe
121c0 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24 55  r ($P) or ($P:$U
121d0 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20 69  ). Again, even i
121e0 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62 6c  f $U is availabl
121f0 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20  e, both values. 
12200 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65 72 20     ** of iUpper 
12210 61 72 65 20 72 65 71 75 65 73 74 65 64 20 6f 66  are requested of
12220 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
12230 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65 72   and the smaller
12240 20 75 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20   used..    */.  
12250 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72    tRowcnt iLower
12260 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55  ;.    tRowcnt iU
12270 70 70 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 6e  pper;..    if( n
12280 45 71 3d 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20 29  Eq==p->nKeyCol )
12290 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
122a0 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
122b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
122c0 20 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62     aff = p->pTab
122d0 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f  le->aCol[p->aiCo
122e0 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69 6e  lumn[nEq]].affin
122f0 69 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  ity;.    }.    /
12300 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77  * Determine iLow
12310 65 72 20 61 6e 64 20 69 55 70 70 65 72 20 75 73  er and iUpper us
12320 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a  ing ($P) only. *
12330 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30  /.    if( nEq==0
12340 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72   ){.      iLower
12350 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70 70   = 0;.      iUpp
12360 65 72 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74  er = p->aiRowEst
12370 5b 30 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [0];.    }else{.
12380 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74        /* Note: t
12390 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62  his call could b
123a0 65 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79  e optimized away
123b0 20 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d   - since the sam
123c0 65 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20  e values must . 
123d0 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65       ** have bee
123e0 6e 20 72 65 71 75 65 73 74 65 64 20 77 68 65 6e  n requested when
123f0 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50 20   testing key $P 
12400 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63 61  in whereEqualSca
12410 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20  nEst().  */.    
12420 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28    whereKeyStats(
12430 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
12440 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 69 4c   0, a);.      iL
12450 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20  ower = a[0];.   
12460 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d     iUpper = a[0]
12470 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 7d 0a 0a   + a[1];.    }..
12480 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62      /* If possib
12490 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74  le, improve on t
124a0 68 65 20 69 4c 6f 77 65 72 20 65 73 74 69 6d 61  he iLower estima
124b0 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24 4c 29  te using ($P:$L)
124c0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f  . */.    if( pLo
124d0 77 65 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  wer ){.      int
124e0 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20   bOk;           
124f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
12500 20 69 66 20 76 61 6c 75 65 20 69 73 20 65 78 74   if value is ext
12510 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70  racted from pExp
12520 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  r */.      Expr 
12530 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d  *pExpr = pLower-
12540 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
12550 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
12560 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Lower->eOperator
12570 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
12580 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  )!=0 );.      rc
12590 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50   = sqlite3Stat4P
125a0 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61  robeSetValue(pPa
125b0 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70  rse, p, &pRec, p
125c0 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20  Expr, aff, nEq, 
125d0 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  &bOk);.      if(
125e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
125f0 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20  & bOk ){.       
12600 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20   tRowcnt iNew;. 
12610 20 20 20 20 20 20 20 77 68 65 72 65 4b 65 79 53         whereKeyS
12620 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
12630 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20  pRec, 0, a);.   
12640 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d       iNew = a[0]
12650 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f 70   + ((pLower->eOp
12660 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 54 29 20  erator & WO_GT) 
12670 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20  ? a[1] : 0);.   
12680 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c       if( iNew>iL
12690 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20  ower ) iLower = 
126a0 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 6e 4f  iNew;.        nO
126b0 75 74 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ut--;.      }.  
126c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70    }..    /* If p
126d0 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65  ossible, improve
126e0 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20 65   on the iUpper e
126f0 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24  stimate using ($
12700 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 69 66  P:$U). */.    if
12710 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  ( pUpper ){.    
12720 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20    int bOk;      
12730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12740 20 54 72 75 65 20 69 66 20 76 61 6c 75 65 20 69   True if value i
12750 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
12760 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20   pExpr */.      
12770 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55  Expr *pExpr = pU
12780 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  pper->pExpr->pRi
12790 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ght;.      asser
127a0 74 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65  t( (pUpper->eOpe
127b0 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57  rator & (WO_LT|W
127c0 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20  O_LE))!=0 );.   
127d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
127e0 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
127f0 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52  e(pParse, p, &pR
12800 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  ec, pExpr, aff, 
12810 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20  nEq, &bOk);.    
12820 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12830 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20  _OK && bOk ){.  
12840 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e        tRowcnt iN
12850 65 77 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  ew;.        wher
12860 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
12870 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29  , p, pRec, 1, a)
12880 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d  ;.        iNew =
12890 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72   a[0] + ((pUpper
128a0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
128b0 5f 4c 45 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29  _LE) ? a[1] : 0)
128c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4e  ;.        if( iN
128d0 65 77 3c 69 55 70 70 65 72 20 29 20 69 55 70 70  ew<iUpper ) iUpp
128e0 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20  er = iNew;.     
128f0 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20     nOut--;.     
12900 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 42   }.    }..    pB
12910 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70  uilder->pRec = p
12920 52 65 63 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  Rec;.    if( rc=
12930 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12940 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3e 69      if( iUpper>i
12950 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Lower ){.       
12960 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c   nNew = sqlite3L
12970 6f 67 45 73 74 28 69 55 70 70 65 72 20 2d 20 69  ogEst(iUpper - i
12980 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 7d 65  Lower);.      }e
12990 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 4e 65  lse{.        nNe
129a0 77 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61  w = 10;        a
129b0 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74  ssert( 10==sqlit
129c0 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20  e3LogEst(2) );. 
129d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
129e0 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20 20   nNew<nOut ){.  
129f0 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4e 65        nOut = nNe
12a00 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  w;.      }.     
12a10 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28   pLoop->nOut = (
12a20 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 20  LogEst)nOut;.   
12a30 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
12a40 31 30 2c 20 28 22 72 61 6e 67 65 20 73 63 61 6e  10, ("range scan
12a50 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75   regions: %u..%u
12a60 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20    est=%d\n",.   
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a80 20 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65        (u32)iLowe
12a90 72 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c 20  r, (u32)iUpper, 
12aa0 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 72 65  nOut));.      re
12ab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12ac0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
12ad0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
12ae0 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e  ER(pParse);.  UN
12af0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
12b00 42 75 69 6c 64 65 72 29 3b 0a 23 65 6e 64 69 66  Builder);.#endif
12b10 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65  .  assert( pLowe
12b20 72 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 20  r || pUpper );. 
12b30 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 45 61 63   /* TUNING:  Eac
12b40 68 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  h inequality con
12b50 73 74 72 61 69 6e 74 20 72 65 64 75 63 65 73 20  straint reduces 
12b60 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
12b70 20 34 2d 66 6f 6c 64 2e 0a 20 20 2a 2a 20 41 20   4-fold..  ** A 
12b80 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
12b90 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 72 65 64  , therefore, red
12ba0 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20  uces the search 
12bb0 73 70 61 63 65 20 31 36 2d 66 6f 6c 64 20 2a 2f  space 16-fold */
12bc0 0a 20 20 6e 4e 65 77 20 3d 20 6e 4f 75 74 3b 0a  .  nNew = nOut;.
12bd0 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20    if( pLower && 
12be0 28 70 4c 6f 77 65 72 2d 3e 77 74 46 6c 61 67 73  (pLower->wtFlags
12bf0 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
12c00 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d  0 ){.    nNew -=
12c10 20 32 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   20;        asse
12c20 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 20==sqlite3L
12c30 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20  ogEst(4) );.    
12c40 6e 4f 75 74 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66  nOut--;.  }.  if
12c50 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  ( pUpper ){.    
12c60 6e 4e 65 77 20 2d 3d 20 32 30 3b 20 20 20 20 20  nNew -= 20;     
12c70 20 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73     assert( 20==s
12c80 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20  qlite3LogEst(4) 
12c90 29 3b 0a 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20  );.    nOut--;. 
12ca0 20 7d 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30   }.  if( nNew<10
12cb0 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20   ) nNew = 10;.  
12cc0 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20  if( nNew<nOut ) 
12cd0 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 70  nOut = nNew;.  p
12ce0 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f  Loop->nOut = (Lo
12cf0 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65 74  gEst)nOut;.  ret
12d00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
12d10 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
12d20 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
12d30 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
12d40 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
12d50 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
12d60 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a  turned based on.
12d70 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63  ** an equality c
12d80 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c 55  onstraint x=VALU
12d90 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61 74  E and where that
12da0 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69 6e   VALUE occurs in
12db0 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72 61  .** the histogra
12dc0 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f 6e  m data.  This on
12dd0 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20  ly works when x 
12de0 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  is the left-most
12df0 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  .** column of an
12e00 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69 74   index and sqlit
12e10 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72 61  e_stat3 histogra
12e20 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61  m data is availa
12e30 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20  ble.** for that 
12e40 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45 78  index.  When pEx
12e50 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  pr==NULL that me
12e60 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69  ans the constrai
12e70 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e  nt is.** "x IS N
12e80 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20  ULL" instead of 
12e90 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a  "x=VALUE"..**.**
12ea0 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d   Write the estim
12eb0 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69  ated row count i
12ec0 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72  nto *pnRow and r
12ed0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
12ee0 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74   .** If unable t
12ef0 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61  o make an estima
12f00 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77  te, leave *pnRow
12f10 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72   unchanged and r
12f20 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
12f30 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  o..**.** This ro
12f40 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69  utine can fail i
12f50 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74  f it is unable t
12f60 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69  o load a collati
12f70 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72  ng sequence.** r
12f80 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69  equired for stri
12f90 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f  ng comparison, o
12fa0 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61  r if unable to a
12fb0 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a  llocate memory.*
12fc0 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76  * for a UTF conv
12fd0 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ersion required 
12fe0 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  for comparison. 
12ff0 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74   The error is st
13000 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ored.** in the p
13010 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
13020 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
13030 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
13040 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
13050 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
13060 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
13070 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
13080 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
13090 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
130a0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
130b0 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
130c0 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e  ion for VALUE in
130d0 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e   the x=VALUE con
130e0 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f  straint */.  tRo
130f0 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20  wcnt *pnRow     
13100 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
13110 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d  evised row estim
13120 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ate here */.){. 
13130 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69   Index *p = pBui
13140 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
13150 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ree.pIndex;.  in
13160 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64 65 72  t nEq = pBuilder
13170 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
13180 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52  nEq;.  UnpackedR
13190 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42  ecord *pRec = pB
131a0 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20  uilder->pRec;.  
131b0 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20 20  u8 aff;         
131c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
131d0 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a  umn affinity */.
131e0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
131f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
13200 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
13210 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
13220 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20  cnt a[2];       
13230 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74        /* Statist
13240 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b  ics */.  int bOk
13250 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71  ;..  assert( nEq
13260 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
13270 20 6e 45 71 3c 3d 28 70 2d 3e 6e 4b 65 79 43 6f   nEq<=(p->nKeyCo
13280 6c 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  l+1) );.  assert
13290 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20  ( p->aSample!=0 
132a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
132b0 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61  nSample>0 );.  a
132c0 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d  ssert( pBuilder-
132d0 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71 20 29  >nRecValid<nEq )
132e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75 65  ;..  /* If value
132f0 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61  s are not availa
13300 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69 65 6c  ble for all fiel
13310 64 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ds of the index 
13320 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a  to the left.  **
13330 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e 6f   of this one, no
13340 20 65 73 74 69 6d 61 74 65 20 63 61 6e 20 62 65   estimate can be
13350 20 6d 61 64 65 2e 20 52 65 74 75 72 6e 20 53 51   made. Return SQ
13360 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a  LITE_NOTFOUND. *
13370 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72  /.  if( pBuilder
13380 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45 71  ->nRecValid<(nEq
13390 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  -1) ){.    retur
133a0 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
133b0 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  D;.  }..  /* Thi
133c0 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
133d0 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20 63  tion only. The c
133e0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53 74  all to sqlite3St
133f0 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
13400 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77 6f  ().  ** below wo
13410 75 6c 64 20 72 65 74 75 72 6e 20 74 68 65 20 73  uld return the s
13420 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20  ame value.  */. 
13430 20 69 66 28 20 6e 45 71 3e 70 2d 3e 6e 4b 65 79   if( nEq>p->nKey
13440 43 6f 6c 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f  Col ){.    *pnRo
13450 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  w = 1;.    retur
13460 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13470 0a 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61  ..  aff = p->pTa
13480 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43  ble->aCol[p->aiC
13490 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61 66  olumn[nEq-1]].af
134a0 66 69 6e 69 74 79 3b 0a 20 20 72 63 20 3d 20 73  finity;.  rc = s
134b0 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
134c0 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  SetValue(pParse,
134d0 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72   p, &pRec, pExpr
134e0 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20 26 62  , aff, nEq-1, &b
134f0 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d  Ok);.  pBuilder-
13500 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20  >pRec = pRec;.  
13510 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13520 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
13530 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65   if( bOk==0 ) re
13540 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
13550 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65 72  OUND;.  pBuilder
13560 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 45  ->nRecValid = nE
13570 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53 74  q;..  whereKeySt
13580 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
13590 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48  Rec, 0, a);.  WH
135a0 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22  ERETRACE(0x10,("
135b0 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65  equality scan re
135c0 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28 69  gions: %d\n", (i
135d0 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e  nt)a[1]));.  *pn
135e0 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20  Row = a[1];.  . 
135f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
13600 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
13610 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
13620 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20  TAT4 */..#ifdef 
13630 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
13640 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a  AT3_OR_STAT4./*.
13650 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
13660 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
13670 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
13680 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  rned based on.**
13690 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   an IN constrain
136a0 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68  t where the righ
136b0 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
136c0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
136d0 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76  * is a list of v
136e0 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a  alues.  Example:
136f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48  .**.**        WH
13700 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c  ERE x IN (1,2,3,
13710 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  4).**.** Write t
13720 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77  he estimated row
13730 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52   count into *pnR
13740 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ow and return SQ
13750 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20  LITE_OK. .** If 
13760 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61  unable to make a
13770 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76  n estimate, leav
13780 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67  e *pnRow unchang
13790 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ed and return.**
137a0 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
137b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
137c0 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20  n fail if it is 
137d0 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61  unable to load a
137e0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
137f0 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20  nce.** required 
13800 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  for string compa
13810 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61  rison, or if una
13820 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
13830 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20  memory.** for a 
13840 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72  UTF conversion r
13850 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70  equired for comp
13860 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72  arison.  The err
13870 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20  or is stored.** 
13880 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
13890 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
138a0 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63  ic int whereInSc
138b0 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
138c0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
138d0 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
138e0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
138f0 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  xt */.  WhereLoo
13900 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
13910 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  er,.  ExprList *
13920 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68  pList,     /* Th
13930 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20  e value list on 
13940 74 68 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e  the RHS of "x IN
13950 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22   (v1,v2,v3,...)"
13960 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70   */.  tRowcnt *p
13970 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72  nRow       /* Wr
13980 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20  ite the revised 
13990 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72  row estimate her
139a0 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  e */.){.  Index 
139b0 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  *p = pBuilder->p
139c0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
139d0 64 65 78 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56  dex;.  int nRecV
139e0 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d  alid = pBuilder-
139f0 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e  >nRecValid;.  in
13a00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13a10 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63  ;     /* Subfunc
13a20 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65  tion return code
13a30 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45   */.  tRowcnt nE
13a40 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
13a50 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   Number of rows 
13a60 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72  for a single ter
13a70 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  m */.  tRowcnt n
13a80 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f  RowEst = 0;    /
13a90 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f  * New estimate o
13aa0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
13ab0 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  rows */.  int i;
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ad0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
13ae0 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
13af0 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b  p->aSample!=0 );
13b00 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
13b10 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
13b20 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
13b30 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 70 2d  ){.    nEst = p-
13b40 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20  >aiRowEst[0];.  
13b50 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
13b60 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
13b70 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74   pBuilder, pList
13b80 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e  ->a[i].pExpr, &n
13b90 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73  Est);.    nRowEs
13ba0 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70  t += nEst;.    p
13bb0 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
13bc0 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a  id = nRecValid;.
13bd0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
13be0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13bf0 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d  if( nRowEst > p-
13c00 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e  >aiRowEst[0] ) n
13c10 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f  RowEst = p->aiRo
13c20 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e  wEst[0];.    *pn
13c30 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20  Row = nRowEst;. 
13c40 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
13c50 31 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69  10,("IN row esti
13c60 6d 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e 22 2c  mate: est=%g\n",
13c70 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a   nRowEst));.  }.
13c80 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64    assert( pBuild
13c90 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e  er->nRecValid==n
13ca0 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65  RecValid );.  re
13cb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
13cc0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
13cd0 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
13ce0 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61  4 */../*.** Disa
13cf0 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68  ble a term in th
13d00 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
13d10 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20   Except, do not 
13d20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d  disable the term
13d30 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f  .** if it contro
13d40 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  ls a LEFT OUTER 
13d50 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20  JOIN and it did 
13d60 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e  not originate in
13d70 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53   the ON.** or US
13d80 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ING clause of th
13d90 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43  at join..**.** C
13da0 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d  onsider the term
13db0 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68   t2.z='ok' in th
13dc0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
13dd0 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  ies:.**.**   (1)
13de0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
13df0 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
13e00 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45  ON t1.a=t2.x WHE
13e10 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20  RE t2.z='ok'.** 
13e20 20 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20    (2)  SELECT * 
13e30 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
13e40 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
13e50 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
13e60 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54  **   (3)  SELECT
13e70 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57   * FROM t1, t2 W
13e80 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41  HERE t1.a=t2.x A
13e90 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a  ND t2.z='ok'.**.
13ea0 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27  ** The t2.z='ok'
13eb0 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
13ec0 74 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75  the in (2) becau
13ed0 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73  se it originates
13ee0 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c  .** in the ON cl
13ef0 61 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20  ause.  The term 
13f00 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  is disabled in (
13f10 33 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73  3) because it is
13f20 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20   not part.** of 
13f30 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
13f40 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20  N.  In (1), the 
13f50 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61  term is not disa
13f60 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61  bled..**.** Disa
13f70 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75  bling a term cau
13f80 73 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f  ses that term to
13f90 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69   not be tested i
13fa0 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  n the inner loop
13fb0 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  .** of the join.
13fc0 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61    Disabling is a
13fd0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
13fe0 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20   When terms are 
13ff0 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20  satisfied.** by 
14000 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73 61  indices, we disa
14010 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76  ble them to prev
14020 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65  ent redundant te
14030 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72  sts in the inner
14040 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f  .** loop.  We wo
14050 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72  uld get the corr
14060 65 63 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e  ect results if n
14070 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76 65 72  othing were ever
14080 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75   disabled,.** bu
14090 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75  t joins might ru
140a0 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65  n a little slowe
140b0 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69 73  r.  The trick is
140c0 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d   to disable as m
140d0 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e  uch.** as we can
140e0 20 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69   without disabli
140f0 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66  ng too much.  If
14100 20 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20   we disabled in 
14110 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a  (1), we'd get.**
14120 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65   the wrong answe
14130 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  r.  See ticket #
14140 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  813..*/.static v
14150 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28  oid disableTerm(
14160 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
14170 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70  el, WhereTerm *p
14180 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65  Term){.  if( pTe
14190 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54 65  rm.      && (pTe
141a0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
141b0 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20  RM_CODED)==0.   
141c0 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69     && (pLevel->i
141d0 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45  LeftJoin==0 || E
141e0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
141f0 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
14200 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20  FromJoin)).     
14210 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 6e 6f 74   && (pLevel->not
14220 52 65 61 64 79 20 26 20 70 54 65 72 6d 2d 3e 70  Ready & pTerm->p
14230 72 65 72 65 71 41 6c 6c 29 3d 3d 30 0a 20 20 29  rereqAll)==0.  )
14240 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46  {.    pTerm->wtF
14250 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
14260 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ED;.    if( pTer
14270 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b  m->iParent>=0 ){
14280 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
14290 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72   *pOther = &pTer
142a0 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d  m->pWC->a[pTerm-
142b0 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20  >iParent];.     
142c0 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e   if( (--pOther->
142d0 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20  nChild)==0 ){.  
142e0 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
142f0 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72  m(pLevel, pOther
14300 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14310 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
14320 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74  de an OP_Affinit
14330 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c  y opcode to appl
14340 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66  y the column aff
14350 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66  inity string zAf
14360 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65  f.** to the n re
14370 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
14380 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a   at base. .**.**
14390 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   As an optimizat
143a0 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  ion, SQLITE_AFF_
143b0 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68  NONE entries (wh
143c0 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20  ich are no-ops) 
143d0 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e  at the.** beginn
143e0 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a  ing and end of z
143f0 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  Aff are ignored.
14400 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73    If all entries
14410 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20   in zAff are.** 
14420 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c  SQLITE_AFF_NONE,
14430 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65   then no code ge
14440 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a  ts generated..**
14450 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14460 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63   makes its own c
14470 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74  opy of zAff so t
14480 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69  hat the caller i
14490 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64  s free.** to mod
144a0 69 66 79 20 7a 41 66 66 20 61 66 74 65 72 20 74  ify zAff after t
144b0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
144c0 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rns..*/.static v
144d0 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66  oid codeApplyAff
144e0 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61  inity(Parse *pPa
144f0 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69  rse, int base, i
14500 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66  nt n, char *zAff
14510 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
14520 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
14530 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20  if( zAff==0 ){. 
14540 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
14550 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
14560 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
14570 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
14580 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41   v!=0 );..  /* A
14590 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e  djust base and n
145a0 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51   to skip over SQ
145b0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e  LITE_AFF_NONE en
145c0 74 72 69 65 73 20 61 74 20 74 68 65 20 62 65 67  tries at the beg
145d0 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20  inning.  ** and 
145e0 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e  end of the affin
145f0 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f  ity string..  */
14600 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
14610 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45   zAff[0]==SQLITE
14620 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
14630 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b   n--;.    base++
14640 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20  ;.    zAff++;.  
14650 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  }.  while( n>1 &
14660 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c  & zAff[n-1]==SQL
14670 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
14680 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20      n--;.  }..  
14690 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41  /* Code the OP_A
146a0 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69  ffinity opcode i
146b0 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68  f there is anyth
146c0 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20  ing left to do. 
146d0 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a  */.  if( n>0 ){.
146e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
146f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp2(v, OP_Affi
14700 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a  nity, base, n);.
14710 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
14720 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a  hangeP4(v, -1, z
14730 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c  Aff, n);.    sql
14740 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
14750 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
14760 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20  se, base, n);.  
14770 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  }.}.../*.** Gene
14780 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
14790 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20  single equality 
147a0 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
147b0 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71  E clause.  An eq
147c0 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63  uality.** term c
147d0 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65  an be either X=e
147e0 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e  xpr or X IN (...
147f0 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68  ).   pTerm is th
14800 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a  e term to be .**
14810 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   coded..**.** Th
14820 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
14830 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69  for the constrai
14840 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  nt is left in re
14850 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a  gister iReg..**.
14860 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61  ** For a constra
14870 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  int of the form 
14880 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72  X=expr, the expr
14890 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61  ession is evalua
148a0 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72  ted and its.** r
148b0 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e  esult is left on
148c0 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72   the stack.  For
148d0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20   constraints of 
148e0 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e  the form X IN (.
148f0 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ..).** this rout
14900 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f  ine sets up a lo
14910 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65  op that will ite
14920 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61  rate over all va
14930 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74  lues of X..*/.st
14940 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75  atic int codeEqu
14950 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72  alityTerm(.  Par
14960 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
14970 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
14980 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
14990 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20  reTerm *pTerm,  
149a0 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20   /* The term of 
149b0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
149c0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
149d0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
149e0 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76  evel, /* The lev
149f0 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  el of the FROM c
14a00 6c 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72  lause we are wor
14a10 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74  king on */.  int
14a20 20 69 45 71 2c 20 20 20 20 20 20 20 20 20 20 20   iEq,           
14a30 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
14a40 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77   equality term w
14a50 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c  ithin this level
14a60 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20   */.  int bRev, 
14a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
14a80 65 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72  e for reverse-or
14a90 64 65 72 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e  der IN operation
14aa0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67  s */.  int iTarg
14ab0 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74  et         /* At
14ac0 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72  tempt to leave r
14ad0 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72  esults in this r
14ae0 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
14af0 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
14b00 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20  ->pExpr;.  Vdbe 
14b10 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
14b20 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20  be;.  int iReg; 
14b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b40 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
14b50 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ding results */.
14b60 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67  .  assert( iTarg
14b70 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58  et>0 );.  if( pX
14b80 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20  ->op==TK_EQ ){. 
14b90 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65     iReg = sqlite
14ba0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
14bb0 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
14bc0 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20  ht, iTarget);.  
14bd0 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70  }else if( pX->op
14be0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
14bf0 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65     iReg = iTarge
14c00 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
14c10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
14c20 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23  ull, 0, iReg);.#
14c30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14c40 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65  IT_SUBQUERY.  }e
14c50 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79  lse{.    int eTy
14c60 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62  pe;.    int iTab
14c70 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c  ;.    struct InL
14c80 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68  oop *pIn;.    Wh
14c90 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d  ereLoop *pLoop =
14ca0 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
14cb0 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  ..    if( (pLoop
14cc0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
14cd0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
14ce0 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f  =0.      && pLoo
14cf0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
14d00 78 21 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c  x!=0.      && pL
14d10 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
14d20 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
14d30 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20  iEq].    ){.    
14d40 20 20 74 65 73 74 63 61 73 65 28 20 69 45 71 3d    testcase( iEq=
14d50 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
14d60 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20  case( bRev );.  
14d70 20 20 20 20 62 52 65 76 20 3d 20 21 62 52 65 76      bRev = !bRev
14d80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
14d90 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
14da0 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20  N );.    iReg = 
14db0 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79  iTarget;.    eTy
14dc0 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
14dd0 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
14de0 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  pX, 0);.    if( 
14df0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
14e00 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20  INDEX_DESC ){.  
14e10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52      testcase( bR
14e20 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76  ev );.      bRev
14e30 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a   = !bRev;.    }.
14e40 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69      iTab = pX->i
14e50 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74  Table;.    sqlit
14e60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14e70 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a  bRev ? OP_Last :
14e80 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
14e90 2c 20 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  , 0);.    VdbeCo
14ea0 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
14eb0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
14ec0 61 67 65 49 66 28 76 2c 20 21 62 52 65 76 29 3b  ageIf(v, !bRev);
14ed0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c  .    assert( (pL
14ee0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
14ef0 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d  HERE_MULTI_OR)==
14f00 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  0 );.    pLoop->
14f10 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
14f20 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20 20 20 69 66  _IN_ABLE;.    if
14f30 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  ( pLevel->u.in.n
14f40 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  In==0 ){.      p
14f50 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d  Level->addrNxt =
14f60 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
14f70 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a  Label(v);.    }.
14f80 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e      pLevel->u.in
14f90 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76  .nIn++;.    pLev
14fa0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
14fb0 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65   =.       sqlite
14fc0 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
14fd0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65  (pParse->db, pLe
14fe0 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
14ff0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
15000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15010 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e   sizeof(pLevel->
15020 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29  u.in.aInLoop[0])
15030 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49  *pLevel->u.in.nI
15040 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c  n);.    pIn = pL
15050 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
15060 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20  op;.    if( pIn 
15070 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20  ){.      pIn += 
15080 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
15090 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d   - 1;.      pIn-
150a0 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20  >iCur = iTab;.  
150b0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49      if( eType==I
150c0 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b  N_INDEX_ROWID ){
150d0 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64  .        pIn->ad
150e0 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65  drInTop = sqlite
150f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15100 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69  P_Rowid, iTab, i
15110 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
15120 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e  e{.        pIn->
15130 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69  addrInTop = sqli
15140 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
15150 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
15160 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  , 0, iReg);.    
15170 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 2d 3e 65    }.      pIn->e
15180 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62 52 65 76  EndLoopOp = bRev
15190 20 3f 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e   ? OP_PrevIfOpen
151a0 20 3a 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e   : OP_NextIfOpen
151b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
151c0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
151d0 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 20 56  IsNull, iReg); V
151e0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
151f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15200 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
15210 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e  n = 0;.    }.#en
15220 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c  dif.  }.  disabl
15230 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
15240 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  erm);.  return i
15250 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Reg;.}../*.** Ge
15260 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
15270 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61   will evaluate a
15280 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e  ll == and IN con
15290 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a  straints for an.
152a0 2a 2a 20 69 6e 64 65 78 20 73 63 61 6e 2e 0a 2a  ** index scan..*
152b0 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
152c0 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65  , consider table
152d0 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29   t1(a,b,c,d,e,f)
152e0 20 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61   with index i1(a
152f0 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73  ,b,c)..** Suppos
15300 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
15310 73 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d  se is this:  a==
15320 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c  5 AND b IN (1,2,
15330 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63  3) AND c>5 AND c
15340 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  <10.** The index
15350 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20   has as many as 
15360 74 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63  three equality c
15370 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20  onstraints, but 
15380 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70  in this.** examp
15390 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63  le, the third "c
153a0 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e  " value is an in
153b0 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e  equality.  So on
153c0 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74  ly two .** const
153d0 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64  raints are coded
153e0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
153f0 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f  will generate co
15400 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a  de to evaluate.*
15410 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20  * a==5 and b IN 
15420 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75  (1,2,3).  The cu
15430 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72  rrent values for
15440 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65   a and b will be
15450 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f   stored.** in co
15460 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74  nsecutive regist
15470 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ers and the inde
15480 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  x of the first r
15490 65 67 69 73 74 65 72 20 69 73 20 72 65 74 75 72  egister is retur
154a0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ned..**.** In th
154b0 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20  e example above 
154c0 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69  nEq==2.  But thi
154d0 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72  s subroutine wor
154e0 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65  ks for any value
154f0 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75  .** of nEq inclu
15500 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d  ding 0.  If nEq=
15510 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  =0, this routine
15520 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d   is nearly a no-
15530 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  op..** The only 
15540 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73  thing it does is
15550 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c   allocate the pL
15560 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72  evel->iMem memor
15570 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f  y cell and.** co
15580 6d 70 75 74 65 20 74 68 65 20 61 66 66 69 6e 69  mpute the affini
15590 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ty string..**.**
155a0 20 54 68 65 20 6e 45 78 74 72 61 52 65 67 20 70   The nExtraReg p
155b0 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 6f 72  arameter is 0 or
155c0 20 31 2e 20 20 49 74 20 69 73 20 30 20 69 66 20   1.  It is 0 if 
155d0 61 6c 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  all WHERE clause
155e0 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
155f0 61 72 65 20 3d 3d 20 6f 72 20 49 4e 20 61 6e 64  are == or IN and
15600 20 61 72 65 20 63 6f 76 65 72 65 64 20 62 79 20   are covered by 
15610 74 68 65 20 6e 45 71 2e 20 20 6e 45 78 74 72 61  the nEq.  nExtra
15620 52 65 67 20 69 73 20 31 20 69 66 20 74 68 65 72  Reg is 1 if ther
15630 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 65 71 75  e is.** an inequ
15640 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
15650 20 28 73 75 63 68 20 61 73 20 74 68 65 20 22 63   (such as the "c
15660 3e 3d 35 20 41 4e 44 20 63 3c 31 30 22 20 69 6e  >=5 AND c<10" in
15670 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20 74 68   the example) th
15680 61 74 0a 2a 2a 20 6f 63 63 75 72 73 20 61 66 74  at.** occurs aft
15690 65 72 20 74 68 65 20 6e 45 71 20 71 75 61 6c 69  er the nEq quali
156a0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  ty constraints..
156b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
156c0 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 72  ne allocates a r
156d0 61 6e 67 65 20 6f 66 20 6e 45 71 2b 6e 45 78 74  ange of nEq+nExt
156e0 72 61 52 65 67 20 6d 65 6d 6f 72 79 20 63 65 6c  raReg memory cel
156f0 6c 73 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a  ls and returns.*
15700 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  * the index of t
15710 68 65 20 66 69 72 73 74 20 6d 65 6d 6f 72 79 20  he first memory 
15720 63 65 6c 6c 20 69 6e 20 74 68 61 74 20 72 61 6e  cell in that ran
15730 67 65 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61  ge. The code tha
15740 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20  t.** calls this 
15750 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65  routine will use
15760 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 72 61 6e   that memory ran
15770 67 65 20 74 6f 20 73 74 6f 72 65 20 6b 65 79 73  ge to store keys
15780 20 66 6f 72 0a 2a 2a 20 73 74 61 72 74 20 61 6e   for.** start an
15790 64 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  d termination co
157a0 6e 64 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  nditions of the 
157b0 6c 6f 6f 70 2e 0a 2a 2a 20 6b 65 79 20 76 61 6c  loop..** key val
157c0 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  ue of the loop. 
157d0 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   If one or more 
157e0 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70  IN operators app
157f0 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ear, then.** thi
15800 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61  s routine alloca
15810 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61  tes an additiona
15820 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c  l nEq memory cel
15830 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a  ls for internal.
15840 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65  ** use..**.** Be
15850 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
15860 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f  *pzAff is set to
15870 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
15880 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a  er containing a.
15890 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  ** copy of the c
158a0 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73  olumn affinity s
158b0 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64  tring of the ind
158c0 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  ex allocated usi
158d0 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d  ng.** sqlite3DbM
158e0 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c  alloc(). Except,
158f0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
15900 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72 69  copy of the stri
15910 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ng associated.**
15920 20 77 69 74 68 20 65 71 75 61 6c 69 74 79 20 63   with equality c
15930 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20  onstraints that 
15940 75 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74  use NONE affinit
15950 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20  y are set to.** 
15960 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
15970 20 54 68 69 73 20 69 73 20 74 6f 20 64 65 61 6c   This is to deal
15980 20 77 69 74 68 20 53 51 4c 20 73 75 63 68 20 61   with SQL such a
15990 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
159a0 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
159b0 54 41 42 4c 45 20 74 31 28 61 20 54 45 58 54 20  TABLE t1(a TEXT 
159c0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b  PRIMARY KEY, b);
159d0 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e  .**   SELECT ...
159e0 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c 20   FROM t1 AS t2, 
159f0 74 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d 20  t1 WHERE t1.a = 
15a00 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  t2.b;.**.** In t
15a10 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
15a20 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74  , the index on t
15a30 31 28 61 29 20 68 61 73 20 54 45 58 54 20 61 66  1(a) has TEXT af
15a40 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e 63  finity. But sinc
15a50 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20 68  e.** the right h
15a60 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
15a70 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
15a80 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20 4e  int (t2.b) has N
15a90 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a  ONE affinity,.**
15aa0 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73   no conversion s
15ab0 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d 70 74  hould be attempt
15ac0 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20  ed before using 
15ad0 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61 73 20  a t2.b value as 
15ae0 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79  part of.** a key
15af0 20 74 6f 20 73 65 61 72 63 68 20 74 68 65 20 69   to search the i
15b00 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68 65 20  ndex. Hence the 
15b10 66 69 72 73 74 20 62 79 74 65 20 69 6e 20 74 68  first byte in th
15b20 65 20 72 65 74 75 72 6e 65 64 20 61 66 66 69 6e  e returned affin
15b30 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e  ity.** string in
15b40 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20 77 6f   this example wo
15b50 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 53 51  uld be set to SQ
15b60 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a  LITE_AFF_NONE..*
15b70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
15b80 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d  eAllEqualityTerm
15b90 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
15ba0 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
15bb0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
15bc0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
15bd0 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63  Level,   /* Whic
15be0 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  h nested loop of
15bf0 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65   the FROM we are
15c00 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74   coding */.  int
15c10 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20   bRev,          
15c20 20 20 20 2f 2a 20 52 65 76 65 72 73 65 20 74 68     /* Reverse th
15c30 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 6f 70  e order of IN op
15c40 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74  erators */.  int
15c50 20 6e 45 78 74 72 61 52 65 67 2c 20 20 20 20 20   nExtraReg,     
15c60 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
15c70 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
15c80 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
15c90 20 63 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20   char **pzAff   
15ca0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
15cb0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
15cc0 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a  ffinity string *
15cd0 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 45 71 3b 20  /.){.  u16 nEq; 
15ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cf0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
15d00 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63  er of == or IN c
15d10 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f  onstraints to co
15d20 64 65 20 2a 2f 0a 20 20 75 31 36 20 6e 53 6b 69  de */.  u16 nSki
15d30 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
15d40 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15d50 6f 66 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  of left-most col
15d60 75 6d 6e 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a  umns to skip */.
15d70 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
15d80 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
15d90 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20  /* The vm under 
15da0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
15db0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dd0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69  /* The index bei
15de0 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69 73  ng used for this
15df0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65   loop */.  Where
15e00 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
15e10 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
15e20 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ngle constraint 
15e30 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  term */.  WhereL
15e40 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  oop *pLoop;     
15e50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
15e60 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
15e70 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
15e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e90 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
15ea0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42  er */.  int regB
15eb0 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
15ec0 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65        /* Base re
15ed0 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
15ee0 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nReg;           
15ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
15f00 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73  ber of registers
15f10 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
15f20 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20    char *zAff;   
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f40 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69  /* Affinity stri
15f50 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ng to return */.
15f60 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c  .  /* This modul
15f70 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
15f80 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20   on query plans 
15f90 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65  that use an inde
15fa0 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20  x. */.  pLoop = 
15fb0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
15fc0 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
15fd0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
15fe0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
15ff0 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c  =0 );.  nEq = pL
16000 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
16010 3b 0a 20 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f  ;.  nSkip = pLoo
16020 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70  p->u.btree.nSkip
16030 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70  ;.  pIdx = pLoop
16040 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
16050 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
16060 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67  !=0 );..  /* Fig
16070 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
16080 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65   memory cells we
16090 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20   will need then 
160a0 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20  allocate them.. 
160b0 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20   */.  regBase = 
160c0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
160d0 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70  ;.  nReg = pLoop
160e0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20  ->u.btree.nEq + 
160f0 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61  nExtraReg;.  pPa
16100 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
16110 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c  g;..  zAff = sql
16120 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61  ite3DbStrDup(pPa
16130 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33  rse->db, sqlite3
16140 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72  IndexAffinityStr
16150 28 76 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66  (v, pIdx));.  if
16160 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70  ( !zAff ){.    p
16170 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
16180 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d  cFailed = 1;.  }
16190 0a 0a 20 20 69 66 28 20 6e 53 6b 69 70 20 29 7b  ..  if( nSkip ){
161a0 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75 72  .    int iIdxCur
161b0 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
161c0 75 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ur;.    sqlite3V
161d0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 28 62 52  dbeAddOp1(v, (bR
161e0 65 76 3f 4f 50 5f 4c 61 73 74 3a 4f 50 5f 52 65  ev?OP_Last:OP_Re
161f0 77 69 6e 64 29 2c 20 69 49 64 78 43 75 72 29 3b  wind), iIdxCur);
16200 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
16210 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b  eIf(v, bRev==0);
16220 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
16230 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29 3b  eIf(v, bRev!=0);
16240 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
16250 28 28 76 2c 20 22 62 65 67 69 6e 20 73 6b 69 70  ((v, "begin skip
16260 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 49  -scan on %s", pI
16270 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  dx->zName));.   
16280 20 6a 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   j = sqlite3Vdbe
16290 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
162a0 6f 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  o);.    pLevel->
162b0 61 64 64 72 53 6b 69 70 20 3d 20 73 71 6c 69 74  addrSkip = sqlit
162c0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
162d0 76 2c 20 28 62 52 65 76 3f 4f 50 5f 53 65 65 6b  v, (bRev?OP_Seek
162e0 4c 54 3a 4f 50 5f 53 65 65 6b 47 54 29 2c 0a 20  LT:OP_SeekGT),. 
162f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16300 20 20 20 20 20 20 20 20 20 20 20 69 49 64 78 43             iIdxC
16310 75 72 2c 20 30 2c 20 72 65 67 42 61 73 65 2c 20  ur, 0, regBase, 
16320 6e 53 6b 69 70 29 3b 0a 20 20 20 20 56 64 62 65  nSkip);.    Vdbe
16330 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
16340 65 76 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62 65  ev==0);.    Vdbe
16350 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
16360 65 76 21 3d 30 29 3b 0a 20 20 20 20 73 71 6c 69  ev!=0);.    sqli
16370 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
16380 76 2c 20 6a 29 3b 0a 20 20 20 20 66 6f 72 28 6a  v, j);.    for(j
16390 3d 30 3b 20 6a 3c 6e 53 6b 69 70 3b 20 6a 2b 2b  =0; j<nSkip; j++
163a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
163b0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
163c0 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72  _Column, iIdxCur
163d0 2c 20 6a 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b  , j, regBase+j);
163e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
163f0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
16400 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 56 64 62  >=0 );.      Vdb
16410 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
16420 22 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d  ", pIdx->pTable-
16430 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f  >aCol[pIdx->aiCo
16440 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 29 29  lumn[j]].zName))
16450 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 20 0a  ;.    }.  }    .
16460 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74  .  /* Evaluate t
16470 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  he equality cons
16480 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61  traints.  */.  a
16490 73 73 65 72 74 28 20 7a 41 66 66 3d 3d 30 20 7c  ssert( zAff==0 |
164a0 7c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41  | (int)strlen(zA
164b0 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f  ff)>=nEq );.  fo
164c0 72 28 6a 3d 6e 53 6b 69 70 3b 20 6a 3c 6e 45 71  r(j=nSkip; j<nEq
164d0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; j++){.    int 
164e0 72 31 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  r1;.    pTerm = 
164f0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
16500 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
16510 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 2f 2a  erm!=0 );.    /*
16520 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
16530 65 73 74 63 61 73 65 20 69 73 20 74 72 75 65 20  estcase is true 
16540 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74 68  for indices with
16550 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d   redundant colum
16560 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20  ns. .    ** Ex: 
16570 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
16580 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53 45  ON t1(a,b,a); SE
16590 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
165a0 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d 30  HERE a=0 AND b=0
165b0 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73  ; */.    testcas
165c0 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  e( (pTerm->wtFla
165d0 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
165e0 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
165f0 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
16600 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
16610 41 4c 20 29 3b 0a 20 20 20 20 72 31 20 3d 20 63  AL );.    r1 = c
16620 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
16630 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
16640 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20  Level, j, bRev, 
16650 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
16660 69 66 28 20 72 31 21 3d 72 65 67 42 61 73 65 2b  if( r1!=regBase+
16670 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  j ){.      if( n
16680 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Reg==1 ){.      
16690 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
166a0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
166b0 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20 20  regBase);.      
166c0 20 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b 0a    regBase = r1;.
166d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
166e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
166f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
16700 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b  py, r1, regBase+
16710 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j);.      }.    
16720 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
16730 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
16740 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
16750 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
16760 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
16770 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66   WO_IN );.    if
16780 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
16790 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c  tor & (WO_ISNULL
167a0 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20  |WO_IN))==0 ){. 
167b0 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
167c0 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  t = pTerm->pExpr
167d0 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
167e0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
167f0 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68 74 29  anBeNull(pRight)
16800 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16810 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16820 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42   OP_IsNull, regB
16830 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61  ase+j, pLevel->a
16840 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 20  ddrBrk);.       
16850 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
16860 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16870 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20 20 20  if( zAff ){.    
16880 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
16890 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
168a0 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d  Right, zAff[j])=
168b0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
168c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41   ){.          zA
168d0 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41  ff[j] = SQLITE_A
168e0 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
168f0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
16900 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
16910 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
16920 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29  pRight, zAff[j])
16930 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41   ){.          zA
16940 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41  ff[j] = SQLITE_A
16950 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
16960 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
16970 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20  .  }.  *pzAff = 
16980 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 72  zAff;.  return r
16990 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64  egBase;.}..#ifnd
169a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
169b0 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68 69  XPLAIN./*.** Thi
169c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68  s routine is a h
169d0 65 6c 70 65 72 20 66 6f 72 20 65 78 70 6c 61 69  elper for explai
169e0 6e 49 6e 64 65 78 52 61 6e 67 65 28 29 20 62 65  nIndexRange() be
169f0 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20 68  low.**.** pStr h
16a00 6f 6c 64 73 20 74 68 65 20 74 65 78 74 20 6f 66  olds the text of
16a10 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
16a20 68 61 74 20 77 65 20 61 72 65 20 62 75 69 6c 64  hat we are build
16a30 69 6e 67 20 75 70 20 6f 6e 65 20 74 65 72 6d 0a  ing up one term.
16a40 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54  ** at a time.  T
16a50 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73  his routine adds
16a60 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74   a new term to t
16a70 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 65 78  he end of the ex
16a80 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72  pression..** Ter
16a90 6d 73 20 61 72 65 20 73 65 70 61 72 61 74 65 64  ms are separated
16aa0 20 62 79 20 41 4e 44 20 73 6f 20 61 64 64 20 74   by AND so add t
16ab0 68 65 20 22 41 4e 44 22 20 74 65 78 74 20 66 6f  he "AND" text fo
16ac0 72 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62  r second and sub
16ad0 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d 73  sequent.** terms
16ae0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63   only..*/.static
16af0 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 41 70 70   void explainApp
16b00 65 6e 64 54 65 72 6d 28 0a 20 20 53 74 72 41 63  endTerm(.  StrAc
16b10 63 75 6d 20 2a 70 53 74 72 2c 20 20 20 20 20 20  cum *pStr,      
16b20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65         /* The te
16b30 78 74 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65  xt expression be
16b40 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20 69  ing built */.  i
16b50 6e 74 20 69 54 65 72 6d 2c 20 20 20 20 20 20 20  nt iTerm,       
16b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
16b70 64 65 78 20 6f 66 20 74 68 69 73 20 74 65 72 6d  dex of this term
16b80 2e 20 20 46 69 72 73 74 20 69 73 20 7a 65 72 6f  .  First is zero
16b90 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
16ba0 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20   *zColumn,      
16bb0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
16bc0 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e   column */.  con
16bd0 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 20 20 20  st char *zOp    
16be0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
16bf0 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
16c00 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 54 65   */.){.  if( iTe
16c10 72 6d 20 29 20 73 71 6c 69 74 65 33 53 74 72 41  rm ) sqlite3StrA
16c20 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
16c30 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20   " AND ", 5);.  
16c40 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
16c50 70 70 65 6e 64 41 6c 6c 28 70 53 74 72 2c 20 7a  ppendAll(pStr, z
16c60 43 6f 6c 75 6d 6e 29 3b 0a 20 20 73 71 6c 69 74  Column);.  sqlit
16c70 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
16c80 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31 29 3b 0a  (pStr, zOp, 1);.
16c90 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
16ca0 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 3f  mAppend(pStr, "?
16cb0 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ", 1);.}../*.** 
16cc0 41 72 67 75 6d 65 6e 74 20 70 4c 65 76 65 6c 20  Argument pLevel 
16cd0 64 65 73 63 72 69 62 65 73 20 61 20 73 74 72 61  describes a stra
16ce0 74 65 67 79 20 66 6f 72 20 73 63 61 6e 6e 69 6e  tegy for scannin
16cf0 67 20 74 61 62 6c 65 20 70 54 61 62 2e 20 54 68  g table pTab. Th
16d00 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
16d10 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
16d20 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75  r to a string bu
16d30 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
16d40 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a 2a  a description.**
16d50 20 6f 66 20 74 68 65 20 73 75 62 73 65 74 20 6f   of the subset o
16d60 66 20 74 61 62 6c 65 20 72 6f 77 73 20 73 63 61  f table rows sca
16d70 6e 6e 65 64 20 62 79 20 74 68 65 20 73 74 72 61  nned by the stra
16d80 74 65 67 79 20 69 6e 20 74 68 65 20 66 6f 72 6d  tegy in the form
16d90 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c 20 65 78   of an.** SQL ex
16da0 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c 20 69 66  pression. Or, if
16db0 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 73 63   all rows are sc
16dc0 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72  anned, NULL is r
16dd0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  eturned..**.** F
16de0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
16df0 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
16e00 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
16e10 74 31 20 57 48 45 52 45 20 61 3d 31 20 41 4e 44  t1 WHERE a=1 AND
16e20 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20 72   b>2;.**.** is r
16e30 75 6e 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  un and there is 
16e40 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20  an index on (a, 
16e50 62 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  b), then this fu
16e60 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
16e70 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d 69 6c  .** string simil
16e80 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  ar to:.**.**   "
16e90 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a 2a 0a  a=? AND b>?".**.
16ea0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
16eb0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 74  pointer points t
16ec0 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
16ed0 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62  d from sqlite3Db
16ee0 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20  Malloc()..** It 
16ef0 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
16f00 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
16f10 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68 65 20  ler to free the 
16f20 62 75 66 66 65 72 20 77 68 65 6e 20 69 74 20 69  buffer when it i
16f30 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 72  s.** no longer r
16f40 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  equired..*/.stat
16f50 69 63 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e  ic char *explain
16f60 49 6e 64 65 78 52 61 6e 67 65 28 73 71 6c 69 74  IndexRange(sqlit
16f70 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
16f80 70 20 2a 70 4c 6f 6f 70 2c 20 54 61 62 6c 65 20  p *pLoop, Table 
16f90 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20  *pTab){.  Index 
16fa0 2a 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d  *pIndex = pLoop-
16fb0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
16fc0 0a 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f  .  u16 nEq = pLo
16fd0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
16fe0 0a 20 20 75 31 36 20 6e 53 6b 69 70 20 3d 20 70  .  u16 nSkip = p
16ff0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53  Loop->u.btree.nS
17000 6b 69 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  kip;.  int i, j;
17010 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20  .  Column *aCol 
17020 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  = pTab->aCol;.  
17030 69 31 36 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20  i16 *aiColumn = 
17040 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
17050 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 74 78 74  ;.  StrAccum txt
17060 3b 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20  ;..  if( nEq==0 
17070 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
17080 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f  gs & (WHERE_BTM_
17090 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
170a0 4c 49 4d 49 54 29 29 3d 3d 30 20 29 7b 0a 20 20  LIMIT))==0 ){.  
170b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
170c0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
170d0 6d 49 6e 69 74 28 26 74 78 74 2c 20 30 2c 20 30  mInit(&txt, 0, 0
170e0 2c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  , SQLITE_MAX_LEN
170f0 47 54 48 29 3b 0a 20 20 74 78 74 2e 64 62 20 3d  GTH);.  txt.db =
17100 20 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 53 74   db;.  sqlite3St
17110 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78  rAccumAppend(&tx
17120 74 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20 20 66  t, " (", 2);.  f
17130 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69  or(i=0; i<nEq; i
17140 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
17150 20 3d 20 28 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e   = (i==pIndex->n
17160 4b 65 79 43 6f 6c 20 29 20 3f 20 22 72 6f 77 69  KeyCol ) ? "rowi
17170 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75  d" : aCol[aiColu
17180 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  mn[i]].zName;.  
17190 20 20 69 66 28 20 69 3e 3d 6e 53 6b 69 70 20 29    if( i>=nSkip )
171a0 7b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 41  {.      explainA
171b0 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20  ppendTerm(&txt, 
171c0 69 2c 20 7a 2c 20 22 3d 22 29 3b 0a 20 20 20 20  i, z, "=");.    
171d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
171e0 20 69 20 29 20 73 71 6c 69 74 65 33 53 74 72 41   i ) sqlite3StrA
171f0 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c  ccumAppend(&txt,
17200 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20   " AND ", 5);.  
17210 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
17220 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20  cumAppend(&txt, 
17230 22 41 4e 59 28 22 2c 20 34 29 3b 0a 20 20 20 20  "ANY(", 4);.    
17240 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
17250 6d 41 70 70 65 6e 64 41 6c 6c 28 26 74 78 74 2c  mAppendAll(&txt,
17260 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   z);.      sqlit
17270 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
17280 28 26 74 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a  (&txt, ")", 1);.
17290 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6a 20 3d      }.  }..  j =
172a0 20 69 3b 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d   i;.  if( pLoop-
172b0 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 42  >wsFlags&WHERE_B
172c0 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
172d0 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49  char *z = (j==pI
172e0 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20  ndex->nKeyCol ) 
172f0 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c  ? "rowid" : aCol
17300 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  [aiColumn[j]].zN
17310 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e  ame;.    explain
17320 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c  AppendTerm(&txt,
17330 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a 20   i++, z, ">");. 
17340 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e   }.  if( pLoop->
17350 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 54 4f  wsFlags&WHERE_TO
17360 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 63  P_LIMIT ){.    c
17370 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e  har *z = (j==pIn
17380 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 3f  dex->nKeyCol ) ?
17390 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b   "rowid" : aCol[
173a0 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61  aiColumn[j]].zNa
173b0 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41  me;.    explainA
173c0 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20  ppendTerm(&txt, 
173d0 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a  i, z, "<");.  }.
173e0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
173f0 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 29  mAppend(&txt, ")
17400 22 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  ", 1);.  return 
17410 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
17420 69 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d 0a 0a  inish(&txt);.}..
17430 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
17440 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75  ion is a no-op u
17450 6e 6c 65 73 73 20 63 75 72 72 65 6e 74 6c 79 20  nless currently 
17460 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20 45 58  processing an EX
17470 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
17480 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49 66 20  .** command. If 
17490 74 68 65 20 71 75 65 72 79 20 62 65 69 6e 67 20  the query being 
174a0 63 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e 20 45  compiled is an E
174b0 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
174c0 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72  N, a single.** r
174d0 65 63 6f 72 64 20 69 73 20 61 64 64 65 64 20 74  ecord is added t
174e0 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74 6f 20  o the output to 
174f0 64 65 73 63 72 69 62 65 20 74 68 65 20 74 61 62  describe the tab
17500 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65 67 79  le scan strategy
17510 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e 0a   in .** pLevel..
17520 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
17530 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20  xplainOneScan(. 
17540 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
17550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17560 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
17570 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
17580 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
17590 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
175a0 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20 72  list this loop r
175b0 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68  efers to */.  Wh
175c0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
175d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
175e0 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20 4f   Scan to write O
175f0 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65  P_Explain opcode
17600 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c   for */.  int iL
17610 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
17620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
17630 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 63  ue for "level" c
17640 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20  olumn of output 
17650 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
17660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17670 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
17680 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20  r "from" column 
17690 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75  of output */.  u
176a0 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20  16 wctrlFlags   
176b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
176c0 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
176d0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
176e0 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e  gin() */.){.#ifn
176f0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
17700 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
17710 78 70 6c 61 69 6e 3d 3d 32 20 29 0a 23 65 6e 64  xplain==2 ).#end
17720 69 66 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63  if.  {.    struc
17730 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
17740 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
17750 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
17760 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  om];.    Vdbe *v
17770 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
17780 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69  ;      /* VM bei
17790 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a  ng constructed *
177a0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  /.    sqlite3 *d
177b0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
177c0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
177d0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 63 68  handle */.    ch
177e0 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20 20 20  ar *zMsg;       
177f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17800 65 78 74 20 74 6f 20 61 64 64 20 74 6f 20 45 51  ext to add to EQ
17810 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  P output */.    
17820 69 6e 74 20 69 49 64 20 3d 20 70 50 61 72 73 65  int iId = pParse
17830 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a  ->iSelectId;  /*
17840 20 53 65 6c 65 63 74 20 69 64 20 28 6c 65 66 74   Select id (left
17850 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20 63 6f 6c  -most output col
17860 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  umn) */.    int 
17870 69 73 53 65 61 72 63 68 3b 20 20 20 20 20 20 20  isSearch;       
17880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
17890 65 20 66 6f 72 20 61 20 53 45 41 52 43 48 2e 20  e for a SEARCH. 
178a0 46 61 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e 20  False for SCAN. 
178b0 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  */.    WhereLoop
178c0 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
178d0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74       /* The cont
178e0 72 6f 6c 6c 69 6e 67 20 57 68 65 72 65 4c 6f 6f  rolling WhereLoo
178f0 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  p object */.    
17900 75 33 32 20 66 6c 61 67 73 3b 20 20 20 20 20 20  u32 flags;      
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17920 20 46 6c 61 67 73 20 74 68 61 74 20 64 65 73 63   Flags that desc
17930 72 69 62 65 20 74 68 69 73 20 6c 6f 6f 70 20 2a  ribe this loop *
17940 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  /..    pLoop = p
17950 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
17960 20 20 20 66 6c 61 67 73 20 3d 20 70 4c 6f 6f 70     flags = pLoop
17970 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 69  ->wsFlags;.    i
17980 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f  f( (flags&WHERE_
17990 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63  MULTI_OR) || (wc
179a0 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
179b0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 29 20  NETABLE_ONLY) ) 
179c0 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 73 53  return;..    isS
179d0 65 61 72 63 68 20 3d 20 28 66 6c 61 67 73 26 28  earch = (flags&(
179e0 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c  WHERE_BTM_LIMIT|
179f0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
17a00 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
17a10 20 7c 7c 20 28 28 66 6c 61 67 73 26 57 48 45 52   || ((flags&WHER
17a20 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
17a30 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 75 2e  =0 && (pLoop->u.
17a40 62 74 72 65 65 2e 6e 45 71 3e 30 29 29 0a 20 20  btree.nEq>0)).  
17a50 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 77 63            || (wc
17a60 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f  trlFlags&(WHERE_
17a70 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52  ORDERBY_MIN|WHER
17a80 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 29 3b  E_ORDERBY_MAX));
17a90 0a 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  ..    zMsg = sql
17aa0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
17ab0 22 25 73 22 2c 20 69 73 53 65 61 72 63 68 3f 22  "%s", isSearch?"
17ac0 53 45 41 52 43 48 22 3a 22 53 43 41 4e 22 29 3b  SEARCH":"SCAN");
17ad0 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
17ae0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
17af0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
17b00 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
17b10 2c 20 22 25 73 20 53 55 42 51 55 45 52 59 20 25  , "%s SUBQUERY %
17b20 64 22 2c 20 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e  d", zMsg,pItem->
17b30 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  iSelectId);.    
17b40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4d 73  }else{.      zMs
17b50 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
17b60 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
17b70 73 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 4d 73  s TABLE %s", zMs
17b80 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  g, pItem->zName)
17b90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
17ba0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
17bb0 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
17bc0 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
17bd0 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41 53 20  b, zMsg, "%s AS 
17be0 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d  %s", zMsg, pItem
17bf0 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d  ->zAlias);.    }
17c00 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
17c10 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45  & (WHERE_IPK|WHE
17c20 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
17c30 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 41 4c 57  )==0.     && ALW
17c40 41 59 53 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  AYS(pLoop->u.btr
17c50 65 65 2e 70 49 6e 64 65 78 21 3d 30 29 0a 20 20  ee.pIndex!=0).  
17c60 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20    ){.      char 
17c70 2a 7a 57 68 65 72 65 20 3d 20 65 78 70 6c 61 69  *zWhere = explai
17c80 6e 49 6e 64 65 78 52 61 6e 67 65 28 64 62 2c 20  nIndexRange(db, 
17c90 70 4c 6f 6f 70 2c 20 70 49 74 65 6d 2d 3e 70 54  pLoop, pItem->pT
17ca0 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20  ab);.      zMsg 
17cb0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
17cc0 66 28 64 62 2c 20 7a 4d 73 67 2c 0a 20 20 20 20  f(db, zMsg,.    
17cd0 20 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61             ((fla
17ce0 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
17cf0 49 4e 44 45 58 29 20 3f 20 0a 20 20 20 20 20 20  INDEX) ? .      
17d00 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73               "%s
17d10 20 55 53 49 4e 47 20 41 55 54 4f 4d 41 54 49 43   USING AUTOMATIC
17d20 20 25 73 49 4e 44 45 58 25 2e 30 73 25 73 22 20   %sINDEX%.0s%s" 
17d30 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
17d40 20 20 20 20 20 22 25 73 20 55 53 49 4e 47 20 25       "%s USING %
17d50 73 49 4e 44 45 58 20 25 73 25 73 22 29 2c 20 0a  sINDEX %s%s"), .
17d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
17d70 4d 73 67 2c 20 28 28 66 6c 61 67 73 20 26 20 57  Msg, ((flags & W
17d80 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 3f  HERE_IDX_ONLY) ?
17d90 20 22 43 4f 56 45 52 49 4e 47 20 22 20 3a 20 22   "COVERING " : "
17da0 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  "),.            
17db0 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
17dc0 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  e.pIndex->zName,
17dd0 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20   zWhere);.      
17de0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
17df0 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 7d  , zWhere);.    }
17e00 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20  else if( (flags 
17e10 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 20  & WHERE_IPK)!=0 
17e20 26 26 20 28 66 6c 61 67 73 20 26 20 57 48 45 52  && (flags & WHER
17e30 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30  E_CONSTRAINT)!=0
17e40 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d   ){.      zMsg =
17e50 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
17e60 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55  (db, zMsg, "%s U
17e70 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49  SING INTEGER PRI
17e80 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29  MARY KEY", zMsg)
17e90 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61  ;..      if( fla
17ea0 67 73 26 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  gs&(WHERE_COLUMN
17eb0 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  _EQ|WHERE_COLUMN
17ec0 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  _IN) ){.        
17ed0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
17ee0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
17ef0 20 22 25 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c   "%s (rowid=?)",
17f00 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65   zMsg);.      }e
17f10 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 26 57  lse if( (flags&W
17f20 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29  HERE_BOTH_LIMIT)
17f30 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d  ==WHERE_BOTH_LIM
17f40 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  IT ){.        zM
17f50 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
17f60 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
17f70 25 73 20 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20  %s (rowid>? AND 
17f80 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29  rowid<?)", zMsg)
17f90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
17fa0 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42 54  ( flags&WHERE_BT
17fb0 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  M_LIMIT ){.     
17fc0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
17fd0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
17fe0 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f  sg, "%s (rowid>?
17ff0 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
18000 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
18010 53 28 66 6c 61 67 73 26 57 48 45 52 45 5f 54 4f  S(flags&WHERE_TO
18020 50 5f 4c 49 4d 49 54 29 20 29 7b 0a 20 20 20 20  P_LIMIT) ){.    
18030 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
18040 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
18050 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3c  Msg, "%s (rowid<
18060 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  ?)", zMsg);.    
18070 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65    }.    }.#ifnde
18080 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
18090 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 65  RTUALTABLE.    e
180a0 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
180b0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
180c0 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  BLE)!=0 ){.     
180d0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
180e0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
180f0 2c 20 22 25 73 20 56 49 52 54 55 41 4c 20 54 41  , "%s VIRTUAL TA
18100 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22  BLE INDEX %d:%s"
18110 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20  , zMsg,.        
18120 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d            pLoop-
18130 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
18140 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
18150 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  xStr);.    }.#en
18160 64 69 66 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73  dif.    zMsg = s
18170 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
18180 62 2c 20 7a 4d 73 67 2c 20 22 25 73 22 2c 20 7a  b, zMsg, "%s", z
18190 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
181a0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
181b0 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64 2c 20  P_Explain, iId, 
181c0 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a  iLevel, iFrom, z
181d0 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
181e0 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
181f0 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 4f 6e  define explainOn
18200 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c  eScan(u,v,w,x,y,
18210 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  z).#endif /* SQL
18220 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
18230 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   */.../*.** Gene
18240 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
18250 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69  e start of the i
18260 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e  Level-th loop in
18270 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
18280 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
18290 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79  ion described by
182a0 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74   pWInfo..*/.stat
182b0 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f  ic Bitmask codeO
182c0 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57  neLoopStart(.  W
182d0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
182e0 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20  ,   /* Complete 
182f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
18300 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
18310 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  se */.  int iLev
18320 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  el,          /* 
18330 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70  Which level of p
18340 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c  WInfo->a[] shoul
18350 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  d be coded */.  
18360 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
18370 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61       /* Which ta
18380 62 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74  bles are current
18390 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ly available */.
183a0 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20  ){.  int j, k;  
183b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
183c0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
183d0 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
183e0 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
183f0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
18400 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61  table */.  int a
18410 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20  ddrNxt;         
18420 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70  /* Where to jump
18430 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
18440 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61  h the next IN ca
18450 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74  se */.  int omit
18460 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  Table;       /* 
18470 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74  True if we use t
18480 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f  he index only */
18490 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20  .  int bRev;    
184a0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
184b0 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63  if we need to sc
184c0 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
184d0 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  der */.  WhereLe
184e0 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a  vel *pLevel;  /*
184f0 20 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c   The where level
18500 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
18510 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
18520 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 57 68  op;    /* The Wh
18530 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62  ereLoop object b
18540 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
18550 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
18560 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73  ;    /* Decompos
18570 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74  ition of the ent
18580 69 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ire WHERE clause
18590 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
185a0 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
185b0 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45        /* A WHERE
185c0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a   clause term */.
185d0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
185e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185f0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
18600 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
18610 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
18620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
18630 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
18640 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
18650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18660 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
18670 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72  pared stmt under
18680 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a   constructions *
18690 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
186a0 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
186b0 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75  m;  /* FROM clau
186c0 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f  se term being co
186d0 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ded */.  int add
186e0 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  rBrk;           
186f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
18700 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f   here to break o
18710 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a  ut of the loop *
18720 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
18730 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18740 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
18750 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
18760 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a  h next cycle */.
18770 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65 67 20    int iRowidReg 
18780 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  = 0;        /* R
18790 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64 20 69  owid is stored i
187a0 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 2c  n this register,
187b0 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a   if not zero */.
187c0 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65 52 65    int iReleaseRe
187d0 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54  g = 0;      /* T
187e0 65 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20  emp register to 
187f0 66 72 65 65 20 62 65 66 6f 72 65 20 72 65 74 75  free before retu
18800 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72  rning */..  pPar
18810 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
18820 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  rse;.  v = pPars
18830 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20  e->pVdbe;.  pWC 
18840 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a  = &pWInfo->sWC;.
18850 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
18860 62 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  b;.  pLevel = &p
18870 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d  WInfo->a[iLevel]
18880 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76  ;.  pLoop = pLev
18890 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54  el->pWLoop;.  pT
188a0 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f  abItem = &pWInfo
188b0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
188c0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
188d0 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
188e0 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 4c 65 76  >iCursor;.  pLev
188f0 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 3d 20 6e  el->notReady = n
18900 6f 74 52 65 61 64 79 20 26 20 7e 67 65 74 4d 61  otReady & ~getMa
18910 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
18920 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 62  kSet, iCur);.  b
18930 52 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72  Rev = (pWInfo->r
18940 65 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26  evMask>>iLevel)&
18950 31 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d  1;.  omitTable =
18960 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
18970 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
18980 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  Y)!=0 .         
18990 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
189a0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
189b0 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30  _FORCE_TABLE)==0
189c0 3b 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f  ;.  VdbeModuleCo
189d0 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
189e0 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25   WHERE-loop%d: %
189f0 73 22 2c 69 4c 65 76 65 6c 2c 70 54 61 62 49 74  s",iLevel,pTabIt
18a00 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
18a10 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  );..  /* Create 
18a20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22  labels for the "
18a30 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74  break" and "cont
18a40 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f  inue" instructio
18a50 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  ns.  ** for the 
18a60 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a  current loop.  J
18a70 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74  ump to addrBrk t
18a80 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61  o break out of a
18a90 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70   loop..  ** Jump
18aa0 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69   to cont to go i
18ab0 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68  mmediately to th
18ac0 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
18ad0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f   of the.  ** loo
18ae0 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  p..  **.  ** Whe
18af0 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e  n there is an IN
18b00 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c   operator, we al
18b10 73 6f 20 68 61 76 65 20 61 20 22 61 64 64 72 4e  so have a "addrN
18b20 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20  xt" label that. 
18b30 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e   ** means to con
18b40 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e  tinue with the n
18b50 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d  ext IN value com
18b60 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a  bination.  When.
18b70 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e    ** there are n
18b80 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69  o IN operators i
18b90 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  n the constraint
18ba0 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74 22  s, the "addrNxt"
18bb0 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74   label.  ** is t
18bc0 68 65 20 73 61 6d 65 20 61 73 20 22 61 64 64 72  he same as "addr
18bd0 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64  Brk"..  */.  add
18be0 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rBrk = pLevel->a
18bf0 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d  ddrBrk = pLevel-
18c00 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74  >addrNxt = sqlit
18c10 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
18c20 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d  v);.  addrCont =
18c30 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
18c40 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
18c50 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
18c60 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
18c70 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  e right table of
18c80 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
18c90 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64  IN, allocate and
18ca0 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  .  ** initialize
18cb0 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74   a memory cell t
18cc0 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20 74  hat records if t
18cd0 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65  his table matche
18ce0 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f  s any.  ** row o
18cf0 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  f the left table
18d00 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20   of the join..  
18d10 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  */.  if( pLevel-
18d20 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61  >iFrom>0 && (pTa
18d30 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70  bItem[0].jointyp
18d40 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20  e & JT_LEFT)!=0 
18d50 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  ){.    pLevel->i
18d60 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61  LeftJoin = ++pPa
18d70 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
18d80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18d90 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
18da0 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  0, pLevel->iLeft
18db0 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43  Join);.    VdbeC
18dc0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74  omment((v, "init
18dd0 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61   LEFT JOIN no-ma
18de0 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d  tch flag"));.  }
18df0 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63  ..  /* Special c
18e00 61 73 65 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c  ase of a FROM cl
18e10 61 75 73 65 20 73 75 62 71 75 65 72 79 20 69 6d  ause subquery im
18e20 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63  plemented as a c
18e30 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  o-routine */.  i
18e40 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69 61  f( pTabItem->via
18e50 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
18e60 20 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20   int regYield = 
18e70 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74  pTabItem->regRet
18e80 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
18e90 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
18ea0 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
18eb0 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 70 54 61  regYield, 0, pTa
18ec0 62 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  bItem->addrFillS
18ed0 75 62 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ub);.    pLevel-
18ee0 3e 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64  >p2 =  sqlite3Vd
18ef0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
18f00 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 2c 20  ield, regYield, 
18f10 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 56 64  addrBrk);.    Vd
18f20 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18f30 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
18f40 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20  v, "next row of 
18f50 5c 22 25 73 5c 22 22 2c 20 70 54 61 62 49 74 65  \"%s\"", pTabIte
18f60 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
18f70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
18f80 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65   = OP_Goto;.  }e
18f90 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  lse..#ifndef SQL
18fa0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
18fb0 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c  TABLE.  if(  (pL
18fc0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
18fd0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
18fe0 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  E)!=0 ){.    /* 
18ff0 43 61 73 65 20 31 3a 20 20 54 68 65 20 74 61 62  Case 1:  The tab
19000 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d  le is a virtual-
19010 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20  table.  Use the 
19020 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78  VFilter and VNex
19030 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
19040 20 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20    to access the 
19050 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
19060 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20   int iReg;   /* 
19070 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f  P3 Value for OP_
19080 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69  VFilter */.    i
19090 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b  nt addrNotFound;
190a0 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  .    int nConstr
190b0 61 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c  aint = pLoop->nL
190c0 54 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74  Term;..    sqlit
190d0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
190e0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65  pParse);.    iRe
190f0 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
19100 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
19110 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a  nConstraint+2);.
19120 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64      addrNotFound
19130 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42   = pLevel->addrB
19140 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  rk;.    for(j=0;
19150 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   j<nConstraint; 
19160 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  j++){.      int 
19170 69 54 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a  iTarget = iReg+j
19180 2b 32 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  +2;.      pTerm 
19190 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
191a0 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  j];.      if( pT
191b0 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  erm==0 ) continu
191c0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  e;.      if( pTe
191d0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
191e0 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20  WO_IN ){.       
191f0 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
19200 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
19210 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76   pLevel, j, bRev
19220 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20  , iTarget);.    
19230 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64      addrNotFound
19240 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
19250 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  xt;.      }else{
19260 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19270 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
19280 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70   pTerm->pExpr->p
19290 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b  Right, iTarget);
192a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
192b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
192c0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
192d0 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  er, pLoop->u.vta
192e0 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b  b.idxNum, iReg);
192f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19300 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
19310 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  eger, nConstrain
19320 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20  t, iReg+1);.    
19330 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19340 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c  4(v, OP_VFilter,
19350 20 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f   iCur, addrNotFo
19360 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20  und, iReg,.     
19370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19380 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69   pLoop->u.vtab.i
19390 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20  dxStr,.         
193a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
193b0 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  op->u.vtab.needF
193c0 72 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46  ree ? P4_MPRINTF
193d0 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20   : P4_STATIC);. 
193e0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
193f0 76 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  v);.    pLoop->u
19400 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
19410 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   0;.    for(j=0;
19420 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26   j<nConstraint &
19430 26 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20  & j<16; j++){.  
19440 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
19450 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e  u.vtab.omitMask>
19460 3e 6a 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20  >j)&1 ){.       
19470 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
19480 76 65 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  vel, pLoop->aLTe
19490 72 6d 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  rm[j]);.      }.
194a0 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
194b0 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b  ->op = OP_VNext;
194c0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
194d0 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76  = iCur;.    pLev
194e0 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33  el->p2 = sqlite3
194f0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
19500 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  v);.    sqlite3R
19510 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
19520 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43  pParse, iReg, nC
19530 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20  onstraint+2);.  
19540 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
19550 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
19560 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
19570 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
19580 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
19590 0a 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77  .  if( (pLoop->w
195a0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
195b0 50 4b 29 21 3d 30 0a 20 20 20 26 26 20 28 70 4c  PK)!=0.   && (pL
195c0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  oop->wsFlags & (
195d0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c  WHERE_COLUMN_IN|
195e0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29  WHERE_COLUMN_EQ)
195f0 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  )!=0.  ){.    /*
19600 20 43 61 73 65 20 32 3a 20 20 57 65 20 63 61 6e   Case 2:  We can
19610 20 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65   directly refere
19620 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nce a single row
19630 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
19640 20 20 20 20 20 20 20 20 20 20 65 71 75 61 6c 69            equali
19650 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
19660 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
19670 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a  field.  Or.    *
19680 2a 20 20 20 20 20 20 20 20 20 20 77 65 20 72 65  *          we re
19690 66 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65  ference multiple
196a0 20 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72   rows using a "r
196b0 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20  owid IN (...)". 
196c0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63     **          c
196d0 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f  onstruct..    */
196e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
196f0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d  op->u.btree.nEq=
19700 3d 31 20 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  =1 );.    pTerm 
19710 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
19720 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0];.    assert( 
19730 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
19740 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70  assert( pTerm->p
19750 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 61  Expr!=0 );.    a
19760 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
19770 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ==0 );.    testc
19780 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
19790 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
197a0 41 4c 20 29 3b 0a 20 20 20 20 69 52 65 6c 65 61  AL );.    iRelea
197b0 73 65 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65  seReg = ++pParse
197c0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 52 6f 77  ->nMem;.    iRow
197d0 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71 75 61  idReg = codeEqua
197e0 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c  lityTerm(pParse,
197f0 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20   pTerm, pLevel, 
19800 30 2c 20 62 52 65 76 2c 20 69 52 65 6c 65 61 73  0, bRev, iReleas
19810 65 52 65 67 29 3b 0a 20 20 20 20 69 66 28 20 69  eReg);.    if( i
19820 52 6f 77 69 64 52 65 67 21 3d 69 52 65 6c 65 61  RowidReg!=iRelea
19830 73 65 52 65 67 20 29 20 73 71 6c 69 74 65 33 52  seReg ) sqlite3R
19840 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
19850 61 72 73 65 2c 20 69 52 65 6c 65 61 73 65 52 65  arse, iReleaseRe
19860 67 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20  g);.    addrNxt 
19870 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
19880 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
19890 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
198a0 75 73 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64  ustBeInt, iRowid
198b0 52 65 67 2c 20 61 64 64 72 4e 78 74 29 3b 20 56  Reg, addrNxt); V
198c0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
198d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
198e0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45  ddOp3(v, OP_NotE
198f0 78 69 73 74 73 2c 20 69 43 75 72 2c 20 61 64 64  xists, iCur, add
19900 72 4e 78 74 2c 20 69 52 6f 77 69 64 52 65 67 29  rNxt, iRowidReg)
19910 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
19920 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
19930 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
19940 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
19950 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 31 29 3b  , iRowidReg, 1);
19960 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
19970 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73  CacheStore(pPars
19980 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f  e, iCur, -1, iRo
19990 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62  widReg);.    Vdb
199a0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b  eComment((v, "pk
199b0 22 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  "));.    pLevel-
199c0 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  >op = OP_Noop;. 
199d0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f   }else if( (pLoo
199e0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
199f0 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 20 20  RE_IPK)!=0.     
19a00 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77      && (pLoop->w
19a10 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
19a20 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29 21 3d 30 0a  OLUMN_RANGE)!=0.
19a30 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65    ){.    /* Case
19a40 20 33 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20   3:  We have an 
19a50 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61  inequality compa
19a60 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68  rison against th
19a70 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20  e ROWID field.. 
19a80 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65     */.    int te
19a90 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  stOp = OP_Noop;.
19aa0 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20      int start;. 
19ab0 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c     int memEndVal
19ac0 75 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72  ue = 0;.    Wher
19ad0 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a  eTerm *pStart, *
19ae0 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65 72  pEnd;..    asser
19af0 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20  t( omitTable==0 
19b00 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  );.    j = 0;.  
19b10 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 20    pStart = pEnd 
19b20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  = 0;.    if( pLo
19b30 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
19b40 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 20  ERE_BTM_LIMIT ) 
19b50 70 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e  pStart = pLoop->
19b60 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20  aLTerm[j++];.   
19b70 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
19b80 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
19b90 4c 49 4d 49 54 20 29 20 70 45 6e 64 20 3d 20 70  LIMIT ) pEnd = p
19ba0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b  Loop->aLTerm[j++
19bb0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
19bc0 53 74 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e 64  Start!=0 || pEnd
19bd0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 62  !=0 );.    if( b
19be0 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54 65  Rev ){.      pTe
19bf0 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20  rm = pStart;.   
19c00 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64     pStart = pEnd
19c10 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70  ;.      pEnd = p
19c20 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Term;.    }.    
19c30 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20  if( pStart ){.  
19c40 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20      Expr *pX;   
19c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19c60 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
19c70 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 74 61   defines the sta
19c80 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  rt bound */.    
19c90 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b    int r1, rTemp;
19ca0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
19cb0 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67  ters for holding
19cc0 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64   the start bound
19cd0 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ary */..      /*
19ce0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
19cf0 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f  onstant maps TK_
19d00 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f  xx codes into co
19d10 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20  rresponding .   
19d20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64     ** seek opcod
19d30 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73 20  es.  It depends 
19d40 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  on a particular 
19d50 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78  ordering of TK_x
19d60 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  x.      */.     
19d70 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f   const u8 aMoveO
19d80 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  p[] = {.        
19d90 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20     /* TK_GT */  
19da0 4f 50 5f 53 65 65 6b 47 54 2c 0a 20 20 20 20 20  OP_SeekGT,.     
19db0 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a        /* TK_LE *
19dc0 2f 20 20 4f 50 5f 53 65 65 6b 4c 45 2c 0a 20 20  /  OP_SeekLE,.  
19dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c           /* TK_L
19de0 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 54 2c  T */  OP_SeekLT,
19df0 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
19e00 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_GE */  OP_Seek
19e10 47 45 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  GE.      };.    
19e20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d    assert( TK_LE=
19e30 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20 20  =TK_GT+1 );     
19e40 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
19e50 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a  e ordering.. */.
19e60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
19e70 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20  _LT==TK_GT+2 ); 
19e80 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20       /*  ... of 
19e90 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65 73  the TK_xx values
19ea0 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ... */.      ass
19eb0 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47  ert( TK_GE==TK_G
19ec0 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 20  T+3 );      /*  
19ed0 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74 2e  ... is correcct.
19ee0 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
19ef0 74 28 20 28 70 53 74 61 72 74 2d 3e 77 74 46 6c  t( (pStart->wtFl
19f00 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
19f10 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  )==0 );.      te
19f20 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e  stcase( pStart->
19f30 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
19f40 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
19f50 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78  pX = pStart->pEx
19f60 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
19f70 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
19f80 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61 72   testcase( pStar
19f90 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  t->leftCursor!=i
19fa0 43 75 72 20 29 3b 20 2f 2a 20 74 72 61 6e 73 69  Cur ); /* transi
19fb0 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  tive constraints
19fc0 20 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73   */.      r1 = s
19fd0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
19fe0 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  mp(pParse, pX->p
19ff0 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a  Right, &rTemp);.
1a000 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a010 65 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65  eAddOp3(v, aMove
1a020 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d  Op[pX->op-TK_GT]
1a030 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c  , iCur, addrBrk,
1a040 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65   r1);.      Vdbe
1a050 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22  Comment((v, "pk"
1a060 29 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  ));.      VdbeCo
1a070 76 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e  verageIf(v, pX->
1a080 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20  op==TK_GT);.    
1a090 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1a0a0 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c  (v, pX->op==TK_L
1a0b0 45 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  E);.      VdbeCo
1a0c0 76 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e  verageIf(v, pX->
1a0d0 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20  op==TK_LT);.    
1a0e0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1a0f0 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47  (v, pX->op==TK_G
1a100 45 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  E);.      sqlite
1a110 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1a120 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
1a130 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73   r1, 1);.      s
1a140 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1a150 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 54 65  pReg(pParse, rTe
1a160 6d 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62  mp);.      disab
1a170 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
1a180 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73  Start);.    }els
1a190 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1a1a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52  VdbeAddOp2(v, bR
1a1b0 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f  ev ? OP_Last : O
1a1c0 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20  P_Rewind, iCur, 
1a1d0 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20  addrBrk);.      
1a1e0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1a1f0 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20  , bRev==0);.    
1a200 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1a210 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20  (v, bRev!=0);.  
1a220 20 20 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64    }.    if( pEnd
1a230 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
1a240 70 58 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70  pX;.      pX = p
1a250 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  End->pExpr;.    
1a260 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
1a270 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1a280 20 28 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20   (pEnd->wtFlags 
1a290 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
1a2a0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1a2b0 73 65 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75  se( pEnd->leftCu
1a2c0 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a  rsor!=iCur ); /*
1a2d0 20 54 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73   Transitive cons
1a2e0 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20  traints */.     
1a2f0 20 74 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d   testcase( pEnd-
1a300 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1a310 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
1a320 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b   memEndValue = +
1a330 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1a340 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1a350 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d  Code(pParse, pX-
1a360 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56  >pRight, memEndV
1a370 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28  alue);.      if(
1a380 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c   pX->op==TK_LT |
1a390 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  | pX->op==TK_GT 
1a3a0 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  ){.        testO
1a3b0 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65  p = bRev ? OP_Le
1a3c0 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20   : OP_Ge;.      
1a3d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74  }else{.        t
1a3e0 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
1a3f0 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20  P_Lt : OP_Gt;.  
1a400 20 20 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61      }.      disa
1a410 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1a420 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pEnd);.    }.   
1a430 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
1a440 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1a450 76 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  v);.    pLevel->
1a460 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50  op = bRev ? OP_P
1a470 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20  rev : OP_Next;. 
1a480 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1a490 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
1a4a0 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20  ->p2 = start;.  
1a4b0 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
1a4c0 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ->p5==0 );.    i
1a4d0 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f  f( testOp!=OP_No
1a4e0 6f 70 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77  op ){.      iRow
1a4f0 69 64 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65  idReg = ++pParse
1a500 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
1a510 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a520 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75  v, OP_Rowid, iCu
1a530 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  r, iRowidReg);. 
1a540 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1a550 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73  CacheStore(pPars
1a560 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f  e, iCur, -1, iRo
1a570 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
1a580 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1a590 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45  (v, testOp, memE
1a5a0 6e 64 56 61 6c 75 65 2c 20 61 64 64 72 42 72 6b  ndValue, addrBrk
1a5b0 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1a5c0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a5d0 49 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50  If(v, testOp==OP
1a5e0 5f 4c 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Le);.      Vdbe
1a5f0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 74 65  CoverageIf(v, te
1a600 73 74 4f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  stOp==OP_Lt);.  
1a610 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a620 49 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50  If(v, testOp==OP
1a630 5f 47 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Ge);.      Vdbe
1a640 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 74 65  CoverageIf(v, te
1a650 73 74 4f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  stOp==OP_Gt);.  
1a660 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1a670 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
1a680 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20  E_AFF_NUMERIC | 
1a690 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1a6a0 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  L);.    }.  }els
1a6b0 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46  e if( pLoop->wsF
1a6c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
1a6d0 45 58 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 43  EXED ){.    /* C
1a6e0 61 73 65 20 34 3a 20 41 20 73 63 61 6e 20 75 73  ase 4: A scan us
1a6f0 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20  ing an index..  
1a700 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1a710 20 20 20 20 54 68 65 20 57 48 45 52 45 20 63 6c      The WHERE cl
1a720 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e  ause may contain
1a730 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71   zero or more eq
1a740 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20 20  uality .    **  
1a750 20 20 20 20 20 20 20 74 65 72 6d 73 20 28 22 3d         terms ("=
1a760 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61  =" or "IN" opera
1a770 74 6f 72 73 29 20 74 68 61 74 20 72 65 66 65 72  tors) that refer
1a780 20 74 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a   to the N.    **
1a790 20 20 20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f           left-mo
1a7a0 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  st columns of th
1a7b0 65 20 69 6e 64 65 78 2e 20 49 74 20 6d 61 79 20  e index. It may 
1a7c0 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20  also contain.   
1a7d0 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 65 71   **         ineq
1a7e0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1a7f0 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20  ts (>, <, >= or 
1a800 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64 65 78  <=) on the index
1a810 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ed.    **       
1a820 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d    column that im
1a830 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
1a840 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69 74 69  s the N equaliti
1a850 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a  es. Only .    **
1a860 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67           the rig
1a870 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63  ht-most column c
1a880 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c  an be an inequal
1a890 69 74 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d  ity - the rest m
1a8a0 75 73 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ust.    **      
1a8b0 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20     use the "==" 
1a8c0 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f  and "IN" operato
1a8d0 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  rs. For example,
1a8e0 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   if the .    ** 
1a8f0 20 20 20 20 20 20 20 20 69 6e 64 65 78 20 69 73          index is
1a900 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65   on (x,y,z), the
1a910 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
1a920 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c 6c 20  clauses are all 
1a930 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1a940 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a  optimized:.    *
1a950 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1a960 20 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20      x=5.    **  
1a970 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
1a980 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20  D y=10.    **   
1a990 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
1a9a0 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20   y<10.    **    
1a9b0 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
1a9c0 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20  y>5 AND y<10.   
1a9d0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
1a9e0 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a  =5 AND y=5 AND z
1a9f0 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20  <=10.    **.    
1aa00 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20 7a  **         The z
1aa10 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68 65 20  <10 term of the 
1aa20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74  following cannot
1aa30 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20   be used, only. 
1aa40 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68     **         th
1aa50 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20  e x=5 term:.    
1aa60 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1aa70 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31       x=5 AND z<1
1aa80 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  0.    **.    ** 
1aa90 20 20 20 20 20 20 20 20 4e 20 6d 61 79 20 62 65          N may be
1aaa0 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61   zero if there a
1aab0 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  re inequality co
1aac0 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a  nstraints..    *
1aad0 2a 20 20 20 20 20 20 20 20 20 49 66 20 74 68 65  *         If the
1aae0 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71 75 61  re are no inequa
1aaf0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1ab00 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74 0a 20  , then N is at. 
1ab10 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65     **         le
1ab20 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a  ast one..    **.
1ab30 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
1ab40 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f  his case is also
1ab50 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 72 65   used when there
1ab60 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c   are no WHERE cl
1ab70 61 75 73 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  ause.    **     
1ab80 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20      constraints 
1ab90 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20  but an index is 
1aba0 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c  selected anyway,
1abb0 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a   in order.    **
1abc0 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63           to forc
1abd0 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64  e the output ord
1abe0 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f  er to conform to
1abf0 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20   an ORDER BY..  
1ac00 20 20 2a 2f 20 20 0a 20 20 20 20 73 74 61 74 69    */  .    stati
1ac10 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72  c const u8 aStar
1ac20 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  tOp[] = {.      
1ac30 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20  0,.      0,.    
1ac40 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20    OP_Rewind,    
1ac50 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 21 73         /* 2: (!s
1ac60 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1ac70 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20   && startEq &&  
1ac80 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
1ac90 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20 20 20  OP_Last,        
1aca0 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73 74 61       /* 3: (!sta
1acb0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  rt_constraints &
1acc0 26 20 73 74 61 72 74 45 71 20 26 26 20 20 20 62  & startEq &&   b
1acd0 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
1ace0 5f 53 65 65 6b 47 54 2c 20 20 20 20 20 20 20 20  _SeekGT,        
1acf0 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f     /* 4: (start_
1ad00 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
1ad10 21 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65  !startEq && !bRe
1ad20 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
1ad30 65 65 6b 4c 54 2c 20 20 20 20 20 20 20 20 20 20  eekLT,          
1ad40 20 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f 63 6f   /* 5: (start_co
1ad50 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73  nstraints  && !s
1ad60 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29  tartEq &&  bRev)
1ad70 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
1ad80 6b 47 45 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kGE,           /
1ad90 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 6: (start_cons
1ada0 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61  traints  &&  sta
1adb0 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a  rtEq && !bRev) *
1adc0 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c  /.      OP_SeekL
1add0 45 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  E            /* 
1ade0 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  7: (start_constr
1adf0 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74  aints  &&  start
1ae00 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a  Eq &&  bRev) */.
1ae10 20 20 20 20 7d 3b 0a 20 20 20 20 73 74 61 74 69      };.    stati
1ae20 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f  c const u8 aEndO
1ae30 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50  p[] = {.      OP
1ae40 5f 49 64 78 47 45 2c 20 20 20 20 20 20 20 20 20  _IdxGE,         
1ae50 20 20 20 2f 2a 20 30 3a 20 28 65 6e 64 5f 63 6f     /* 0: (end_co
1ae60 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21 62 52  nstraints && !bR
1ae70 65 76 20 26 26 20 21 65 6e 64 45 71 29 20 2a 2f  ev && !endEq) */
1ae80 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47 54 2c  .      OP_IdxGT,
1ae90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
1aea0 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e  : (end_constrain
1aeb0 74 73 20 26 26 20 21 62 52 65 76 20 26 26 20 20  ts && !bRev &&  
1aec0 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 20 20  endEq) */.      
1aed0 4f 50 5f 49 64 78 4c 45 2c 20 20 20 20 20 20 20  OP_IdxLE,       
1aee0 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f       /* 2: (end_
1aef0 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 20  constraints &&  
1af00 62 52 65 76 20 26 26 20 21 65 6e 64 45 71 29 20  bRev && !endEq) 
1af10 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c  */.      OP_IdxL
1af20 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  T,            /*
1af30 20 33 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   3: (end_constra
1af40 69 6e 74 73 20 26 26 20 20 62 52 65 76 20 26 26  ints &&  bRev &&
1af50 20 20 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20    endEq) */.    
1af60 7d 3b 0a 20 20 20 20 75 31 36 20 6e 45 71 20 3d  };.    u16 nEq =
1af70 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1af80 6e 45 71 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  nEq;     /* Numb
1af90 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74  er of == or IN t
1afa0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  erms */.    int 
1afb0 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20  regBase;        
1afc0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65           /* Base
1afd0 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   register holdin
1afe0 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c  g constraint val
1aff0 75 65 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  ues */.    Where
1b000 54 65 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72  Term *pRangeStar
1b010 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75  t = 0;  /* Inequ
1b020 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1b030 20 61 74 20 72 61 6e 67 65 20 73 74 61 72 74 20   at range start 
1b040 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
1b050 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b   *pRangeEnd = 0;
1b060 20 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74      /* Inequalit
1b070 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
1b080 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20  range end */.   
1b090 20 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20   int startEq;   
1b0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b0b0 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 73   True if range s
1b0c0 74 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d  tart uses ==, >=
1b0d0 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e   or <= */.    in
1b0e0 74 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20  t endEq;        
1b0f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1b100 75 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20  ue if range end 
1b110 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c  uses ==, >= or <
1b120 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61  = */.    int sta
1b130 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20  rt_constraints; 
1b140 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
1b150 66 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74  f range is const
1b160 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e  rained */.    in
1b170 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20  t nConstraint;  
1b180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1b190 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69  mber of constrai
1b1a0 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  nt terms */.    
1b1b0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
1b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b1d0 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c  The index we wil
1b1e0 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20  l be using */.  
1b1f0 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20    int iIdxCur;  
1b200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b210 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
1b220 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  r for the index 
1b230 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72  */.    int nExtr
1b240 61 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  aReg = 0;       
1b250 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b260 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73   extra registers
1b270 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69   needed */.    i
1b280 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
1b290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1b2a0 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64  nstruction opcod
1b2b0 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
1b2c0 53 74 61 72 74 41 66 66 3b 20 20 20 20 20 20 20  StartAff;       
1b2d0 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
1b2e0 79 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 72  y for start of r
1b2f0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ange constraint 
1b300 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 45 6e 64  */.    char cEnd
1b310 41 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Aff = 0;        
1b320 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
1b330 66 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e 67 65  for end of range
1b340 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
1b350 20 20 20 75 38 20 62 53 65 65 6b 50 61 73 74 4e     u8 bSeekPastN
1b360 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ull = 0;        
1b370 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 65 6b 20  /* True to seek 
1b380 70 61 73 74 20 69 6e 69 74 69 61 6c 20 6e 75 6c  past initial nul
1b390 6c 73 20 2a 2f 0a 20 20 20 20 75 38 20 62 53 74  ls */.    u8 bSt
1b3a0 6f 70 41 74 4e 75 6c 6c 20 3d 20 30 3b 20 20 20  opAtNull = 0;   
1b3b0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f         /* Add co
1b3c0 6e 64 69 74 69 6f 6e 20 74 6f 20 74 65 72 6d 69  ndition to termi
1b3d0 6e 61 74 65 20 61 74 20 4e 55 4c 4c 73 20 2a 2f  nate at NULLs */
1b3e0 0a 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f  ..    pIdx = pLo
1b3f0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
1b400 65 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20  ex;.    iIdxCur 
1b410 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
1b420 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  r;.    assert( n
1b430 45 71 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  Eq>=pLoop->u.btr
1b440 65 65 2e 6e 53 6b 69 70 20 29 3b 0a 0a 20 20 20  ee.nSkip );..   
1b450 20 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70   /* If this loop
1b460 20 73 61 74 69 73 66 69 65 73 20 61 20 73 6f 72   satisfies a sor
1b470 74 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42  t order (pOrderB
1b480 79 29 20 72 65 71 75 65 73 74 20 74 68 61 74 20  y) request that 
1b490 0a 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73  .    ** was pass
1b4a0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
1b4b0 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ion to implement
1b4c0 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78   a "SELECT min(x
1b4d0 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71  ) ..." .    ** q
1b4e0 75 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63  uery, then the c
1b4f0 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20  aller will only 
1b500 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74  allow the loop t
1b510 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a  o run for.    **
1b520 20 61 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74   a single iterat
1b530 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ion. This means 
1b540 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 72  that the first r
1b550 6f 77 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20  ow returned.    
1b560 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61  ** should not ha
1b570 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  ve a NULL value 
1b580 73 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49  stored in 'x'. I
1b590 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a  f column 'x' is.
1b5a0 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74      ** the first
1b5b0 20 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e   one after the n
1b5c0 45 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  Eq equality cons
1b5d0 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69  traints in the i
1b5e0 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69  ndex,.    ** thi
1b5f0 73 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20  s requires some 
1b600 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  special handling
1b610 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1b620 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
1b630 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52  lags&WHERE_ORDER
1b640 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20  BY_MIN)!=0.     
1b650 26 26 20 28 70 57 49 6e 66 6f 2d 3e 62 4f 42 53  && (pWInfo->bOBS
1b660 61 74 21 3d 30 29 0a 20 20 20 20 20 26 26 20 28  at!=0).     && (
1b670 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45  pIdx->nKeyCol>nE
1b680 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q).    ){.      
1b690 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75  assert( pLoop->u
1b6a0 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3d 3d 30 20  .btree.nSkip==0 
1b6b0 29 3b 0a 20 20 20 20 20 20 62 53 65 65 6b 50 61  );.      bSeekPa
1b6c0 73 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20  stNull = 1;.    
1b6d0 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b    nExtraReg = 1;
1b6e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
1b6f0 69 6e 64 20 61 6e 79 20 69 6e 65 71 75 61 6c 69  ind any inequali
1b700 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ty constraint te
1b710 72 6d 73 20 66 6f 72 20 74 68 65 20 73 74 61 72  rms for the star
1b720 74 20 61 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a  t and end .    *
1b730 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  * of the range. 
1b740 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6a 20 3d 20  .    */.    j = 
1b750 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  nEq;.    if( pLo
1b760 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1b770 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
1b780 0a 20 20 20 20 20 20 70 52 61 6e 67 65 53 74 61  .      pRangeSta
1b790 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rt = pLoop->aLTe
1b7a0 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e  rm[j++];.      n
1b7b0 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
1b7c0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
1b7d0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1b7e0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
1b7f0 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64 20        pRangeEnd 
1b800 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
1b810 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74  j++];.      nExt
1b820 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20  raReg = 1;.     
1b830 20 69 66 28 20 70 52 61 6e 67 65 53 74 61 72 74   if( pRangeStart
1b840 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 6a  ==0.       && (j
1b850 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
1b860 6e 5b 6e 45 71 5d 29 3e 3d 30 20 0a 20 20 20 20  n[nEq])>=0 .    
1b870 20 20 20 26 26 20 70 49 64 78 2d 3e 70 54 61 62     && pIdx->pTab
1b880 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e  le->aCol[j].notN
1b890 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a  ull==0.      ){.
1b8a0 20 20 20 20 20 20 20 20 62 53 65 65 6b 50 61 73          bSeekPas
1b8b0 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20  tNull = 1;.     
1b8c0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
1b8d0 65 72 74 28 20 70 52 61 6e 67 65 45 6e 64 3d 3d  ert( pRangeEnd==
1b8e0 30 20 7c 7c 20 28 70 52 61 6e 67 65 45 6e 64 2d  0 || (pRangeEnd-
1b8f0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1b900 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 0a 20 20  VNULL)==0 );..  
1b910 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1b920 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
1b930 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ll constraint te
1b940 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20  rms using == or 
1b950 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74  IN.    ** and st
1b960 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ore the values o
1b970 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e  f those terms in
1b980 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
1b990 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74  isters.    ** st
1b9a0 61 72 74 69 6e 67 20 61 74 20 72 65 67 42 61 73  arting at regBas
1b9b0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  e..    */.    re
1b9c0 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45  gBase = codeAllE
1b9d0 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61  qualityTerms(pPa
1b9e0 72 73 65 2c 70 4c 65 76 65 6c 2c 62 52 65 76 2c  rse,pLevel,bRev,
1b9f0 6e 45 78 74 72 61 52 65 67 2c 26 7a 53 74 61 72  nExtraReg,&zStar
1ba00 74 41 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72  tAff);.    asser
1ba10 74 28 20 7a 53 74 61 72 74 41 66 66 3d 3d 30 20  t( zStartAff==0 
1ba20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  || sqlite3Strlen
1ba30 33 30 28 7a 53 74 61 72 74 41 66 66 29 3e 3d 6e  30(zStartAff)>=n
1ba40 45 71 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  Eq );.    if( zS
1ba50 74 61 72 74 41 66 66 20 29 20 63 45 6e 64 41 66  tartAff ) cEndAf
1ba60 66 20 3d 20 7a 53 74 61 72 74 41 66 66 5b 6e 45  f = zStartAff[nE
1ba70 71 5d 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20  q];.    addrNxt 
1ba80 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
1ba90 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  t;..    /* If we
1baa0 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72 65 76   are doing a rev
1bab0 65 72 73 65 20 6f 72 64 65 72 20 73 63 61 6e 20  erse order scan 
1bac0 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
1bad0 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a  index, or.    **
1bae0 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72   a forward order
1baf0 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65   scan on a desce
1bb00 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74  nding index, int
1bb10 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20  erchange the .  
1bb20 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 65    ** start and e
1bb30 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67 65  nd terms (pRange
1bb40 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67 65  Start and pRange
1bb50 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  End)..    */.   
1bb60 20 69 66 28 20 28 6e 45 71 3c 70 49 64 78 2d 3e   if( (nEq<pIdx->
1bb70 6e 4b 65 79 43 6f 6c 20 26 26 20 62 52 65 76 3d  nKeyCol && bRev=
1bb80 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  =(pIdx->aSortOrd
1bb90 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f  er[nEq]==SQLITE_
1bba0 53 4f 5f 41 53 43 29 29 0a 20 20 20 20 20 7c 7c  SO_ASC)).     ||
1bbb0 20 28 62 52 65 76 20 26 26 20 70 49 64 78 2d 3e   (bRev && pIdx->
1bbc0 6e 4b 65 79 43 6f 6c 3d 3d 6e 45 71 29 0a 20 20  nKeyCol==nEq).  
1bbd0 20 20 29 7b 0a 20 20 20 20 20 20 53 57 41 50 28    ){.      SWAP(
1bbe0 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70 52 61  WhereTerm *, pRa
1bbf0 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65 53 74  ngeEnd, pRangeSt
1bc00 61 72 74 29 3b 0a 20 20 20 20 20 20 53 57 41 50  art);.      SWAP
1bc10 28 75 38 2c 20 62 53 65 65 6b 50 61 73 74 4e 75  (u8, bSeekPastNu
1bc20 6c 6c 2c 20 62 53 74 6f 70 41 74 4e 75 6c 6c 29  ll, bStopAtNull)
1bc30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73  ;.    }..    tes
1bc40 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
1bc50 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74 61  rt && (pRangeSta
1bc60 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
1bc70 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20  WO_LE)!=0 );.   
1bc80 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
1bc90 65 53 74 61 72 74 20 26 26 20 28 70 52 61 6e 67  eStart && (pRang
1bca0 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
1bcb0 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b  r & WO_GE)!=0 );
1bcc0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1bcd0 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61  RangeEnd && (pRa
1bce0 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
1bcf0 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b  r & WO_LE)!=0 );
1bd00 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1bd10 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61  RangeEnd && (pRa
1bd20 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
1bd30 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b  r & WO_GE)!=0 );
1bd40 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 21  .    startEq = !
1bd50 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 70  pRangeStart || p
1bd60 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
1bd70 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57  rator & (WO_LE|W
1bd80 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45 71  O_GE);.    endEq
1bd90 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64 20   =   !pRangeEnd 
1bda0 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  || pRangeEnd->eO
1bdb0 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45  perator & (WO_LE
1bdc0 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74 61  |WO_GE);.    sta
1bdd0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d  rt_constraints =
1bde0 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20   pRangeStart || 
1bdf0 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  nEq>0;..    /* S
1be00 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63 75  eek the index cu
1be10 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rsor to the star
1be20 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  t of the range. 
1be30 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  */.    nConstrai
1be40 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66  nt = nEq;.    if
1be50 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 29 7b  ( pRangeStart ){
1be60 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
1be70 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74 61 72  ght = pRangeStar
1be80 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t->pExpr->pRight
1be90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1bea0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1beb0 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
1bec0 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nEq);.      if( 
1bed0 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74  (pRangeStart->wt
1bee0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
1bef0 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  LL)==0.       &&
1bf00 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
1bf10 65 4e 75 6c 6c 28 70 52 69 67 68 74 29 0a 20 20  eNull(pRight).  
1bf20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
1bf30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1bf40 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
1bf50 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72  egBase+nEq, addr
1bf60 4e 78 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64  Nxt);.        Vd
1bf70 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1bf80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1bf90 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a 20 20   zStartAff ){.  
1bfa0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1bfb0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1bfc0 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41  (pRight, zStartA
1bfd0 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45  ff[nEq])==SQLITE
1bfe0 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20  _AFF_NONE){.    
1bff0 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74        /* Since t
1c000 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
1c010 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64   to be performed
1c020 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73   with no convers
1c030 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ions.          *
1c040 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65  * applied to the
1c050 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74   operands, set t
1c060 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61  he affinity to a
1c070 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74  pply to pRight t
1c080 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  o .          ** 
1c090 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
1c0a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a    */.          z
1c0b0 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20  StartAff[nEq] = 
1c0c0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1c0d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c0e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1c0f0 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
1c100 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
1c110 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 20  zStartAff[nEq]) 
1c120 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74  ){.          zSt
1c130 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51  artAff[nEq] = SQ
1c140 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1c150 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c160 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72    .      nConstr
1c170 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65  aint++;.      te
1c180 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
1c190 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  art->wtFlags & T
1c1a0 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
1c1b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 53 65     }else if( bSe
1c1c0 65 6b 50 61 73 74 4e 75 6c 6c 20 29 7b 0a 20 20  ekPastNull ){.  
1c1d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c1e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1c1f0 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  , 0, regBase+nEq
1c200 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  );.      nConstr
1c210 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74  aint++;.      st
1c220 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20  artEq = 0;.     
1c230 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
1c240 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ts = 1;.    }.  
1c250 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
1c260 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
1c270 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
1c280 20 2d 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c   - bSeekPastNull
1c290 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  , zStartAff);.  
1c2a0 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b    op = aStartOp[
1c2b0 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1c2c0 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45  ts<<2) + (startE
1c2d0 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20  q<<1) + bRev];. 
1c2e0 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30     assert( op!=0
1c2f0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
1c300 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
1c310 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64  op, iIdxCur, add
1c320 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e  rNxt, regBase, n
1c330 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20  Constraint);.   
1c340 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1c350 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
1c360 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 52  geIf(v, op==OP_R
1c370 65 77 69 6e 64 29 3b 20 20 74 65 73 74 63 61 73  ewind);  testcas
1c380 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64  e( op==OP_Rewind
1c390 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65   );.    VdbeCove
1c3a0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
1c3b0 5f 4c 61 73 74 29 3b 20 20 20 20 74 65 73 74 63  _Last);    testc
1c3c0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74  ase( op==OP_Last
1c3d0 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65   );.    VdbeCove
1c3e0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
1c3f0 5f 53 65 65 6b 47 54 29 3b 20 20 74 65 73 74 63  _SeekGT);  testc
1c400 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
1c410 47 54 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  GT );.    VdbeCo
1c420 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1c430 4f 50 5f 53 65 65 6b 47 45 29 3b 20 20 74 65 73  OP_SeekGE);  tes
1c440 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
1c450 65 6b 47 45 20 29 3b 0a 20 20 20 20 56 64 62 65  ekGE );.    Vdbe
1c460 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1c470 3d 3d 4f 50 5f 53 65 65 6b 4c 45 29 3b 20 20 74  ==OP_SeekLE);  t
1c480 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1c490 53 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20 56 64  SeekLE );.    Vd
1c4a0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1c4b0 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29 3b 20  op==OP_SeekLT); 
1c4c0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1c4d0 50 5f 53 65 65 6b 4c 54 20 29 3b 0a 0a 20 20 20  P_SeekLT );..   
1c4e0 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c   /* Load the val
1c4f0 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75  ue for the inequ
1c500 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1c510 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
1c520 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  he.    ** range 
1c530 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f  (if any)..    */
1c540 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74  .    nConstraint
1c550 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20   = nEq;.    if( 
1c560 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20  pRangeEnd ){.   
1c570 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
1c580 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78  = pRangeEnd->pEx
1c590 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
1c5a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1c5b0 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
1c5c0 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29   regBase+nEq, 1)
1c5d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1c5e0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1c5f0 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
1c600 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nEq);.      if( 
1c610 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c  (pRangeEnd->wtFl
1c620 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
1c630 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 73  )==0.       && s
1c640 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
1c650 75 6c 6c 28 70 52 69 67 68 74 29 0a 20 20 20 20  ull(pRight).    
1c660 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
1c670 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1c680 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67  , OP_IsNull, reg
1c690 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78  Base+nEq, addrNx
1c6a0 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  t);.        Vdbe
1c6b0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1c6c0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
1c6d0 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1c6e0 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 63 45  inity(pRight, cE
1c6f0 6e 64 41 66 66 29 21 3d 53 51 4c 49 54 45 5f 41  ndAff)!=SQLITE_A
1c700 46 46 5f 4e 4f 4e 45 0a 20 20 20 20 20 20 20 26  FF_NONE.       &
1c710 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 4e 65  & !sqlite3ExprNe
1c720 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
1c730 6e 67 65 28 70 52 69 67 68 74 2c 20 63 45 6e 64  nge(pRight, cEnd
1c740 41 66 66 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  Aff).      ){.  
1c750 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41        codeApplyA
1c760 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
1c770 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 2c 20  regBase+nEq, 1, 
1c780 26 63 45 6e 64 41 66 66 29 3b 0a 20 20 20 20 20  &cEndAff);.     
1c790 20 7d 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72   }.      nConstr
1c7a0 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65  aint++;.      te
1c7b0 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
1c7c0 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
1c7d0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
1c7e0 20 7d 65 6c 73 65 20 69 66 28 20 62 53 74 6f 70   }else if( bStop
1c7f0 41 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  AtNull ){.      
1c800 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c810 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1c820 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
1c830 20 20 20 20 20 65 6e 64 45 71 20 3d 20 30 3b 0a       endEq = 0;.
1c840 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
1c850 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  t++;.    }.    s
1c860 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1c870 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 0a 20 20   zStartAff);..  
1c880 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
1c890 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20  loop body */.   
1c8a0 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71   pLevel->p2 = sq
1c8b0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1c8c0 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  Addr(v);..    /*
1c8d0 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 6e   Check if the in
1c8e0 64 65 78 20 63 75 72 73 6f 72 20 69 73 20 70 61  dex cursor is pa
1c8f0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
1c900 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20  e range. */.    
1c910 69 66 28 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20  if( nConstraint 
1c920 29 7b 0a 20 20 20 20 20 20 6f 70 20 3d 20 61 45  ){.      op = aE
1c930 6e 64 4f 70 5b 62 52 65 76 2a 32 20 2b 20 65 6e  ndOp[bRev*2 + en
1c940 64 45 71 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  dEq];.      sqli
1c950 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
1c960 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c  (v, op, iIdxCur,
1c970 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73   addrNxt, regBas
1c980 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  e, nConstraint);
1c990 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c9a0 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b   op==OP_IdxGT );
1c9b0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1c9c0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 54  (v, op==OP_IdxGT
1c9d0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1c9e0 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45  se( op==OP_IdxGE
1c9f0 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67   );  VdbeCoverag
1ca00 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64  eIf(v, op==OP_Id
1ca10 78 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  xGE );.      tes
1ca20 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64  tcase( op==OP_Id
1ca30 78 4c 54 20 29 3b 20 20 56 64 62 65 43 6f 76 65  xLT );  VdbeCove
1ca40 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
1ca50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 20 20  _IdxLT );.      
1ca60 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
1ca70 5f 49 64 78 4c 45 20 29 3b 20 20 56 64 62 65 43  _IdxLE );  VdbeC
1ca80 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1ca90 3d 4f 50 5f 49 64 78 4c 45 20 29 3b 0a 20 20 20  =OP_IdxLE );.   
1caa0 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20   }..    /* Seek 
1cab0 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72  the table cursor
1cac0 2c 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  , if required */
1cad0 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d  .    disableTerm
1cae0 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53  (pLevel, pRangeS
1caf0 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61 62  tart);.    disab
1cb00 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
1cb10 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 69  RangeEnd);.    i
1cb20 66 28 20 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a  f( omitTable ){.
1cb30 20 20 20 20 20 20 2f 2a 20 70 49 64 78 20 69 73        /* pIdx is
1cb40 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
1cb50 78 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 61  x.  No need to a
1cb60 63 63 65 73 73 20 74 68 65 20 6d 61 69 6e 20 74  ccess the main t
1cb70 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 7d 65 6c  able. */.    }el
1cb80 73 65 20 69 66 28 20 48 61 73 52 6f 77 69 64 28  se if( HasRowid(
1cb90 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 20 29 7b  pIdx->pTable) ){
1cba0 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
1cbb0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1cbc0 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
1cbd0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1cbe0 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43  _IdxRowid, iIdxC
1cbf0 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  ur, iRowidReg);.
1cc00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1cc10 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
1cc20 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
1cc30 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1cc40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cc50 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43  2(v, OP_Seek, iC
1cc60 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 20  ur, iRowidReg); 
1cc70 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73 65 65   /* Deferred see
1cc80 6b 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  k */.    }else{.
1cc90 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b        Index *pPk
1cca0 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
1ccb0 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 2d 3e  yKeyIndex(pIdx->
1ccc0 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 69  pTable);.      i
1ccd0 52 6f 77 69 64 52 65 67 20 3d 20 73 71 6c 69 74  RowidReg = sqlit
1cce0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
1ccf0 50 61 72 73 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79  Parse, pPk->nKey
1cd00 43 6f 6c 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Col);.      for(
1cd10 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79  j=0; j<pPk->nKey
1cd20 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
1cd30 20 20 20 6b 20 3d 20 73 71 6c 69 74 65 33 43 6f     k = sqlite3Co
1cd40 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78  lumnOfIndex(pIdx
1cd50 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
1cd60 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  j]);.        sql
1cd70 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1cd80 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64  , OP_Column, iId
1cd90 78 43 75 72 2c 20 6b 2c 20 69 52 6f 77 69 64 52  xCur, k, iRowidR
1cda0 65 67 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20  eg+j);.      }. 
1cdb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1cdc0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
1cdd0 4e 6f 74 46 6f 75 6e 64 2c 20 69 43 75 72 2c 20  NotFound, iCur, 
1cde0 61 64 64 72 43 6f 6e 74 2c 0a 20 20 20 20 20 20  addrCont,.      
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce00 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 2c 20       iRowidReg, 
1ce10 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56  pPk->nKeyCol); V
1ce20 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1ce30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
1ce40 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75 63  cord the instruc
1ce50 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72  tion used to ter
1ce60 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
1ce70 20 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a   Disable .    **
1ce80 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
1ce90 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61  rms made redunda
1cea0 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65 78 20  nt by the index 
1ceb0 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20  range scan..    
1cec0 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  */.    if( pLoop
1ced0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1cee0 45 5f 4f 4e 45 52 4f 57 20 29 7b 0a 20 20 20 20  E_ONEROW ){.    
1cef0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
1cf00 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73  P_Noop;.    }els
1cf10 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20  e if( bRev ){.  
1cf20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1cf30 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65   OP_Prev;.    }e
1cf40 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
1cf50 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b  l->op = OP_Next;
1cf60 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
1cf70 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b  l->p1 = iIdxCur;
1cf80 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 57 48  .    assert( (WH
1cf90 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44 3e 3e  ERE_UNQ_WANTED>>
1cfa0 31 36 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 4c  16)==1 );.    pL
1cfb0 65 76 65 6c 2d 3e 70 33 20 3d 20 28 70 4c 6f 6f  evel->p3 = (pLoo
1cfc0 70 2d 3e 77 73 46 6c 61 67 73 3e 3e 31 36 29 26  p->wsFlags>>16)&
1cfd0 31 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  1;.    if( (pLoo
1cfe0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1cff0 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 3d 3d  RE_CONSTRAINT)==
1d000 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  0 ){.      pLeve
1d010 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53  l->p5 = SQLITE_S
1d020 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
1d030 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c  AN_STEP;.    }el
1d040 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1d050 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20  ( pLevel->p5==0 
1d060 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
1d070 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1d080 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
1d090 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 6f 6f  ATION.  if( pLoo
1d0a0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1d0b0 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
1d0c0 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54     /* Case 5:  T
1d0d0 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
1d0e0 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65  ately indexed te
1d0f0 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
1d100 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   OR.    **.    *
1d110 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
1d120 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  *.    **   CREAT
1d130 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63  E TABLE t1(a,b,c
1d140 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  ,d);.    **   CR
1d150 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
1d160 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(a);.    **  
1d170 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
1d180 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a   ON t1(b);.    *
1d190 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
1d1a0 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20   i3 ON t1(c);.  
1d1b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
1d1c0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1d1d0 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20  HERE a=5 OR b=7 
1d1e0 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31  OR (c=11 AND d=1
1d1f0 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  3).    **.    **
1d200 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c   In the example,
1d210 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65   there are three
1d220 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
1d230 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a  onnected by OR..
1d240 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f      ** The top o
1d250 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73  f the loop looks
1d260 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
1d270 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1d280 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
1d290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1d2a0 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
1d2b0 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
1d2c0 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f  .    ** Then, fo
1d2d0 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74  r each indexed t
1d2e0 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  erm, the followi
1d2f0 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  ng. The argument
1d300 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53  s to.    ** RowS
1d310 65 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20  etTest are such 
1d320 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f  that the rowid o
1d330 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
1d340 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20  w is inserted.  
1d350 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f    ** into the Ro
1d360 77 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61  wSet. If it is a
1d370 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20  lready present, 
1d380 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68  control skips th
1d390 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f  e.    ** Gosub o
1d3a0 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20  pcode and jumps 
1d3b0 73 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20  straight to the 
1d3c0 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
1d3d0 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20  y WhereEnd()..  
1d3e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1d3f0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
1d400 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20  egin(<term>).   
1d410 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77   **          Row
1d420 53 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20  SetTest         
1d430 20 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72           # Inser
1d440 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77  t rowid into row
1d450 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  set.    **      
1d460 20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32      Gosub      2
1d470 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   A.    **       
1d480 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1d490 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ().    **.    **
1d4a0 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61   Following the a
1d4b0 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65  bove, code to te
1d4c0 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
1d4d0 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74  . Label A, the t
1d4e0 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20  arget.    ** of 
1d4f0 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c  the Gosub above,
1d500 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e   jumps to the in
1d510 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20  struction right 
1d520 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a  after the Goto..
1d530 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1d540 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20         Null     
1d550 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
1d560 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f     # Zero the ro
1d570 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20  wset in reg 1.  
1d580 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
1d590 74 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20  to       B      
1d5a0 20 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20            # The 
1d5b0 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64  loop is finished
1d5c0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1d5d0 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62        A: <loop b
1d5e0 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20  ody>            
1d5f0 20 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61       # Return da
1d600 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20  ta, whatever..  
1d610 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1d620 20 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20       Return     
1d630 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
1d640 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20   # Jump back to 
1d650 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a  the Gosub.    **
1d660 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a  .    **       B:
1d670 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70   <after the loop
1d680 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a  >.    **.    */.
1d690 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
1d6a0 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68  *pOrWc;    /* Th
1d6b0 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b  e OR-clause brok
1d6c0 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74  en out into subt
1d6d0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c  erms */.    SrcL
1d6e0 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20 20  ist *pOrTab;    
1d6f0 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20     /* Shortened 
1d700 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52  table list or OR
1d710 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74 69  -clause generati
1d720 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  on */.    Index 
1d730 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20 20 20  *pCov = 0;      
1d740 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74         /* Potent
1d750 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ial covering ind
1d760 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ex (or NULL) */.
1d770 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75 72 20      int iCovCur 
1d780 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
1d790 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65  ;  /* Cursor use
1d7a0 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63 61 6e  d for index scan
1d7b0 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20  s (if any) */.. 
1d7c0 20 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e     int regReturn
1d7d0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1d7e0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
1d7f0 52 65 67 69 73 74 65 72 20 75 73 65 64 20 77 69  Register used wi
1d800 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20  th OP_Gosub */. 
1d810 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73 65 74     int regRowset
1d820 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1d830 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d840 52 65 67 69 73 74 65 72 20 66 6f 72 20 52 6f 77  Register for Row
1d850 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  Set object */.  
1d860 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d    int regRowid =
1d870 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1d880 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1d890 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
1d8a0 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74  rowid */.    int
1d8b0 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c   iLoopBody = sql
1d8c0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1d8d0 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72 74 20  l(v);  /* Start 
1d8e0 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a  of loop body */.
1d8f0 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e 69 74      int iRetInit
1d900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d920 20 41 64 64 72 65 73 73 20 6f 66 20 72 65 67 52   Address of regR
1d930 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20  eturn init */.  
1d940 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64 54 65    int untestedTe
1d950 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  rms = 0;        
1d960 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72       /* Some ter
1d970 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  ms not completel
1d980 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 20 20  y tested */.    
1d990 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
1d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9b0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1d9c0 65 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  er */.    Expr *
1d9d0 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20 20  pAndExpr = 0;   
1d9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d9f0 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29  An ".. AND (...)
1da00 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  " expression */.
1da10 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20     .    pTerm = 
1da20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  pLoop->aLTerm[0]
1da30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
1da40 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  erm!=0 );.    as
1da50 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
1da60 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29  erator & WO_OR )
1da70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
1da80 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1da90 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20  TERM_ORINFO)!=0 
1daa0 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26  );.    pOrWc = &
1dab0 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
1dac0 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c  ->wc;.    pLevel
1dad0 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e  ->op = OP_Return
1dae0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
1daf0 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20   = regReturn;.. 
1db00 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e     /* Set up a n
1db10 65 77 20 53 72 63 4c 69 73 74 20 69 6e 20 70 4f  ew SrcList in pO
1db20 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rTab containing 
1db30 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
1db40 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62  scanned.    ** b
1db50 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74  y this loop in t
1db60 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64  he a[0] slot and
1db70 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61   all notReady ta
1db80 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73  bles in a[1..] s
1db90 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69  lots..    ** Thi
1dba0 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72  s becomes the Sr
1dbb0 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65 63  cList in the rec
1dbc0 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73  ursive call to s
1dbd0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1dbe0 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ()..    */.    i
1dbf0 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  f( pWInfo->nLeve
1dc00 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  l>1 ){.      int
1dc10 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20   nNotReady;     
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1dc30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74  he number of not
1dc40 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a  Ready tables */.
1dc50 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
1dc60 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53  List_item *origS
1dc70 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  rc;     /* Origi
1dc80 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c  nal list of tabl
1dc90 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74  es */.      nNot
1dca0 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e  Ready = pWInfo->
1dcb0 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20  nLevel - iLevel 
1dcc0 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61  - 1;.      pOrTa
1dcd0 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b  b = sqlite3Stack
1dce0 41 6c 6c 6f 63 52 61 77 28 64 62 2c 0a 20 20 20  AllocRaw(db,.   
1dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd00 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
1dd10 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65  *pOrTab)+ nNotRe
1dd20 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61  ady*sizeof(pOrTa
1dd30 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20  b->a[0]));.     
1dd40 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20 29   if( pOrTab==0 )
1dd50 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79   return notReady
1dd60 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e  ;.      pOrTab->
1dd70 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29 28 6e 4e  nAlloc = (u8)(nN
1dd80 6f 74 52 65 61 64 79 20 2b 20 31 29 3b 0a 20 20  otReady + 1);.  
1dd90 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63      pOrTab->nSrc
1dda0 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f   = pOrTab->nAllo
1ddb0 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  c;.      memcpy(
1ddc0 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61 62 49  pOrTab->a, pTabI
1ddd0 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61  tem, sizeof(*pTa
1dde0 62 49 74 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f  bItem));.      o
1ddf0 72 69 67 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d  rigSrc = pWInfo-
1de00 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20  >pTabList->a;.  
1de10 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d      for(k=1; k<=
1de20 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b  nNotReady; k++){
1de30 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1de40 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26  &pOrTab->a[k], &
1de50 6f 72 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b  origSrc[pLevel[k
1de60 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66  ].iFrom], sizeof
1de70 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b  (pOrTab->a[k]));
1de80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1de90 73 65 7b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  se{.      pOrTab
1dea0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
1deb0 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ist;.    }..    
1dec0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1ded0 65 20 72 6f 77 73 65 74 20 72 65 67 69 73 74 65  e rowset registe
1dee0 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c  r to contain NUL
1def0 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69  L. An SQL NULL i
1df00 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76 61  s .    ** equiva
1df10 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74 79  lent to an empty
1df20 20 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a   rowset..    **.
1df30 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74      ** Also init
1df40 69 61 6c 69 7a 65 20 72 65 67 52 65 74 75 72 6e  ialize regReturn
1df50 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1df60 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69  address of the i
1df70 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20 20 20 20  nstruction .    
1df80 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ** immediately f
1df90 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f  ollowing the OP_
1dfa0 52 65 74 75 72 6e 20 61 74 20 74 68 65 20 62 6f  Return at the bo
1dfb0 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ttom of the loop
1dfc0 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73  . This.    ** is
1dfd0 20 72 65 71 75 69 72 65 64 20 69 6e 20 61 20 66   required in a f
1dfe0 65 77 20 6f 62 73 63 75 72 65 20 4c 45 46 54 20  ew obscure LEFT 
1dff0 4a 4f 49 4e 20 63 61 73 65 73 20 77 68 65 72 65  JOIN cases where
1e000 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20   control jumps. 
1e010 20 20 20 2a 2a 20 6f 76 65 72 20 74 68 65 20 74     ** over the t
1e020 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  op of the loop i
1e030 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20  nto the body of 
1e040 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  it. In this case
1e050 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72   the .    ** cor
1e060 72 65 63 74 20 72 65 73 70 6f 6e 73 65 20 66 6f  rect response fo
1e070 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f  r the end-of-loo
1e080 70 20 63 6f 64 65 20 28 74 68 65 20 4f 50 5f 52  p code (the OP_R
1e090 65 74 75 72 6e 29 20 69 73 20 74 6f 20 0a 20 20  eturn) is to .  
1e0a0 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67    ** fall throug
1e0b0 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
1e0c0 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20  struction, just 
1e0d0 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f  as an OP_Next do
1e0e0 65 73 20 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c  es if.    ** cal
1e0f0 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74  led on an uninit
1e100 69 61 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a  ialized cursor..
1e110 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1e120 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
1e130 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49  gs & WHERE_DUPLI
1e140 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a  CATES_OK)==0 ){.
1e150 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20        regRowset 
1e160 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1e170 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64  ;.      regRowid
1e180 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1e190 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
1e1a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e1b0 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77  _Null, 0, regRow
1e1c0 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  set);.    }.    
1e1d0 69 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74  iRetInit = sqlit
1e1e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e1f0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
1e200 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20  egReturn);..    
1e210 2f 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  /* If the origin
1e220 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  al WHERE clause 
1e230 69 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d  is z of the form
1e240 3a 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20  :  (x1 OR x2 OR 
1e250 2e 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a  ...) AND y.    *
1e260 2a 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79  * Then for every
1e270 20 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61   term xN, evalua
1e280 74 65 20 61 73 20 74 68 65 20 73 75 62 65 78 70  te as the subexp
1e290 72 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20  ression: xN AND 
1e2a0 7a 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61  z.    ** That wa
1e2b0 79 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68  y, terms in y th
1e2c0 61 74 20 61 72 65 20 66 61 63 74 6f 72 65 64 20  at are factored 
1e2d0 69 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63  into the disjunc
1e2e0 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  tion will.    **
1e2f0 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 62 79   be picked up by
1e300 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63   the recursive c
1e310 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57  alls to sqlite3W
1e320 68 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f  hereBegin() belo
1e330 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  w..    **.    **
1e340 20 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20   Actually, each 
1e350 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
1e360 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78   converted to "x
1e370 4e 20 41 4e 44 20 77 22 20 77 68 65 72 65 20 77  N AND w" where w
1e380 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22   is.    ** the "
1e390 69 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65 72  interesting" ter
1e3a0 6d 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20  ms of z - terms 
1e3b0 74 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69  that did not ori
1e3c0 67 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20  ginate in the.  
1e3d0 20 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47    ** ON or USING
1e3e0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46   clause of a LEF
1e3f0 54 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d  T JOIN, and term
1e400 73 20 74 68 61 74 20 61 72 65 20 75 73 61 62 6c  s that are usabl
1e410 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64  e as .    ** ind
1e420 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ices..    **.   
1e430 20 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a   ** This optimiz
1e440 61 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20  ation also only 
1e450 61 70 70 6c 69 65 73 20 69 66 20 74 68 65 20 28  applies if the (
1e460 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29  x1 OR x2 OR ...)
1e470 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20   term.    ** is 
1e480 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
1e490 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f   the ON clause o
1e4a0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20  f a LEFT JOIN.. 
1e4b0 20 20 20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74     ** See ticket
1e4c0 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69   http://www.sqli
1e4d0 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f  te.org/src/info/
1e4e0 66 32 33 36 39 33 30 34 65 34 0a 20 20 20 20 2a  f2369304e4.    *
1e4f0 2f 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 6e  /.    if( pWC->n
1e500 54 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20  Term>1 ){.      
1e510 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 20  int iTerm;.     
1e520 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69 54   for(iTerm=0; iT
1e530 65 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  erm<pWC->nTerm; 
1e540 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  iTerm++){.      
1e550 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
1e560 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45  pWC->a[iTerm].pE
1e570 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
1e580 20 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20   &pWC->a[iTerm] 
1e590 3d 3d 20 70 54 65 72 6d 20 29 20 63 6f 6e 74 69  == pTerm ) conti
1e5a0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
1e5b0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1e5c0 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
1e5d0 6f 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  oin) ) continue;
1e5e0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1e5f0 65 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  e( pWC->a[iTerm]
1e600 2e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  .wtFlags & TERM_
1e610 4f 52 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20  ORINFO );.      
1e620 20 20 74 65 73 74 63 61 73 65 28 20 70 57 43 2d    testcase( pWC-
1e630 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67  >a[iTerm].wtFlag
1e640 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
1e650 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1e660 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74  pWC->a[iTerm].wt
1e670 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 4f 52  Flags & (TERM_OR
1e680 49 4e 46 4f 7c 54 45 52 4d 5f 56 49 52 54 55 41  INFO|TERM_VIRTUA
1e690 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
1e6a0 20 20 20 20 20 20 20 69 66 28 20 28 70 57 43 2d         if( (pWC-
1e6b0 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61  >a[iTerm].eOpera
1e6c0 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30  tor & WO_ALL)==0
1e6d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e6e0 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
1e6f0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
1e700 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
1e710 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71     pAndExpr = sq
1e720 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
1e730 20 70 41 6e 64 45 78 70 72 2c 20 70 45 78 70 72   pAndExpr, pExpr
1e740 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e750 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b   if( pAndExpr ){
1e760 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70  .        pAndExp
1e770 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
1e780 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c  (pParse, TK_AND,
1e790 20 30 2c 20 70 41 6e 64 45 78 70 72 2c 20 30 29   0, pAndExpr, 0)
1e7a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e7b0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
1e7c0 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20  i<pOrWc->nTerm; 
1e7d0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65  ii++){.      Whe
1e7e0 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20  reTerm *pOrTerm 
1e7f0 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b  = &pOrWc->a[ii];
1e800 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
1e810 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
1e820 69 43 75 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d  iCur || (pOrTerm
1e830 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1e840 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  _AND)!=0 ){.    
1e850 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70      WhereInfo *p
1e860 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  SubWInfo;       
1e870 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73     /* Info for s
1e880 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63  ingle OR-term sc
1e890 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  an */.        Ex
1e8a0 70 72 20 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f  pr *pOrExpr = pO
1e8b0 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  rTerm->pExpr;.  
1e8c0 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78        if( pAndEx
1e8d0 70 72 20 26 26 20 21 45 78 70 72 48 61 73 50 72  pr && !ExprHasPr
1e8e0 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c 20  operty(pOrExpr, 
1e8f0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
1e900 20 20 20 20 20 20 20 20 20 20 70 41 6e 64 45 78            pAndEx
1e910 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45  pr->pLeft = pOrE
1e920 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  xpr;.          p
1e930 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78 70  OrExpr = pAndExp
1e940 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
1e950 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
1e960 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69  ough table entri
1e970 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65  es that match te
1e980 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20  rm pOrTerm. */. 
1e990 20 20 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f         pSubWInfo
1e9a0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
1e9b0 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 4f 72  egin(pParse, pOr
1e9c0 54 61 62 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c  Tab, pOrExpr, 0,
1e9d0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1e9e0 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
1e9f0 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53  E_OMIT_OPEN_CLOS
1ea00 45 20 7c 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e  E | WHERE_AND_ON
1ea10 4c 59 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  LY |.           
1ea20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
1ea30 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c  RE_FORCE_TABLE |
1ea40 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
1ea50 4f 4e 4c 59 2c 20 69 43 6f 76 43 75 72 29 3b 0a  ONLY, iCovCur);.
1ea60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1ea70 70 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61  pSubWInfo || pPa
1ea80 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
1ea90 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1eaa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75  .        if( pSu
1eab0 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  bWInfo ){.      
1eac0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
1ead0 53 75 62 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  SubLoop;.       
1eae0 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61     explainOneSca
1eaf0 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n(.             
1eb00 20 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c   pParse, pOrTab,
1eb10 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30   &pSubWInfo->a[0
1eb20 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65  ], iLevel, pLeve
1eb30 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20  l->iFrom, 0.    
1eb40 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
1eb50 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
1eb60 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1eb70 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b  RE_DUPLICATES_OK
1eb80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1eb90 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28      int iSet = (
1eba0 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  (ii==pOrWc->nTer
1ebb0 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20  m-1)?-1:ii);.   
1ebc0 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a           int r;.
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20              r = 
1ebe0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1ebf0 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
1ec00 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c   pTabItem->pTab,
1ec10 20 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20 20 20   -1, iCur, .    
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec40 20 20 20 20 20 72 65 67 52 6f 77 69 64 2c 20 30       regRowid, 0
1ec50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
1ec60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1ec70 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74  Int(v, OP_RowSet
1ec80 54 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c  Test, regRowset,
1ec90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1eca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
1ecc0 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72  rentAddr(v)+2, r
1ecd0 2c 20 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20  , iSet);.       
1ece0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1ecf0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
1ed00 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
1ed10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ed20 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65   OP_Gosub, regRe
1ed30 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29  turn, iLoopBody)
1ed40 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
1ed50 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75  The pSubWInfo->u
1ed60 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61  ntestedTerms fla
1ed70 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  g means that thi
1ed80 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20  s OR term.      
1ed90 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64      ** contained
1eda0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44   one or more AND
1edb0 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74   term from a not
1edc0 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68  Ready table.  Th
1edd0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
1ede0 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f  erms from the no
1edf0 74 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75  tReady table cou
1ee00 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64  ld not be tested
1ee10 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20   and will.      
1ee20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62      ** need to b
1ee30 65 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a  e tested later..
1ee40 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1ee50 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57         if( pSubW
1ee60 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
1ee70 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54 65  rms ) untestedTe
1ee80 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20  rms = 1;..      
1ee90 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66      /* If all of
1eea0 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65   the OR-connecte
1eeb0 64 20 74 65 72 6d 73 20 61 72 65 20 6f 70 74 69  d terms are opti
1eec0 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20  mized using the 
1eed0 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a  same.          *
1eee0 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 65  * index, and the
1eef0 20 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64   index is opened
1ef00 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
1ef10 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20  cursor number.  
1ef20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 65 61          ** by ea
1ef30 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ch call to sqlit
1ef40 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 6d  e3WhereBegin() m
1ef50 61 64 65 20 62 79 20 74 68 69 73 20 6c 6f 6f 70  ade by this loop
1ef60 2c 20 69 74 20 6d 61 79 0a 20 20 20 20 20 20 20  , it may.       
1ef70 20 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c     ** be possibl
1ef80 65 20 74 6f 20 75 73 65 20 74 68 61 74 20 69 6e  e to use that in
1ef90 64 65 78 20 61 73 20 61 20 63 6f 76 65 72 69 6e  dex as a coverin
1efa0 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  g index..       
1efb0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
1efc0 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74  ** If the call t
1efd0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
1efe0 67 69 6e 28 29 20 61 62 6f 76 65 20 72 65 73 75  gin() above resu
1eff0 6c 74 65 64 20 69 6e 20 61 20 73 63 61 6e 20 74  lted in a scan t
1f000 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
1f010 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20   uses an index, 
1f020 61 6e 64 20 74 68 69 73 20 69 73 20 65 69 74 68  and this is eith
1f030 65 72 20 74 68 65 20 66 69 72 73 74 20 4f 52 2d  er the first OR-
1f040 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a 20  connected term. 
1f050 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
1f060 65 73 73 65 64 20 6f 72 20 74 68 65 20 69 6e 64  essed or the ind
1f070 65 78 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ex is the same a
1f080 73 20 74 68 61 74 20 75 73 65 64 20 62 79 20 61  s that used by a
1f090 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20  ll previous.    
1f0a0 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20        ** terms, 
1f0b0 73 65 74 20 70 43 6f 76 20 74 6f 20 74 68 65 20  set pCov to the 
1f0c0 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69  candidate coveri
1f0d0 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68 65 72 77  ng index. Otherw
1f0e0 69 73 65 2c 20 73 65 74 20 0a 20 20 20 20 20 20  ise, set .      
1f0f0 20 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e      ** pCov to N
1f100 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ULL to indicate 
1f110 74 68 61 74 20 6e 6f 20 63 61 6e 64 69 64 61 74  that no candidat
1f120 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  e covering index
1f130 20 77 69 6c 6c 20 0a 20 20 20 20 20 20 20 20 20   will .         
1f140 20 2a 2a 20 62 65 20 61 76 61 69 6c 61 62 6c 65   ** be available
1f150 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1f160 20 20 20 20 20 20 20 20 20 70 53 75 62 4c 6f 6f           pSubLoo
1f170 70 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61  p = pSubWInfo->a
1f180 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  [0].pWLoop;.    
1f190 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1f1a0 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  SubLoop->wsFlags
1f1b0 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
1f1c0 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  DEX)==0 );.     
1f1d0 20 20 20 20 20 69 66 28 20 28 70 53 75 62 4c 6f       if( (pSubLo
1f1e0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1f1f0 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
1f200 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69             && (i
1f210 69 3d 3d 30 20 7c 7c 20 70 53 75 62 4c 6f 6f 70  i==0 || pSubLoop
1f220 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1f230 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20 20 20 20  ==pCov).        
1f240 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
1f250 20 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e   assert( pSubWIn
1f260 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78 43 75 72  fo->a[0].iIdxCur
1f270 3d 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20 20 20  ==iCovCur );.   
1f280 20 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20           pCov = 
1f290 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  pSubLoop->u.btre
1f2a0 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  e.pIndex;.      
1f2b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f2c0 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30 3b         pCov = 0;
1f2d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
1f2e0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73          /* Finis
1f2f0 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75  h the loop throu
1f300 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  gh table entries
1f310 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d   that match term
1f320 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20   pOrTerm. */.   
1f330 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
1f340 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f  ereEnd(pSubWInfo
1f350 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1f360 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1f370 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78  Level->u.pCovidx
1f380 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69 66 28   = pCov;.    if(
1f390 20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d 3e   pCov ) pLevel->
1f3a0 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43 75  iIdxCur = iCovCu
1f3b0 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64 45  r;.    if( pAndE
1f3c0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41 6e  xpr ){.      pAn
1f3d0 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30  dExpr->pLeft = 0
1f3e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1f3f0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 41  xprDelete(db, pA
1f400 6e 64 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  ndExpr);.    }. 
1f410 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1f420 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e  angeP1(v, iRetIn
1f430 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  it, sqlite3VdbeC
1f440 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
1f450 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f460 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1f470 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  , 0, pLevel->add
1f480 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  rBrk);.    sqlit
1f490 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1f4a0 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29  el(v, iLoopBody)
1f4b0 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  ;..    if( pWInf
1f4c0 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71  o->nLevel>1 ) sq
1f4d0 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64  lite3StackFree(d
1f4e0 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20  b, pOrTab);.    
1f4f0 69 66 28 20 21 75 6e 74 65 73 74 65 64 54 65 72  if( !untestedTer
1f500 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d  ms ) disableTerm
1f510 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
1f520 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
1f530 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  /* SQLITE_OMIT_O
1f540 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  R_OPTIMIZATION *
1f550 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61  /..  {.    /* Ca
1f560 73 65 20 36 3a 20 20 54 68 65 72 65 20 69 73 20  se 6:  There is 
1f570 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e  no usable index.
1f580 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63    We must do a c
1f590 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20  omplete.    **  
1f5a0 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20          scan of 
1f5b0 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65  the entire table
1f5c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61  ..    */.    sta
1f5d0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
1f5e0 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74  ep[] = { OP_Next
1f5f0 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20  , OP_Prev };.   
1f600 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
1f610 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50   aStart[] = { OP
1f620 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74  _Rewind, OP_Last
1f630 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   };.    assert( 
1f640 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d  bRev==0 || bRev=
1f650 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  =1 );.    if( pT
1f660 61 62 49 74 65 6d 2d 3e 69 73 52 65 63 75 72 73  abItem->isRecurs
1f670 69 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ive ){.      /* 
1f680 54 61 62 6c 65 73 20 6d 61 72 6b 65 64 20 69 73  Tables marked is
1f690 52 65 63 75 72 73 69 76 65 20 68 61 76 65 20 6f  Recursive have o
1f6a0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nly a single row
1f6b0 20 74 68 61 74 20 69 73 20 73 74 6f 72 65 64 20   that is stored 
1f6c0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 70 73  in.      ** a ps
1f6d0 65 75 64 6f 2d 63 75 72 73 6f 72 2e 20 20 4e 6f  eudo-cursor.  No
1f6e0 20 6e 65 65 64 20 74 6f 20 52 65 77 69 6e 64 20   need to Rewind 
1f6f0 6f 72 20 4e 65 78 74 20 73 75 63 68 20 63 75 72  or Next such cur
1f700 73 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70  sors. */.      p
1f710 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
1f720 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  oop;.    }else{.
1f730 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
1f740 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a   = aStep[bRev];.
1f750 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31        pLevel->p1
1f760 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70   = iCur;.      p
1f770 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20  Level->p2 = 1 + 
1f780 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f790 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76  2(v, aStart[bRev
1f7a0 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  ], iCur, addrBrk
1f7b0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1f7c0 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d  erageIf(v, bRev=
1f7d0 3d 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  =0);.      VdbeC
1f7e0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
1f7f0 76 21 3d 30 29 3b 0a 20 20 20 20 20 20 70 4c 65  v!=0);.      pLe
1f800 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45  vel->p5 = SQLITE
1f810 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
1f820 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d  SCAN_STEP;.    }
1f830 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  .  }..  /* Inser
1f840 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65  t code to test e
1f850 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69  very subexpressi
1f860 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63  on that can be c
1f870 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63  ompletely.  ** c
1f880 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68  omputed using th
1f890 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66  e current set of
1f8a0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
1f8b0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
1f8c0 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , j=pWC->nTerm; 
1f8d0 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b  j>0; j--, pTerm+
1f8e0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
1f8f0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1f900 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1f910 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1f920 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1f930 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1f940 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
1f950 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
1f960 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
1f970 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
1f980 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1f990 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
1f9a0 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d  reqAll & pLevel-
1f9b0 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b  >notReady)!=0 ){
1f9c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f9d0 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
1f9e0 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20  dTerms==0.      
1f9f0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
1fa00 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
1fa10 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
1fa20 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20  _ONLY)!=0 );.   
1fa30 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73     pWInfo->untes
1fa40 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20  tedTerms = 1;.  
1fa50 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1fa60 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65    }.    pE = pTe
1fa70 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61  rm->pExpr;.    a
1fa80 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a  ssert( pE!=0 );.
1fa90 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
1faa0 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78  iLeftJoin && !Ex
1fab0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1fac0 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
1fad0 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
1fae0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1faf0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1fb00 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43  Parse, pE, addrC
1fb10 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
1fb20 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65  IFNULL);.    pTe
1fb30 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
1fb40 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a  ERM_CODED;.  }..
1fb50 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65    /* Insert code
1fb60 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6d 70   to test for imp
1fb70 6c 69 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73  lied constraints
1fb80 20 62 61 73 65 64 20 6f 6e 20 74 72 61 6e 73 69   based on transi
1fb90 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74  tivity.  ** of t
1fba0 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72  he "==" operator
1fbb0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
1fbc0 70 6c 65 3a 20 49 66 20 74 68 65 20 57 48 45 52  ple: If the WHER
1fbd0 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
1fbe0 73 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e  s "t1.a=t2.b" an
1fbf0 64 20 22 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a  d "t2.b=123".  *
1fc00 2a 20 61 6e 64 20 77 65 20 61 72 65 20 63 6f 64  * and we are cod
1fc10 69 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ing the t1 loop 
1fc20 61 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f 70 20  and the t2 loop 
1fc30 68 61 73 20 6e 6f 74 20 79 65 74 20 63 6f 64 65  has not yet code
1fc40 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65 20  d,.  ** then we 
1fc50 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20 22  cannot use the "
1fc60 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74  t1.a=t2.b" const
1fc70 72 61 69 6e 74 2c 20 62 75 74 20 77 65 20 63 61  raint, but we ca
1fc80 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20  n code.  ** the 
1fc90 69 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d 31 32  implied "t1.a=12
1fca0 33 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  3" constraint.. 
1fcb0 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   */.  for(pTerm=
1fcc0 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e  pWC->a, j=pWC->n
1fcd0 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
1fce0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
1fcf0 70 72 20 2a 70 45 2c 20 2a 70 45 41 6c 74 3b 0a  pr *pE, *pEAlt;.
1fd00 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1fd10 41 6c 74 3b 0a 20 20 20 20 69 66 28 20 70 54 65  Alt;.    if( pTe
1fd20 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
1fd30 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
1fd40 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
1fd50 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
1fd60 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28 57  m->eOperator!=(W
1fd70 4f 5f 45 51 55 49 56 7c 57 4f 5f 45 51 29 20 29  O_EQUIV|WO_EQ) )
1fd80 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
1fd90 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
1fda0 72 73 6f 72 21 3d 69 43 75 72 20 29 20 63 6f 6e  rsor!=iCur ) con
1fdb0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
1fdc0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
1fdd0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1fde0 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pE = pTerm->pEx
1fdf0 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
1fe00 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1fe10 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  (pE, EP_FromJoin
1fe20 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
1fe30 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
1fe40 69 67 68 74 20 26 20 70 4c 65 76 65 6c 2d 3e 6e  ight & pLevel->n
1fe50 6f 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a 20  otReady)!=0 );. 
1fe60 20 20 20 70 41 6c 74 20 3d 20 66 69 6e 64 54 65     pAlt = findTe
1fe70 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 54  rm(pWC, iCur, pT
1fe80 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
1fe90 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  n, notReady, WO_
1fea0 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20  EQ|WO_IN, 0);.  
1feb0 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29 20    if( pAlt==0 ) 
1fec0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
1fed0 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20  ( pAlt->wtFlags 
1fee0 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  & (TERM_CODED) )
1fef0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 74   continue;.    t
1ff00 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65  estcase( pAlt->e
1ff10 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
1ff20 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1ff30 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f  ( pAlt->eOperato
1ff40 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
1ff50 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
1ff60 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 74 72  nt((v, "begin tr
1ff70 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61  ansitive constra
1ff80 69 6e 74 22 29 29 3b 0a 20 20 20 20 70 45 41 6c  int"));.    pEAl
1ff90 74 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b  t = sqlite3Stack
1ffa0 41 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  AllocRaw(db, siz
1ffb0 65 6f 66 28 2a 70 45 41 6c 74 29 29 3b 0a 20 20  eof(*pEAlt));.  
1ffc0 20 20 69 66 28 20 70 45 41 6c 74 20 29 7b 0a 20    if( pEAlt ){. 
1ffd0 20 20 20 20 20 2a 70 45 41 6c 74 20 3d 20 2a 70       *pEAlt = *p
1ffe0 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  Alt->pExpr;.    
1fff0 20 20 70 45 41 6c 74 2d 3e 70 4c 65 66 74 20 3d    pEAlt->pLeft =
20000 20 70 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20   pE->pLeft;.    
20010 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
20020 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 41  alse(pParse, pEA
20030 6c 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  lt, addrCont, SQ
20040 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
20050 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
20060 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70 45 41  tackFree(db, pEA
20070 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  lt);.    }.  }..
20080 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20    /* For a LEFT 
20090 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65  OUTER JOIN, gene
200a0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
200b0 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66  ill record the f
200c0 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61 74  act that.  ** at
200d0 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f   least one row o
200e0 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
200f0 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74 68  e has matched th
20100 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a  e left table.  .
20110 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65    */.  if( pLeve
20120 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  l->iLeftJoin ){.
20130 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
20140 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56  First = sqlite3V
20150 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
20160 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
20170 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
20180 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65  nteger, 1, pLeve
20190 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
201a0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
201b0 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20  v, "record LEFT 
201c0 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20  JOIN hit"));.   
201d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
201e0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
201f0 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
20200 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43  C->a, j=0; j<pWC
20210 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54  ->nTerm; j++, pT
20220 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65  erm++){.      te
20230 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
20240 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
20250 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 74  RTUAL );.      t
20260 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
20270 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
20280 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66  ODED );.      if
20290 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
202a0 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
202b0 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
202c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
202d0 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
202e0 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e  qAll & pLevel->n
202f0 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20  otReady)!=0 ){. 
20300 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
20310 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
20320 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20  erms );.        
20330 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
20340 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
20350 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a  pTerm->pExpr );.
20360 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20370 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
20380 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61   pTerm->pExpr, a
20390 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
203a0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
203b0 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
203c0 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
203d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
203e0 74 75 72 6e 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  turn pLevel->not
203f0 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 20 64 65  Ready;.}..#if de
20400 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
20410 5f 45 4e 41 42 4c 45 44 29 20 26 26 20 64 65 66  _ENABLED) && def
20420 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
20430 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29  LE_TREE_EXPLAIN)
20440 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
20450 22 45 78 70 6c 61 6e 61 74 69 6f 6e 22 20 74 65  "Explanation" te
20460 78 74 20 66 6f 72 20 61 20 57 68 65 72 65 54 65  xt for a WhereTe
20470 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rm..*/.static vo
20480 69 64 20 77 68 65 72 65 45 78 70 6c 61 69 6e 54  id whereExplainT
20490 65 72 6d 28 56 64 62 65 20 2a 76 2c 20 57 68 65  erm(Vdbe *v, Whe
204a0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a  reTerm *pTerm){.
204b0 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b    char zType[4];
204c0 0a 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c  .  memcpy(zType,
204d0 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 69 66   "...", 4);.  if
204e0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
204f0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
20500 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27 56 27  ) zType[0] = 'V'
20510 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65  ;.  if( pTerm->e
20520 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
20530 55 49 56 20 20 29 20 7a 54 79 70 65 5b 31 5d 20  UIV  ) zType[1] 
20540 3d 20 27 45 27 3b 0a 20 20 69 66 28 20 45 78 70  = 'E';.  if( Exp
20550 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
20560 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
20570 6f 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b  omJoin) ) zType[
20580 32 5d 20 3d 20 27 4c 27 3b 0a 20 20 73 71 6c 69  2] = 'L';.  sqli
20590 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
205a0 28 76 2c 20 22 25 73 20 22 2c 20 7a 54 79 70 65  (v, "%s ", zType
205b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  );.  sqlite3Expl
205c0 61 69 6e 45 78 70 72 28 76 2c 20 70 54 65 72 6d  ainExpr(v, pTerm
205d0 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 23 65 6e 64  ->pExpr);.}.#end
205e0 69 66 20 2f 2a 20 57 48 45 52 45 54 52 41 43 45  if /* WHERETRACE
205f0 5f 45 4e 41 42 4c 45 44 20 26 26 20 53 51 4c 49  _ENABLED && SQLI
20600 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
20610 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 23 69 66 64  XPLAIN */...#ifd
20620 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
20630 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ABLED./*.** Prin
20640 74 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  t a WhereLoop ob
20650 6a 65 63 74 20 66 6f 72 20 64 65 62 75 67 67 69  ject for debuggi
20660 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73  ng purposes.*/.s
20670 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
20680 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c  LoopPrint(WhereL
20690 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61  oop *p, WhereCla
206a0 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65  use *pWC){.  Whe
206b0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
206c0 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20   pWC->pWInfo;.  
206d0 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e  int nb = 1+(pWIn
206e0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
206f0 72 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63  rc+7)/8;.  struc
20700 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
20710 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
20720 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d  pTabList->a + p-
20730 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a  >iTab;.  Table *
20740 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
20750 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  ab;.  sqlite3Deb
20760 75 67 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e  ugPrintf("%c%2d.
20770 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20  %0*llx.%0*llx", 
20780 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20  p->cId,.        
20790 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
207a0 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73  iTab, nb, p->mas
207b0 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72  kSelf, nb, p->pr
207c0 65 72 65 71 29 3b 0a 20 20 73 71 6c 69 74 65 33  ereq);.  sqlite3
207d0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 31  DebugPrintf(" %1
207e0 32 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2s",.           
207f0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
20800 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d  >zAlias ? pItem-
20810 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e  >zAlias : pTab->
20820 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70  zName);.  if( (p
20830 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
20840 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
20850 3d 30 20 29 7b 0a 20 20 20 20 20 63 6f 6e 73 74  =0 ){.     const
20860 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
20870 20 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65     if( p->u.btre
20880 65 2e 70 49 6e 64 65 78 20 26 26 20 28 7a 4e 61  e.pIndex && (zNa
20890 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e  me = p->u.btree.
208a0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d  pIndex->zName)!=
208b0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  0 ){.      if( s
208c0 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  trncmp(zName, "s
208d0 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
208e0 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 17)==0 ){.   
208f0 20 20 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c       int i = sql
20900 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
20910 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  me) - 1;.       
20920 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d   while( zName[i]
20930 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20  !='_' ) i--;.   
20940 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b       zName += i;
20950 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
20960 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
20970 66 28 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20  f(".%-16s %2d", 
20980 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65  zName, p->u.btre
20990 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73  e.nEq);.    }els
209a0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
209b0 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 32 30  DebugPrintf("%20
209c0 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20  s","");.    }.  
209d0 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
209e0 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75  *z;.    if( p->u
209f0 2e 76 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a  .vtab.idxStr ){.
20a00 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
20a10 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c  3_mprintf("(%d,\
20a20 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20  "%s\",%x)",.    
20a30 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75              p->u
20a40 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d  .vtab.idxNum, p-
20a50 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20  >u.vtab.idxStr, 
20a60 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
20a70 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  sk);.    }else{.
20a80 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
20a90 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25  3_mprintf("(%d,%
20aa0 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69  x)", p->u.vtab.i
20ab0 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62  dxNum, p->u.vtab
20ac0 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20  .omitMask);.    
20ad0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
20ae0 75 67 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73  ugPrintf(" %-19s
20af0 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", z);.    sqlit
20b00 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a  e3_free(z);.  }.
20b10 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
20b20 69 6e 74 66 28 22 20 66 20 25 30 34 78 20 4e 20  intf(" f %04x N 
20b30 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c  %d", p->wsFlags,
20b40 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 73   p->nLTerm);.  s
20b50 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
20b60 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c 25  f(" cost %d,%d,%
20b70 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c  d\n", p->rSetup,
20b80 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75   p->rRun, p->nOu
20b90 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t);.#ifdef SQLIT
20ba0 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
20bb0 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68  PLAIN.  /* If th
20bc0 65 20 30 78 31 30 30 20 62 69 74 20 6f 66 20 77  e 0x100 bit of w
20bd0 68 65 72 65 74 72 61 63 69 6e 67 20 69 73 20 73  heretracing is s
20be0 65 74 2c 20 74 68 65 6e 20 73 68 6f 77 20 61 6c  et, then show al
20bf0 6c 20 6f 66 20 74 68 65 20 63 6f 6e 73 74 72 61  l of the constra
20c00 69 6e 74 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  int.  ** express
20c10 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 68 65 72  ions in the Wher
20c20 65 4c 6f 6f 70 2e 61 4c 54 65 72 6d 5b 5d 20 61  eLoop.aLTerm[] a
20c30 72 72 61 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rray..  */.  if(
20c40 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 28 73   p->nLTerm && (s
20c50 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
20c60 20 26 20 30 78 31 30 30 29 21 3d 30 20 29 7b 20   & 0x100)!=0 ){ 
20c70 20 2f 2a 20 57 48 45 52 45 54 52 41 43 45 20 30   /* WHERETRACE 0
20c80 78 31 30 30 20 2a 2f 0a 20 20 20 20 69 6e 74 20  x100 */.    int 
20c90 69 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  i;.    Vdbe *v =
20ca0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
20cb0 3e 70 56 64 62 65 3b 0a 20 20 20 20 73 71 6c 69  >pVdbe;.    sqli
20cc0 74 65 33 45 78 70 6c 61 69 6e 42 65 67 69 6e 28  te3ExplainBegin(
20cd0 76 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  v);.    for(i=0;
20ce0 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b   i<p->nLTerm; i+
20cf0 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54  +){.      WhereT
20d00 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 70 2d 3e  erm *pTerm = p->
20d10 61 4c 54 65 72 6d 5b 69 5d 3b 0a 20 20 20 20 20  aLTerm[i];.     
20d20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
20d30 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
20d40 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
20d50 69 6e 74 66 28 76 2c 20 22 20 20 28 25 64 29 20  intf(v, "  (%d) 
20d60 23 25 2d 32 64 20 22 2c 20 69 2b 31 2c 20 28 69  #%-2d ", i+1, (i
20d70 6e 74 29 28 70 54 65 72 6d 2d 70 57 43 2d 3e 61  nt)(pTerm-pWC->a
20d80 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
20d90 33 45 78 70 6c 61 69 6e 50 75 73 68 28 76 29 3b  3ExplainPush(v);
20da0 0a 20 20 20 20 20 20 77 68 65 72 65 45 78 70 6c  .      whereExpl
20db0 61 69 6e 54 65 72 6d 28 76 2c 20 70 54 65 72 6d  ainTerm(v, pTerm
20dc0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20dd0 45 78 70 6c 61 69 6e 50 6f 70 28 76 29 3b 0a 20  ExplainPop(v);. 
20de0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
20df0 61 69 6e 4e 4c 28 76 29 3b 0a 20 20 20 20 7d 0a  ainNL(v);.    }.
20e00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
20e10 69 6e 46 69 6e 69 73 68 28 76 29 3b 0a 20 20 20  inFinish(v);.   
20e20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
20e30 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
20e40 33 56 64 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e  3VdbeExplanation
20e50 28 76 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (v));.  }.#endif
20e60 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
20e70 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65   Convert bulk me
20e80 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69  mory into a vali
20e90 64 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  d WhereLoop that
20ea0 20 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a   can be passed.*
20eb0 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c  * to whereLoopCl
20ec0 65 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a  ear harmlessly..
20ed0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
20ee0 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65  hereLoopInit(Whe
20ef0 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d  reLoop *p){.  p-
20f00 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54  >aLTerm = p->aLT
20f10 65 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e  ermSpace;.  p->n
20f20 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e  LTerm = 0;.  p->
20f30 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69  nLSlot = ArraySi
20f40 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  ze(p->aLTermSpac
20f50 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73  e);.  p->wsFlags
20f60 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
20f70 6c 65 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f  lear the WhereLo
20f80 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61  op.u union.  Lea
20f90 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54  ve WhereLoop.pLT
20fa0 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73  erm intact..*/.s
20fb0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
20fc0 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73  LoopClearUnion(s
20fd0 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
20fe0 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28  eLoop *p){.  if(
20ff0 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57   p->wsFlags & (W
21000 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
21010 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  E|WHERE_AUTO_IND
21020 45 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  EX) ){.    if( (
21030 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
21040 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
21050 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62  !=0 && p->u.vtab
21060 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
21070 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21080 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
21090 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74  );.      p->u.vt
210a0 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
210b0 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62  .      p->u.vtab
210c0 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  .idxStr = 0;.   
210d0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77   }else if( (p->w
210e0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
210f0 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26  UTO_INDEX)!=0 &&
21100 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
21110 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ex!=0 ){.      s
21120 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
21130 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
21140 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  ex->zColAff);.  
21150 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
21160 66 6f 55 6e 72 65 66 28 70 2d 3e 75 2e 62 74 72  foUnref(p->u.btr
21170 65 65 2e 70 49 6e 64 65 78 2d 3e 70 4b 65 79 49  ee.pIndex->pKeyI
21180 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
21190 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
211a0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
211b0 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  ;.      p->u.btr
211c0 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
211d0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
211e0 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74  * Deallocate int
211f0 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65  ernal memory use
21200 64 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70  d by a WhereLoop
21210 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
21220 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
21230 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64  Clear(sqlite3 *d
21240 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
21250 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  {.  if( p->aLTer
21260 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
21270 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
21280 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  e(db, p->aLTerm)
21290 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  ;.  whereLoopCle
212a0 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a  arUnion(db, p);.
212b0 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
212c0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  p);.}../*.** Inc
212d0 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79  rease the memory
212e0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20   allocation for 
212f0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20  pLoop->aLTerm[] 
21300 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e  to be at least n
21310 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21320 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
21330 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
21340 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e  reLoop *p, int n
21350 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
21360 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d  *paNew;.  if( p-
21370 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74  >nLSlot>=n ) ret
21380 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
21390 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20   n = (n+7)&~7;. 
213a0 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   paNew = sqlite3
213b0 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
213c0 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d  sizeof(p->aLTerm
213d0 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70  [0])*n);.  if( p
213e0 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  aNew==0 ) return
213f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
21400 20 6d 65 6d 63 70 79 28 70 61 4e 65 77 2c 20 70   memcpy(paNew, p
21410 2d 3e 61 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66  ->aLTerm, sizeof
21420 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70  (p->aLTerm[0])*p
21430 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28  ->nLSlot);.  if(
21440 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61   p->aLTerm!=p->a
21450 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c  LTermSpace ) sql
21460 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
21470 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e  ->aLTerm);.  p->
21480 61 4c 54 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a  aLTerm = paNew;.
21490 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b    p->nLSlot = n;
214a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
214b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  _OK;.}../*.** Tr
214c0 61 6e 73 66 65 72 20 63 6f 6e 74 65 6e 74 20 66  ansfer content f
214d0 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 70  rom the second p
214e0 4c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 66 69  Loop into the fi
214f0 72 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rst..*/.static i
21500 6e 74 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72  nt whereLoopXfer
21510 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
21520 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68  ereLoop *pTo, Wh
21530 65 72 65 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b  ereLoop *pFrom){
21540 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
21550 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b  rUnion(db, pTo);
21560 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  .  if( whereLoop
21570 52 65 73 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20  Resize(db, pTo, 
21580 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29  pFrom->nLTerm) )
21590 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 54  {.    memset(&pT
215a0 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28  o->u, 0, sizeof(
215b0 70 54 6f 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65  pTo->u));.    re
215c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
215d0 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28  M;.  }.  memcpy(
215e0 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52  pTo, pFrom, WHER
215f0 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b  E_LOOP_XFER_SZ);
21600 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61  .  memcpy(pTo->a
21610 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c  LTerm, pFrom->aL
21620 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72  Term, pTo->nLTer
21630 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c  m*sizeof(pTo->aL
21640 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28  Term[0]));.  if(
21650 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20   pFrom->wsFlags 
21660 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
21670 41 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72 6f  ABLE ){.    pFro
21680 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  m->u.vtab.needFr
21690 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  ee = 0;.  }else 
216a0 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c  if( (pFrom->wsFl
216b0 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
216c0 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20  _INDEX)!=0 ){.  
216d0 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65    pFrom->u.btree
216e0 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d  .pIndex = 0;.  }
216f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
21700 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
21710 6c 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70  lete a WhereLoop
21720 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
21730 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
21740 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
21750 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
21760 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c  ){.  whereLoopCl
21770 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71  ear(db, p);.  sq
21780 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
21790 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  p);.}../*.** Fre
217a0 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74  e a WhereInfo st
217b0 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69  ructure.*/.stati
217c0 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f  c void whereInfo
217d0 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62  Free(sqlite3 *db
217e0 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  , WhereInfo *pWI
217f0 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  nfo){.  if( ALWA
21800 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20  YS(pWInfo) ){.  
21810 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
21820 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  ar(&pWInfo->sWC)
21830 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57 49  ;.    while( pWI
21840 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20  nfo->pLoops ){. 
21850 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a       WhereLoop *
21860 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  p = pWInfo->pLoo
21870 70 73 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ps;.      pWInfo
21880 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e  ->pLoops = p->pN
21890 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77  extLoop;.      w
218a0 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64  hereLoopDelete(d
218b0 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  b, p);.    }.   
218c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
218d0 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
218e0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
218f0 6f 72 20 72 65 70 6c 61 63 65 20 61 20 57 68 65  or replace a Whe
21900 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 75 73 69  reLoop entry usi
21910 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20  ng the template 
21920 73 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  supplied..**.** 
21930 41 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  An existing Wher
21940 65 4c 6f 6f 70 20 65 6e 74 72 79 20 6d 69 67 68  eLoop entry migh
21950 74 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  t be overwritten
21960 20 69 66 20 74 68 65 20 6e 65 77 20 74 65 6d 70   if the new temp
21970 6c 61 74 65 0a 2a 2a 20 69 73 20 62 65 74 74 65  late.** is bette
21980 72 20 61 6e 64 20 68 61 73 20 66 65 77 65 72 20  r and has fewer 
21990 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f  dependencies.  O
219a0 72 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 77  r the template w
219b0 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a  ill be ignored.*
219c0 2a 20 61 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20  * and no insert 
219d0 77 69 6c 6c 20 6f 63 63 75 72 20 69 66 20 61 6e  will occur if an
219e0 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
219f0 6f 6f 70 20 69 73 20 66 61 73 74 65 72 20 61 6e  oop is faster an
21a00 64 20 68 61 73 0a 2a 2a 20 66 65 77 65 72 20 64  d has.** fewer d
21a10 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e  ependencies than
21a20 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 20 20   the template.  
21a30 4f 74 68 65 72 77 69 73 65 20 61 20 6e 65 77 20  Otherwise a new 
21a40 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20  WhereLoop is.** 
21a50 61 64 64 65 64 20 62 61 73 65 64 20 6f 6e 20 74  added based on t
21a60 68 65 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a  he template..**.
21a70 2a 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e  ** If pBuilder->
21a80 70 4f 72 53 65 74 20 69 73 20 6e 6f 74 20 4e 55  pOrSet is not NU
21a90 4c 4c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20  LL then we only 
21aa0 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79 20  care about only 
21ab0 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75 69 73  the.** prerequis
21ac0 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20 61 6e  ites and rRun an
21ad0 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66 20  d nOut costs of 
21ae0 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70 73  the N best loops
21af0 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f 72  .  That.** infor
21b00 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68 65 72  mation is gather
21b10 65 64 20 69 6e 20 74 68 65 20 70 42 75 69 6c 64  ed in the pBuild
21b20 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65 63  er->pOrSet objec
21b30 74 2e 20 20 54 68 69 73 20 73 70 65 63 69 61 6c  t.  This special
21b40 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 6d  .** processing m
21b50 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ode is used only
21b60 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70   for OR clause p
21b70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
21b80 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74 69   When accumulati
21b90 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70  ng multiple loop
21ba0 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65 72  s (when pBuilder
21bb0 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55 4c 4c  ->pOrSet is NULL
21bc0 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69  ) we.** still mi
21bd0 67 68 74 20 6f 76 65 72 77 72 69 74 65 20 73 69  ght overwrite si
21be0 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74 68  milar loops with
21bf0 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74   the new templat
21c00 65 20 69 66 20 74 68 65 0a 2a 2a 20 74 65 6d 70  e if the.** temp
21c10 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 2e 20  late is better. 
21c20 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20 6f 76   Loops may be ov
21c30 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
21c40 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63   following .** c
21c50 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20 6d 65  onditions are me
21c60 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  t:.**.**    (1) 
21c70 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73   They have the s
21c80 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20  ame iTab..**    
21c90 28 32 29 20 20 54 68 65 79 20 68 61 76 65 20 74  (2)  They have t
21ca0 68 65 20 73 61 6d 65 20 69 53 6f 72 74 49 64 78  he same iSortIdx
21cb0 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20 54 68 65  ..**    (3)  The
21cc0 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 73 61   template has sa
21cd0 6d 65 20 6f 72 20 66 65 77 65 72 20 64 65 70 65  me or fewer depe
21ce0 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68  ndencies than th
21cf0 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a  e current loop.*
21d00 2a 20 20 20 20 28 34 29 20 20 54 68 65 20 74 65  *    (4)  The te
21d10 6d 70 6c 61 74 65 20 68 61 73 20 74 68 65 20 73  mplate has the s
21d20 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ame or lower cos
21d30 74 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  t than the curre
21d40 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 35  nt loop.**    (5
21d50 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
21d60 75 73 65 73 20 6d 6f 72 65 20 74 65 72 6d 73 20  uses more terms 
21d70 6f 66 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65  of the same inde
21d80 78 20 62 75 74 20 68 61 73 20 6e 6f 20 61 64 64  x but has no add
21d90 69 74 69 6f 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  itional.**      
21da0 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20     dependencies 
21db0 20 20 20 20 20 20 20 20 20 0a 2a 2f 0a 73 74 61           .*/.sta
21dc0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
21dd0 70 49 6e 73 65 72 74 28 57 68 65 72 65 4c 6f 6f  pInsert(WhereLoo
21de0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
21df0 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  er, WhereLoop *p
21e00 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68 65  Template){.  Whe
21e10 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c  reLoop **ppPrev,
21e20 20 2a 70 2c 20 2a 70 4e 65 78 74 20 3d 20 30 3b   *p, *pNext = 0;
21e30 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
21e40 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
21e50 3e 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74  >pWInfo;.  sqlit
21e60 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
21e70 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20  >pParse->db;..  
21e80 2f 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e  /* If pBuilder->
21e90 70 4f 72 53 65 74 20 69 73 20 64 65 66 69 6e 65  pOrSet is define
21ea0 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b 65 65  d, then only kee
21eb0 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 63  p track of the c
21ec0 6f 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 70 72  osts.  ** and pr
21ed0 65 72 65 71 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  ereqs..  */.  if
21ee0 28 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  ( pBuilder->pOrS
21ef0 65 74 21 3d 30 20 29 7b 0a 23 69 66 20 57 48 45  et!=0 ){.#if WHE
21f00 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
21f10 20 20 20 20 75 31 36 20 6e 20 3d 20 70 42 75 69      u16 n = pBui
21f20 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b  lder->pOrSet->n;
21f30 0a 20 20 20 20 69 6e 74 20 78 20 3d 0a 23 65 6e  .    int x =.#en
21f40 64 69 66 0a 20 20 20 20 77 68 65 72 65 4f 72 49  dif.    whereOrI
21f50 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2d 3e  nsert(pBuilder->
21f60 70 4f 72 53 65 74 2c 20 70 54 65 6d 70 6c 61 74  pOrSet, pTemplat
21f70 65 2d 3e 70 72 65 72 65 71 2c 20 70 54 65 6d 70  e->prereq, pTemp
21f80 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20  late->rRun,.    
21f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fb0 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29  pTemplate->nOut)
21fc0 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  ;.#if WHERETRACE
21fd0 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20  _ENABLED /* 0x8 
21fe0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
21ff0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
22000 78 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  x8 ){.      sqli
22010 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 78  te3DebugPrintf(x
22020 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22  ?"   or-%d:  ":"
22030 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b     or-X:  ", n);
22040 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
22050 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c  Print(pTemplate,
22060 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b   pBuilder->pWC);
22070 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
22080 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22090 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  OK;.  }..  /* Se
220a0 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
220b0 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 74  ting WhereLoop t
220c0 6f 20 6f 76 65 72 77 72 69 74 65 2c 20 6f 72 20  o overwrite, or 
220d0 77 68 69 63 68 20 74 61 6b 65 73 0a 20 20 2a 2a  which takes.  **
220e0 20 70 72 69 6f 72 69 74 79 20 6f 76 65 72 20 70   priority over p
220f0 54 65 6d 70 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20  Template..  */. 
22100 20 66 6f 72 28 70 70 50 72 65 76 3d 26 70 57 49   for(ppPrev=&pWI
22110 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 3d 2a  nfo->pLoops, p=*
22120 70 70 50 72 65 76 3b 20 70 3b 20 70 70 50 72 65  ppPrev; p; ppPre
22130 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c  v=&p->pNextLoop,
22140 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20   p=*ppPrev){.   
22150 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54   if( p->iTab!=pT
22160 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c  emplate->iTab ||
22170 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54   p->iSortIdx!=pT
22180 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64  emplate->iSortId
22190 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  x ){.      /* If
221a0 20 65 69 74 68 65 72 20 74 68 65 20 69 54 61 62   either the iTab
221b0 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61 6c   or iSortIdx val
221c0 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65 72  ues for two Wher
221d0 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65 72  eLoop are differ
221e0 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ent.      ** the
221f0 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f  n those WhereLoo
22200 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f  ps need to be co
22210 6e 73 69 64 65 72 65 64 20 73 65 70 61 72 61 74  nsidered separat
22220 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69 73  ely.  Neither is
22230 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e 64  .      ** a cand
22240 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63 65  idate to replace
22250 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20   the other. */. 
22260 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
22270 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74     }.    /* In t
22280 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
22290 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 72  mentation, the r
222a0 53 65 74 75 70 20 76 61 6c 75 65 20 69 73 20 65  Setup value is e
222b0 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a  ither zero.    *
222c0 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66  * or the cost of
222d0 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74   building an aut
222e0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e 6c  omatic index (Nl
222f0 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f  ogN) and the Nlo
22300 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  gN.    ** is the
22310 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74   same for compat
22320 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e  ible WhereLoops.
22330 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
22340 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20  p->rSetup==0 || 
22350 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
22360 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  p==0 .          
22370 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65         || p->rSe
22380 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup==pTemplate->
22390 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f  rSetup );..    /
223a0 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  * whereLoopAddBt
223b0 72 65 65 28 29 20 61 6c 77 61 79 73 20 67 65 6e  ree() always gen
223c0 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65 72  erates and inser
223d0 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ts the automatic
223e0 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61   index.    ** ca
223f0 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63 65  se first.  Hence
22400 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e 64   compatible cand
22410 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 73  idate WhereLoops
22420 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c 61   never have a la
22430 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65 74  rger.    ** rSet
22440 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53 45  up. Call this SE
22450 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f  TUP-INVARIANT */
22460 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
22470 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74  rSetup>=pTemplat
22480 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20  e->rSetup );..  
22490 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
224a0 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
224b0 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71  ereq)==p->prereq
224c0 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74  .     && p->rSet
224d0 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up<=pTemplate->r
224e0 53 65 74 75 70 0a 20 20 20 20 20 26 26 20 70 2d  Setup.     && p-
224f0 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65  >rRun<=pTemplate
22500 2d 3e 72 52 75 6e 0a 20 20 20 20 20 26 26 20 70  ->rRun.     && p
22510 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c 61 74  ->nOut<=pTemplat
22520 65 2d 3e 6e 4f 75 74 0a 20 20 20 20 29 7b 0a 20  e->nOut.    ){. 
22530 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
22540 6e 63 68 20 74 61 6b 65 6e 20 77 68 65 6e 20 70  nch taken when p
22550 20 69 73 20 65 71 75 61 6c 20 6f 72 20 62 65 74   is equal or bet
22560 74 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61  ter than pTempla
22570 74 65 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20  te in .      ** 
22580 61 6c 6c 20 6f 66 20 28 31 29 20 64 65 70 65 6e  all of (1) depen
22590 64 65 6e 63 69 65 73 20 28 32 29 20 73 65 74 75  dencies (2) setu
225a0 70 2d 63 6f 73 74 2c 20 28 33 29 20 72 75 6e 2d  p-cost, (3) run-
225b0 63 6f 73 74 2c 20 61 6e 64 0a 20 20 20 20 20 20  cost, and.      
225c0 2a 2a 20 28 34 29 20 6e 75 6d 62 65 72 20 6f 66  ** (4) number of
225d0 20 6f 75 74 70 75 74 20 72 6f 77 73 2e 20 2a 2f   output rows. */
225e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
225f0 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c  ->rSetup==pTempl
22600 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 20  ate->rSetup );. 
22610 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65 72       if( p->prer
22620 65 71 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70  eq==pTemplate->p
22630 72 65 72 65 71 0a 20 20 20 20 20 20 20 26 26 20  rereq.       && 
22640 70 2d 3e 6e 4c 54 65 72 6d 3c 70 54 65 6d 70 6c  p->nLTerm<pTempl
22650 61 74 65 2d 3e 6e 4c 54 65 72 6d 0a 20 20 20 20  ate->nLTerm.    
22660 20 20 20 26 26 20 28 70 2d 3e 77 73 46 6c 61 67     && (p->wsFlag
22670 73 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 77  s & pTemplate->w
22680 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
22690 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20  NDEXED)!=0.     
226a0 20 20 26 26 20 28 70 2d 3e 75 2e 62 74 72 65 65    && (p->u.btree
226b0 2e 70 49 6e 64 65 78 3d 3d 70 54 65 6d 70 6c 61  .pIndex==pTempla
226c0 74 65 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  te->u.btree.pInd
226d0 65 78 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  ex.          || 
226e0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2b  pTemplate->rRun+
226f0 70 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 2d 3e 72 52  p->nLTerm<=p->rR
22700 75 6e 2b 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c  un+pTemplate->nL
22710 54 65 72 6d 29 0a 20 20 20 20 20 20 29 7b 0a 20  Term).      ){. 
22720 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 77 72         /* Overwr
22730 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ite an existing 
22740 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61  WhereLoop with a
22750 6e 20 73 69 6d 69 6c 61 72 20 6f 6e 65 20 74 68  n similar one th
22760 61 74 20 75 73 65 73 0a 20 20 20 20 20 20 20 20  at uses.        
22770 2a 2a 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66  ** more terms of
22780 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
22790 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d        pNext = p-
227a0 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20  >pNextLoop;.    
227b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
227c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
227d0 2f 2a 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20  /* pTemplate is 
227e0 6e 6f 74 20 68 65 6c 70 66 75 6c 2e 0a 20 20 20  not helpful..   
227f0 20 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 77       ** Return w
22800 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
22810 6f 72 20 61 64 64 69 6e 67 20 61 6e 79 74 68 69  or adding anythi
22820 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f  ng */.        go
22830 74 6f 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65  to whereLoopInse
22840 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d  rt_noop;.      }
22850 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
22860 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
22870 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
22880 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
22890 71 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  q.     && p->rRu
228a0 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n>=pTemplate->rR
228b0 75 6e 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f  un.     && p->nO
228c0 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  ut>=pTemplate->n
228d0 4f 75 74 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Out.    ){.     
228e0 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 61 6e   /* Overwrite an
228f0 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
22900 6f 6f 70 20 77 69 74 68 20 61 20 62 65 74 74 65  oop with a bette
22910 72 20 6f 6e 65 3a 20 6f 6e 65 20 74 68 61 74 20  r one: one that 
22920 69 73 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74  is.      ** bett
22930 65 72 20 61 74 20 6f 6e 65 20 6f 66 20 28 31 29  er at one of (1)
22940 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 28   dependencies, (
22950 32 29 20 73 65 74 75 70 2d 63 6f 73 74 2c 20 28  2) setup-cost, (
22960 33 29 20 72 75 6e 2d 63 6f 73 74 0a 20 20 20 20  3) run-cost.    
22970 20 20 2a 2a 20 6f 72 20 28 34 29 20 6e 75 6d 62    ** or (4) numb
22980 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
22990 73 2c 20 61 6e 64 20 69 73 20 6e 6f 20 77 6f 72  s, and is no wor
229a0 73 65 20 69 6e 20 61 6e 79 20 6f 66 20 74 68 6f  se in any of tho
229b0 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 74 65  se.      ** cate
229c0 67 6f 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20  gories. */.     
229d0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74   assert( p->rSet
229e0 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up>=pTemplate->r
229f0 53 65 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55  Setup ); /* SETU
22a00 50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76  P-INVARIANT abov
22a10 65 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 78 74  e */.      pNext
22a20 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b   = p->pNextLoop;
22a30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
22a40 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
22a50 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
22a60 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68  oint it means th
22a70 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68  at either p[] sh
22a80 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74  ould be overwrit
22a90 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54  ten.  ** with pT
22aa0 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d  emplate[] if p[]
22ab0 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70   exists, or if p
22ac0 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f  ==NULL then allo
22ad0 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20  cate a new.  ** 
22ae0 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e  WhereLoop and in
22af0 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  sert it..  */.#i
22b00 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
22b10 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
22b20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
22b30 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
22b40 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a      if( p!=0 ){.
22b50 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
22b60 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 64 65  ugPrintf("ins-de
22b70 6c 3a 20 20 22 29 3b 0a 20 20 20 20 20 20 77 68  l:  ");.      wh
22b80 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20  ereLoopPrint(p, 
22b90 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
22ba0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
22bb0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e  3DebugPrintf("in
22bc0 73 2d 6e 65 77 3a 20 20 22 29 3b 0a 20 20 20 20  s-new:  ");.    
22bd0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
22be0 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64  Template, pBuild
22bf0 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65  er->pWC);.  }.#e
22c00 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20  ndif.  if( p==0 
22c10 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  ){.    p = sqlit
22c20 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
22c30 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
22c40 6f 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  op));.    if( p=
22c50 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
22c60 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68  TE_NOMEM;.    wh
22c70 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a  ereLoopInit(p);.
22c80 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 58    }.  whereLoopX
22c90 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d 70  fer(db, p, pTemp
22ca0 6c 61 74 65 29 3b 0a 20 20 70 2d 3e 70 4e 65 78  late);.  p->pNex
22cb0 74 4c 6f 6f 70 20 3d 20 70 4e 65 78 74 3b 0a 20  tLoop = pNext;. 
22cc0 20 2a 70 70 50 72 65 76 20 3d 20 70 3b 0a 20 20   *ppPrev = p;.  
22cd0 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
22ce0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
22cf0 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
22d00 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
22d10 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
22d20 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  x;.    if( pInde
22d30 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75  x && pIndex->tnu
22d40 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  m==0 ){.      p-
22d50 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
22d60 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
22d70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22d80 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
22d90 72 65 20 69 66 20 74 68 65 20 69 6e 73 65 72 74  re if the insert
22da0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 77   is a no-op */.w
22db0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e  hereLoopInsert_n
22dc0 6f 6f 70 3a 0a 23 69 66 20 57 48 45 52 45 54 52  oop:.#if WHERETR
22dd0 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
22de0 78 38 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  x8 */.  if( sqli
22df0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
22e00 30 78 38 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  0x8 ){.    sqlit
22e10 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69  e3DebugPrintf("i
22e20 6e 73 2d 6e 6f 6f 70 3a 20 22 29 3b 0a 20 20 20  ns-noop: ");.   
22e30 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
22e40 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c  pTemplate, pBuil
22e50 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23  der->pWC);.  }.#
22e60 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
22e70 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f  QLITE_OK;  .}../
22e80 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
22e90 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76  WhereLoop.nOut v
22ea0 61 6c 75 65 20 64 6f 77 6e 77 61 72 64 20 74 6f  alue downward to
22eb0 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 65 72   account for ter
22ec0 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45  ms of the.** WHE
22ed0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 72  RE clause that r
22ee0 65 66 65 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f  eference the loo
22ef0 70 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20  p but which are 
22f00 6e 6f 74 20 75 73 65 64 20 62 79 20 61 6e 0a 2a  not used by an.*
22f10 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49  * index..**.** I
22f20 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
22f30 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68  plementation, th
22f40 65 20 66 69 72 73 74 20 65 78 74 72 61 20 57 48  e first extra WH
22f50 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
22f60 72 65 64 75 63 65 73 0a 2a 2a 20 74 68 65 20 6e  reduces.** the n
22f70 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
22f80 72 6f 77 73 20 62 79 20 61 20 66 61 63 74 6f 72  rows by a factor
22f90 20 6f 66 20 31 30 20 61 6e 64 20 65 61 63 68 20   of 10 and each 
22fa0 61 64 64 69 74 69 6f 6e 61 6c 20 74 65 72 6d 0a  additional term.
22fb0 2a 2a 20 72 65 64 75 63 65 73 20 74 68 65 20 6e  ** reduces the n
22fc0 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
22fd0 72 6f 77 73 20 62 79 20 73 71 72 74 28 32 29 2e  rows by sqrt(2).
22fe0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22ff0 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
23000 64 6a 75 73 74 28 57 68 65 72 65 43 6c 61 75 73  djust(WhereClaus
23010 65 20 2a 70 57 43 2c 20 57 68 65 72 65 4c 6f 6f  e *pWC, WhereLoo
23020 70 20 2a 70 4c 6f 6f 70 29 7b 0a 20 20 57 68 65  p *pLoop){.  Whe
23030 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a  reTerm *pTerm, *
23040 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f  pX;.  Bitmask no
23050 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f  tAllowed = ~(pLo
23060 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70  op->prereq|pLoop
23070 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69  ->maskSelf);.  i
23080 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 69 66 28 20  nt i, j;..  if( 
23090 21 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61  !OptimizationEna
230a0 62 6c 65 64 28 70 57 43 2d 3e 70 57 49 6e 66 6f  bled(pWC->pWInfo
230b0 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  ->pParse->db, SQ
230c0 4c 49 54 45 5f 41 64 6a 75 73 74 4f 75 74 45 73  LITE_AdjustOutEs
230d0 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
230e0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 57  ;.  }.  for(i=pW
230f0 43 2d 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d  C->nTerm, pTerm=
23100 70 57 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  pWC->a; i>0; i--
23110 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
23120 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  if( (pTerm->wtFl
23130 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
23140 41 4c 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a  AL)!=0 ) break;.
23150 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
23160 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f  prereqAll & pLoo
23170 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20  p->maskSelf)==0 
23180 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
23190 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
231a0 65 71 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77  eqAll & notAllow
231b0 65 64 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ed)!=0 ) continu
231c0 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f  e;.    for(j=pLo
231d0 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e  op->nLTerm-1; j>
231e0 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; j--){.      
231f0 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  pX = pLoop->aLTe
23200 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  rm[j];.      if(
23210 20 70 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75   pX==0 ) continu
23220 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  e;.      if( pX=
23230 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a  =pTerm ) break;.
23240 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 69 50        if( pX->iP
23250 61 72 65 6e 74 3e 3d 30 20 26 26 20 28 26 70 57  arent>=0 && (&pW
23260 43 2d 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74  C->a[pX->iParent
23270 5d 29 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61  ])==pTerm ) brea
23280 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
23290 20 6a 3c 30 20 29 20 70 4c 6f 6f 70 2d 3e 6e 4f   j<0 ) pLoop->nO
232a0 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  ut += pTerm->tru
232b0 74 68 50 72 6f 62 3b 0a 20 20 7d 0a 7d 0a 0a 2f  thProb;.  }.}../
232c0 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20  *.** We have so 
232d0 66 61 72 20 6d 61 74 63 68 65 64 20 70 42 75 69  far matched pBui
232e0 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
232f0 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66  ree.nEq terms of
23300 20 74 68 65 20 69 6e 64 65 78 20 70 49 6e 64 65   the index pInde
23310 78 2e 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 61 74  x..** Try to mat
23320 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a  ch one more..**.
23330 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74 6e  ** If pProbe->tn
23340 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e  um==0, that mean
23350 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66 61  s pIndex is a fa
23360 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66 6f  ke index used fo
23370 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52  r the.** INTEGER
23380 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f   PRIMARY KEY..*/
23390 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
233a0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
233b0 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  ex(.  WhereLoopB
233c0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
233d0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  ,     /* The Whe
233e0 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20 2a  reLoop factory *
233f0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
23400 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
23410 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
23420 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e  se term being an
23430 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65  alyzed */.  Inde
23440 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20 20  x *pProbe,      
23450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
23460 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63 20  n index on pSrc 
23470 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e 4d  */.  LogEst nInM
23480 75 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ul              
23490 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62       /* log(Numb
234a0 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73  er of iterations
234b0 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a 29   due to IN) */.)
234c0 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
234d0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
234e0 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57 48  ->pWInfo;  /* WH
234f0 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e 74  ERE analyse cont
23500 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
23510 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
23520 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  >pParse;        
23530 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
23540 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
23550 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
23560 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
23570 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  ase connection m
23580 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a 2f  alloc context */
23590 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
235a0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
235b0 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57     /* Template W
235c0 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20 63  hereLoop under c
235d0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
235e0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
235f0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
23600 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20   /* A WhereTerm 
23610 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61 74  under considerat
23620 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d  ion */.  int opM
23630 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
23640 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69           /* Vali
23650 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20  d operators for 
23660 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
23670 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b   WhereScan scan;
23680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23690 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72   /* Iterator for
236a0 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f 0a   WHERE terms */.
236b0 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64 5f    Bitmask saved_
236c0 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 20 20  prereq;         
236d0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
236e0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72 65  lue of pNew->pre
236f0 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76  req */.  u16 sav
23700 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20  ed_nLTerm;      
23710 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
23720 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
23730 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20  ew->nLTerm */.  
23740 75 31 36 20 73 61 76 65 64 5f 6e 45 71 3b 20 20  u16 saved_nEq;  
23750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23760 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
23770 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72  e of pNew->u.btr
23780 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 31 36 20  ee.nEq */.  u16 
23790 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20 20 20 20  saved_nSkip;    
237a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
237b0 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
237c0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
237d0 53 6b 69 70 20 2a 2f 0a 20 20 75 33 32 20 73 61  Skip */.  u32 sa
237e0 76 65 64 5f 77 73 46 6c 61 67 73 3b 20 20 20 20  ved_wsFlags;    
237f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
23800 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
23810 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a  New->wsFlags */.
23820 20 20 4c 6f 67 45 73 74 20 73 61 76 65 64 5f 6e    LogEst saved_n
23830 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
23840 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
23850 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75  lue of pNew->nOu
23860 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  t */.  int iCol;
23870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23880 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
23890 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  of the column in
238a0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
238b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
238c0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
238d0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
238e0 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45  /.  LogEst nRowE
238f0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
23900 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64      /* Estimated
23910 20 69 6e 64 65 78 20 73 65 6c 65 63 74 69 76 69   index selectivi
23920 74 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  ty */.  LogEst r
23930 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20  LogSize;        
23940 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72          /* Logar
23950 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20 73 69  ithm of table si
23960 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ze */.  WhereTer
23970 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42  m *pTop = 0, *pB
23980 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61  tm = 0; /* Top a
23990 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20  nd bottom range 
239a0 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a  constraints */..
239b0 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
239c0 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20 64  r->pNew;.  if( d
239d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
239e0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
239f0 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74  NOMEM;..  assert
23a00 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
23a10 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
23a20 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61  TABLE)==0 );.  a
23a30 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73  ssert( (pNew->ws
23a40 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
23a50 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20  P_LIMIT)==0 );. 
23a60 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61   if( pNew->wsFla
23a70 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
23a80 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61  IMIT ){.    opMa
23a90 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  sk = WO_LT|WO_LE
23aa0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
23ab0 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c 7c  robe->tnum<=0 ||
23ac0 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65   (pSrc->jointype
23ad0 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29   & JT_LEFT)!=0 )
23ae0 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57  {.    opMask = W
23af0 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54  O_EQ|WO_IN|WO_GT
23b00 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f  |WO_GE|WO_LT|WO_
23b10 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LE;.  }else{.   
23b20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c   opMask = WO_EQ|
23b30 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 7c  WO_IN|WO_ISNULL|
23b40 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c  WO_GT|WO_GE|WO_L
23b50 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 0a 20 20 69  T|WO_LE;.  }.  i
23b60 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72  f( pProbe->bUnor
23b70 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b 20 26  dered ) opMask &
23b80 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  = ~(WO_GT|WO_GE|
23b90 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20  WO_LT|WO_LE);.. 
23ba0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75   assert( pNew->u
23bb0 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f  .btree.nEq<=pPro
23bc0 62 65 2d 3e 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20  be->nKeyCol );. 
23bd0 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72   if( pNew->u.btr
23be0 65 65 2e 6e 45 71 20 3c 20 70 50 72 6f 62 65 2d  ee.nEq < pProbe-
23bf0 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20  >nKeyCol ){.    
23c00 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61  iCol = pProbe->a
23c10 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77 2d 3e 75 2e  iColumn[pNew->u.
23c20 62 74 72 65 65 2e 6e 45 71 5d 3b 0a 20 20 20 20  btree.nEq];.    
23c30 6e 52 6f 77 45 73 74 20 3d 20 73 71 6c 69 74 65  nRowEst = sqlite
23c40 33 4c 6f 67 45 73 74 28 70 50 72 6f 62 65 2d 3e  3LogEst(pProbe->
23c50 61 69 52 6f 77 45 73 74 5b 70 4e 65 77 2d 3e 75  aiRowEst[pNew->u
23c60 2e 62 74 72 65 65 2e 6e 45 71 2b 31 5d 29 3b 0a  .btree.nEq+1]);.
23c70 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74 3d      if( nRowEst=
23c80 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e  =0 && pProbe->on
23c90 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29  Error==OE_None )
23ca0 20 6e 52 6f 77 45 73 74 20 3d 20 31 3b 0a 20 20   nRowEst = 1;.  
23cb0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 43 6f 6c 20  }else{.    iCol 
23cc0 3d 20 2d 31 3b 0a 20 20 20 20 6e 52 6f 77 45 73  = -1;.    nRowEs
23cd0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 54 65  t = 0;.  }.  pTe
23ce0 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e  rm = whereScanIn
23cf0 69 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64  it(&scan, pBuild
23d00 65 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69  er->pWC, pSrc->i
23d10 43 75 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20  Cursor, iCol,.  
23d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d30 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50        opMask, pP
23d40 72 6f 62 65 29 3b 0a 20 20 73 61 76 65 64 5f 6e  robe);.  saved_n
23d50 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72  Eq = pNew->u.btr
23d60 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f  ee.nEq;.  saved_
23d70 6e 53 6b 69 70 20 3d 20 70 4e 65 77 2d 3e 75 2e  nSkip = pNew->u.
23d80 62 74 72 65 65 2e 6e 53 6b 69 70 3b 0a 20 20 73  btree.nSkip;.  s
23d90 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e  aved_nLTerm = pN
23da0 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61  ew->nLTerm;.  sa
23db0 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e  ved_wsFlags = pN
23dc0 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73  ew->wsFlags;.  s
23dd0 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e  aved_prereq = pN
23de0 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61  ew->prereq;.  sa
23df0 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d  ved_nOut = pNew-
23e00 3e 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72  >nOut;.  pNew->r
23e10 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 4c 6f  Setup = 0;.  rLo
23e20 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 73  gSize = estLog(s
23e30 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 50 72  qlite3LogEst(pPr
23e40 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  obe->aiRowEst[0]
23e50 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64  ));..  /* Consid
23e60 65 72 20 75 73 69 6e 67 20 61 20 73 6b 69 70 2d  er using a skip-
23e70 73 63 61 6e 20 69 66 20 74 68 65 72 65 20 61 72  scan if there ar
23e80 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
23e90 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  e constraints.  
23ea0 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ** available for
23eb0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74   the left-most t
23ec0 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65  erms of the inde
23ed0 78 2c 20 61 6e 64 20 69 66 20 74 68 65 20 61 76  x, and if the av
23ee0 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  erage.  ** numbe
23ef0 72 20 6f 66 20 72 65 70 65 61 74 73 20 69 6e 20  r of repeats in 
23f00 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  the left-most te
23f10 72 6d 73 20 69 73 20 61 74 20 6c 65 61 73 74 20  rms is at least 
23f20 31 38 2e 20 20 54 68 65 20 6d 61 67 69 63 0a 20  18.  The magic. 
23f30 20 2a 2a 20 6e 75 6d 62 65 72 20 31 38 20 77 61   ** number 18 wa
23f40 73 20 66 6f 75 6e 64 20 62 79 20 65 78 70 65 72  s found by exper
23f50 69 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20 62 65  imentation to be
23f60 20 74 68 65 20 70 61 79 6f 66 66 20 70 6f 69 6e   the payoff poin
23f70 74 20 77 68 65 72 65 0a 20 20 2a 2a 20 73 6b 69  t where.  ** ski
23f80 70 2d 73 63 61 6e 20 62 65 63 6f 6d 65 20 66 61  p-scan become fa
23f90 73 74 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c  ster than a full
23fa0 2d 73 63 61 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  -scan..  */.  if
23fb0 28 20 70 54 65 72 6d 3d 3d 30 0a 20 20 20 26 26  ( pTerm==0.   &&
23fc0 20 73 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65   saved_nEq==save
23fd0 64 5f 6e 53 6b 69 70 0a 20 20 20 26 26 20 73 61  d_nSkip.   && sa
23fe0 76 65 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65  ved_nEq+1<pProbe
23ff0 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20  ->nKeyCol.   && 
24000 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74  pProbe->aiRowEst
24010 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 31  [saved_nEq+1]>=1
24020 38 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69  8  /* TUNING: Mi
24030 6e 69 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73  nimum for skip-s
24040 63 61 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72 63  can */.   && (rc
24050 20 3d 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69   = whereLoopResi
24060 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  ze(db, pNew, pNe
24070 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53  w->nLTerm+1))==S
24080 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20  QLITE_OK.  ){.  
24090 20 20 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a    LogEst nIter;.
240a0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
240b0 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65  e.nEq++;.    pNe
240c0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70  w->u.btree.nSkip
240d0 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c  ++;.    pNew->aL
240e0 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
240f0 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e  m++] = 0;.    pN
24100 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
24110 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20  HERE_SKIPSCAN;. 
24120 20 20 20 6e 49 74 65 72 20 3d 20 73 71 6c 69 74     nIter = sqlit
24130 65 33 4c 6f 67 45 73 74 28 70 50 72 6f 62 65 2d  e3LogEst(pProbe-
24140 3e 61 69 52 6f 77 45 73 74 5b 30 5d 2f 70 50 72  >aiRowEst[0]/pPr
24150 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 73 61  obe->aiRowEst[sa
24160 76 65 64 5f 6e 45 71 2b 31 5d 29 3b 0a 20 20 20  ved_nEq+1]);.   
24170 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
24180 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72  eeIndex(pBuilder
24190 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20  , pSrc, pProbe, 
241a0 6e 49 74 65 72 29 3b 0a 20 20 7d 0a 20 20 66 6f  nIter);.  }.  fo
241b0 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
241c0 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70  K && pTerm!=0; p
241d0 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e  Term = whereScan
241e0 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20  Next(&scan)){.  
241f0 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23    int nIn = 0;.#
24200 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
24210 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
24220 54 34 0a 20 20 20 20 69 6e 74 20 6e 52 65 63 56  T4.    int nRecV
24230 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d  alid = pBuilder-
24240 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64  >nRecValid;.#end
24250 69 66 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  if.    if( (pTer
24260 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
24270 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72  _ISNULL || (pTer
24280 6d 2d 3e 77 74 46 6c 61 67 73 26 54 45 52 4d 5f  m->wtFlags&TERM_
24290 56 4e 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20  VNULL)!=0).     
242a0 26 26 20 28 69 43 6f 6c 3c 30 20 7c 7c 20 70 53  && (iCol<0 || pS
242b0 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  rc->pTab->aCol[i
242c0 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 29 0a 20 20  Col].notNull).  
242d0 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69    ){.      conti
242e0 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49  nue; /* ignore I
242f0 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e  S [NOT] NULL con
24300 73 74 72 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20  straints on NOT 
24310 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  NULL columns */.
24320 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
24330 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
24340 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c   & pNew->maskSel
24350 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  f ) continue;.. 
24360 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
24370 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75  >nOut==saved_nOu
24380 74 20 29 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e  t );..    pNew->
24390 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
243a0 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65  wsFlags;.    pNe
243b0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
243c0 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20   saved_nEq;.    
243d0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73  pNew->nLTerm = s
243e0 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20  aved_nLTerm;.   
243f0 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
24400 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70  size(db, pNew, p
24410 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29  New->nLTerm+1) )
24420 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a   break; /* OOM *
24430 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65  /.    pNew->aLTe
24440 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  rm[pNew->nLTerm+
24450 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  +] = pTerm;.    
24460 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 28  pNew->prereq = (
24470 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20 70  saved_prereq | p
24480 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
24490 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b  t) & ~pNew->mask
244a0 53 65 6c 66 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Self;.    pNew->
244b0 72 52 75 6e 20 3d 20 72 4c 6f 67 53 69 7a 65 3b  rRun = rLogSize;
244c0 20 2f 2a 20 42 61 73 65 6c 69 6e 65 20 63 6f 73   /* Baseline cos
244d0 74 20 69 73 20 6c 6f 67 32 28 4e 29 2e 20 20 41  t is log2(N).  A
244e0 64 6a 75 73 74 6d 65 6e 74 73 20 62 65 6c 6f 77  djustments below
244f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72   */.    if( pTer
24500 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
24510 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  O_IN ){.      Ex
24520 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
24530 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
24540 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
24550 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
24560 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
24570 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
24580 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
24590 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22   ){.        /* "
245a0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
245b0 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68 65  )":  TUNING: the
245c0 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20   SELECT returns 
245d0 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  25 rows */.     
245e0 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73     nIn = 46;  as
245f0 73 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65  sert( 46==sqlite
24600 33 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 20  3LogEst(25) );. 
24610 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
24620 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
24630 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78  List && pExpr->x
24640 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  .pList->nExpr) )
24650 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20  {.        /* "x 
24660 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65  IN (value, value
24670 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20  , ...)" */.     
24680 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33     nIn = sqlite3
24690 4c 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78 2e  LogEst(pExpr->x.
246a0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  pList->nExpr);. 
246b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
246c0 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 3b 0a  w->rRun += nIn;.
246d0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
246e0 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20  ree.nEq++;.     
246f0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52   pNew->nOut = nR
24700 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b  owEst + nInMul +
24710 20 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20   nIn;.    }else 
24720 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
24730 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 29 20 29  ator & (WO_EQ) )
24740 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 0a  {.      assert(.
24750 20 20 20 20 20 20 20 20 28 70 4e 65 77 2d 3e 77          (pNew->w
24760 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
24770 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52  COLUMN_NULL|WHER
24780 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52  E_COLUMN_IN|WHER
24790 45 5f 53 4b 49 50 53 43 41 4e 29 29 21 3d 30 0a  E_SKIPSCAN))!=0.
247a0 20 20 20 20 20 20 20 20 7c 7c 20 6e 49 6e 4d 75          || nInMu
247b0 6c 3d 3d 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  l==0.      );.  
247c0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
247d0 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
247e0 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20  N_EQ;.      if( 
247f0 69 43 6f 6c 3c 30 20 7c 7c 20 28 6e 49 6e 4d 75  iCol<0 || (nInMu
24800 6c 3d 3d 30 20 26 26 20 70 4e 65 77 2d 3e 75 2e  l==0 && pNew->u.
24810 62 74 72 65 65 2e 6e 45 71 3d 3d 70 50 72 6f 62  btree.nEq==pProb
24820 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 29 7b 0a  e->nKeyCol-1)){.
24830 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
24840 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
24850 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
24860 29 3d 3d 30 20 7c 7c 20 69 43 6f 6c 3c 30 20 29  )==0 || iCol<0 )
24870 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
24880 6f 6c 3e 3d 30 20 26 26 20 70 50 72 6f 62 65 2d  ol>=0 && pProbe-
24890 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e  >onError==OE_Non
248a0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
248b0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
248c0 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44  WHERE_UNQ_WANTED
248d0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
248e0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
248f0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
24900 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20  E_ONEROW;.      
24910 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24920 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
24930 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65  nEq++;.      pNe
24940 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73  w->nOut = nRowEs
24950 74 20 2b 20 6e 49 6e 4d 75 6c 3b 0a 20 20 20 20  t + nInMul;.    
24960 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d  }else if( pTerm-
24970 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
24980 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  _ISNULL) ){.    
24990 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
249a0 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
249b0 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 4e 65 77  NULL;.      pNew
249c0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b  ->u.btree.nEq++;
249d0 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  .      /* TUNING
249e0 3a 20 49 53 20 4e 55 4c 4c 20 73 65 6c 65 63 74  : IS NULL select
249f0 73 20 32 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20  s 2 rows */.    
24a00 20 20 6e 49 6e 20 3d 20 31 30 3b 20 20 61 73 73    nIn = 10;  ass
24a10 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33  ert( 10==sqlite3
24a20 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20  LogEst(2) );.   
24a30 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
24a40 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c  nRowEst + nInMul
24a50 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c 73   + nIn;.    }els
24a60 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70  e if( pTerm->eOp
24a70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c  erator & (WO_GT|
24a80 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20  WO_GE) ){.      
24a90 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
24aa0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
24ab0 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
24ac0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
24ad0 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29  erator & WO_GE )
24ae0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
24af0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
24b00 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
24b10 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
24b20 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b     pBtm = pTerm;
24b30 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b  .      pTop = 0;
24b40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24b50 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
24b60 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
24b70 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20  _LT|WO_LE) );.  
24b80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
24b90 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
24ba0 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20   WO_LT );.      
24bb0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
24bc0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
24bd0 4c 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  LE );.      pNew
24be0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
24bf0 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
24c00 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
24c10 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54  .      pTop = pT
24c20 65 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20  erm;.      pBtm 
24c30 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  = (pNew->wsFlags
24c40 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
24c50 49 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20  IT)!=0 ?.       
24c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
24c70 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
24c80 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a  >nLTerm-2] : 0;.
24c90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4e      }.    if( pN
24ca0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
24cb0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
24cc0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a   ){.      /* Adj
24cd0 75 73 74 20 6e 4f 75 74 20 61 6e 64 20 72 52 75  ust nOut and rRu
24ce0 6e 20 66 6f 72 20 53 54 41 54 33 20 72 61 6e 67  n for STAT3 rang
24cf0 65 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20  e values */.    
24d00 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
24d10 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74  nOut==saved_nOut
24d20 20 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 52   );.      whereR
24d30 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61 72  angeScanEst(pPar
24d40 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 42  se, pBuilder, pB
24d50 74 6d 2c 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b  tm, pTop, pNew);
24d60 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
24d70 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
24d80 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69  3_OR_STAT4.    i
24d90 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20  f( nInMul==0 .  
24da0 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53     && pProbe->nS
24db0 61 6d 70 6c 65 20 0a 20 20 20 20 20 26 26 20 70  ample .     && p
24dc0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
24dd0 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c  <=pProbe->nSampl
24de0 65 43 6f 6c 0a 20 20 20 20 20 26 26 20 4f 70 74  eCol.     && Opt
24df0 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
24e00 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74  (db, SQLITE_Stat
24e10 33 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  3) .    ){.     
24e20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
24e30 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
24e40 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20     tRowcnt nOut 
24e50 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 28  = 0;.      if( (
24e60 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
24e70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e   & (WO_EQ|WO_ISN
24e80 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ULL))!=0 ){.    
24e90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
24ea0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
24eb0 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
24ec0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
24ed0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
24ee0 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
24ef0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71      rc = whereEq
24f00 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73  ualScanEst(pPars
24f10 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78  e, pBuilder, pEx
24f20 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75  pr->pRight, &nOu
24f30 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  t);.      }else 
24f40 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
24f50 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 0a 20  rator & WO_IN). 
24f60 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 20              &&  
24f70 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
24f80 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
24f90 6c 65 63 74 29 20 20 29 7b 0a 20 20 20 20 20 20  lect)  ){.      
24fa0 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53 63    rc = whereInSc
24fb0 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
24fc0 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 78  uilder, pExpr->x
24fd0 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a  .pList, &nOut);.
24fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
24ff0 73 65 72 74 28 20 6e 4f 75 74 3d 3d 30 20 7c 7c  sert( nOut==0 ||
25000 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25010 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74  ;.      if( nOut
25020 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
25030 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ->nOut = sqlite3
25040 4c 6f 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20 20  LogEst(nOut);.  
25050 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
25060 6e 4f 75 74 3e 73 61 76 65 64 5f 6e 4f 75 74 20  nOut>saved_nOut 
25070 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73  ) pNew->nOut = s
25080 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 20  aved_nOut;.     
25090 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
250a0 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77      if( (pNew->w
250b0 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
250c0 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49  IDX_ONLY|WHERE_I
250d0 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  PK))==0 ){.     
250e0 20 2f 2a 20 45 61 63 68 20 72 6f 77 20 69 6e 76   /* Each row inv
250f0 6f 6c 76 65 73 20 61 20 73 74 65 70 20 6f 66 20  olves a step of 
25100 74 68 65 20 69 6e 64 65 78 2c 20 74 68 65 6e 20  the index, then 
25110 61 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  a binary search 
25120 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
25130 6d 61 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20  main table */.  
25140 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
25150 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41    sqlite3LogEstA
25160 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 72 4c  dd(pNew->rRun,rL
25170 6f 67 53 69 7a 65 3e 32 37 20 3f 20 72 4c 6f 67  ogSize>27 ? rLog
25180 53 69 7a 65 2d 31 37 20 3a 20 31 30 29 3b 0a 20  Size-17 : 10);. 
25190 20 20 20 7d 0a 20 20 20 20 2f 2a 20 53 74 65 70     }.    /* Step
251a0 20 63 6f 73 74 20 66 6f 72 20 65 61 63 68 20 6f   cost for each o
251b0 75 74 70 75 74 20 72 6f 77 20 2a 2f 0a 20 20 20  utput row */.   
251c0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
251d0 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
251e0 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d  New->rRun, pNew-
251f0 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 77 68 65 72  >nOut);.    wher
25200 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73  eLoopOutputAdjus
25210 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c  t(pBuilder->pWC,
25220 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 63 20 3d   pNew);.    rc =
25230 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
25240 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
25250 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d  ;.    if( (pNew-
25260 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
25270 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20  _TOP_LIMIT)==0. 
25280 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62      && pNew->u.b
25290 74 72 65 65 2e 6e 45 71 3c 28 70 50 72 6f 62 65  tree.nEq<(pProbe
252a0 2d 3e 6e 4b 65 79 43 6f 6c 20 2b 20 28 70 50 72  ->nKeyCol + (pPr
252b0 6f 62 65 2d 3e 7a 4e 61 6d 65 21 3d 30 29 29 0a  obe->zName!=0)).
252c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65      ){.      whe
252d0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
252e0 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53  dex(pBuilder, pS
252f0 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d  rc, pProbe, nInM
25300 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20  ul+nIn);.    }. 
25310 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
25320 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64  saved_nOut;.#ifd
25330 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
25340 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
25350 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52      pBuilder->nR
25360 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61  ecValid = nRecVa
25370 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  lid;.#endif.  }.
25380 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
25390 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20   saved_prereq;. 
253a0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
253b0 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a  Eq = saved_nEq;.
253c0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
253d0 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53  nSkip = saved_nS
253e0 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46  kip;.  pNew->wsF
253f0 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46  lags = saved_wsF
25400 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f  lags;.  pNew->nO
25410 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
25420 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
25430 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a  = saved_nLTerm;.
25440 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25450 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75  /*.** Return Tru
25460 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
25470 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78 20  ble that pIndex 
25480 6d 69 67 68 74 20 62 65 20 75 73 65 66 75 6c 20  might be useful 
25490 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69  in.** implementi
254a0 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ng the ORDER BY 
254b0 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64  clause in pBuild
254c0 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
254d0 20 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64   False if pBuild
254e0 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  er does not cont
254f0 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ain an ORDER BY 
25500 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20  clause or.** if 
25510 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
25520 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65  for pIndex to be
25530 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65   useful in imple
25540 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20  menting that.** 
25550 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
25560 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
25570 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
25580 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72  hOrderBy(.  Wher
25590 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
255a0 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20  uilder,.  Index 
255b0 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69  *pIndex,.  int i
255c0 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72  Cursor.){.  Expr
255d0 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 69 6e 74  List *pOB;.  int
255e0 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20   ii, jj;..  if( 
255f0 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72  pIndex->bUnorder
25600 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ed ) return 0;. 
25610 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69   if( (pOB = pBui
25620 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f  lder->pWInfo->pO
25630 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65 74  rderBy)==0 ) ret
25640 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d  urn 0;.  for(ii=
25650 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72  0; ii<pOB->nExpr
25660 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  ; ii++){.    Exp
25670 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74  r *pExpr = sqlit
25680 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
25690 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78  e(pOB->a[ii].pEx
256a0 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  pr);.    if( pEx
256b0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
256c0 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
256d0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
256e0 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a  ble==iCursor ){.
256f0 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20        for(jj=0; 
25700 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  jj<pIndex->nKeyC
25710 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  ol; jj++){.     
25720 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
25730 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61  olumn==pIndex->a
25740 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65  iColumn[jj] ) re
25750 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
25760 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
25770 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
25780 65 74 75 72 6e 20 61 20 62 69 74 6d 61 73 6b 20  eturn a bitmask 
25790 77 68 65 72 65 20 31 73 20 69 6e 64 69 63 61 74  where 1s indicat
257a0 65 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65  e that the corre
257b0 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20  sponding column 
257c0 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  of.** the table 
257d0 69 73 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e  is used by an in
257e0 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66  dex.  Only the f
257f0 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20  irst 63 columns 
25800 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a  are considered..
25810 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
25820 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78  k columnsInIndex
25830 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
25840 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a   Bitmask m = 0;.
25850 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a    int j;.  for(j
25860 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31  =pIdx->nColumn-1
25870 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20  ; j>=0; j--){.  
25880 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e    int x = pIdx->
25890 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
258a0 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20   if( x>=0 ){.   
258b0 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
258c0 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  BMS-1 );.      t
258d0 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d  estcase( x==BMS-
258e0 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78  2 );.      if( x
258f0 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41  <BMS-1 ) m |= MA
25900 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d 0a  SKBIT(x);.    }.
25910 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a    }.  return m;.
25920 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  }../* Check to s
25930 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c 20  ee if a partial 
25940 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72 74  index with pPart
25950 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20 62  IndexWhere can b
25960 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65  e used.** in the
25970 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e 20   current query. 
25980 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
25990 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66 61  it can be and fa
259a0 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  lse if not..*/.s
259b0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 55  tatic int whereU
259c0 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65  sablePartialInde
259d0 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65 72  x(int iTab, Wher
259e0 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78  eClause *pWC, Ex
259f0 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20 69  pr *pWhere){.  i
25a00 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72  nt i;.  WhereTer
25a10 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 66 6f 72 28  m *pTerm;.  for(
25a20 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  i=0, pTerm=pWC->
25a30 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
25a40 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
25a50 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
25a60 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
25a70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 70 57 68  Term->pExpr, pWh
25a80 65 72 65 2c 20 69 54 61 62 29 20 29 20 72 65 74  ere, iTab) ) ret
25a90 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
25aa0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
25ab0 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
25ac0 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20  p objects for a 
25ad0 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66 20  single table of 
25ae0 74 68 65 20 6a 6f 69 6e 20 77 68 65 72 65 20 74  the join where t
25af0 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69  he table.** is i
25b00 64 65 6e 66 69 65 64 20 62 79 20 70 42 75 69 6c  denfied by pBuil
25b10 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e  der->pNew->iTab.
25b20 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20    That table is 
25b30 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
25b40 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61 62  .** a b-tree tab
25b50 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75 61  le, not a virtua
25b60 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  l table..*/.stat
25b70 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
25b80 41 64 64 42 74 72 65 65 28 0a 20 20 57 68 65 72  AddBtree(.  Wher
25b90 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
25ba0 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52 45  uilder, /* WHERE
25bb0 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
25bc0 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
25bd0 20 6d 45 78 74 72 61 20 20 20 20 20 20 20 20 20   mExtra         
25be0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72       /* Extra pr
25bf0 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72 20  erequesites for 
25c00 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65  using this table
25c10 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
25c20 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
25c30 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e       /* WHERE an
25c40 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a  alysis context *
25c50 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62  /.  Index *pProb
25c60 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
25c70 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61  /* An index we a
25c80 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f  re evaluating */
25c90 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20  .  Index sPk;   
25ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25cb0 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f  * A fake index o
25cc0 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70 72  bject for the pr
25cd0 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 74  imary key */.  t
25ce0 52 6f 77 63 6e 74 20 61 69 52 6f 77 45 73 74 50  Rowcnt aiRowEstP
25cf0 6b 5b 32 5d 3b 20 20 20 20 20 20 2f 2a 20 54 68  k[2];      /* Th
25d00 65 20 61 69 52 6f 77 45 73 74 5b 5d 20 76 61 6c  e aiRowEst[] val
25d10 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
25d20 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69  ndex */.  i16 ai
25d30 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20  ColumnPk = -1;  
25d40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f        /* The aCo
25d50 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72  lumn[] value for
25d60 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
25d70 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
25d80 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
25d90 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
25da0 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
25db0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
25dc0 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c;  /* The FROM 
25dd0 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65 72  clause btree ter
25de0 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68  m to add */.  Wh
25df0 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
25e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
25e10 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20  plate WhereLoop 
25e20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
25e30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
25e40 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
25e50 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
25e60 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20  iSortIdx = 1;   
25e70 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
25e80 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
25e90 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   b;             
25ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f           /* A bo
25eb0 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  olean value */. 
25ec0 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20   LogEst rSize;  
25ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25ee0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
25ef0 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
25f00 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65   LogEst rLogSize
25f10 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
25f20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  Logarithm of the
25f30 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
25f40 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
25f50 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
25f60 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC;           /*
25f70 20 54 68 65 20 70 61 72 73 65 64 20 57 48 45 52   The parsed WHER
25f80 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61  E clause */.  Ta
25f90 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
25fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
25fb0 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
25fc0 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20   */.  .  pNew = 
25fd0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
25fe0 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
25ff0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
26000 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
26010 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53  ->pTabList;.  pS
26020 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  rc = pTabList->a
26030 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20   + pNew->iTab;. 
26040 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54   pTab = pSrc->pT
26050 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  ab;.  pWC = pBui
26060 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73  lder->pWC;.  ass
26070 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28  ert( !IsVirtual(
26080 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a  pSrc->pTab) );..
26090 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64    if( pSrc->pInd
260a0 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20  ex ){.    /* An 
260b0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
260c0 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61  e specifies a pa
260d0 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74  rticular index t
260e0 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72  o use */.    pPr
260f0 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64  obe = pSrc->pInd
26100 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ex;.  }else if( 
26110 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
26120 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20  ){.    pProbe = 
26130 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
26140 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
26150 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45  ere is no INDEXE
26160 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72  D BY clause.  Cr
26170 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65  eate a fake Inde
26180 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61  x object in loca
26190 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  l.    ** variabl
261a0 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65  e sPk to represe
261b0 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72 69  nt the rowid pri
261c0 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20  mary key index. 
261d0 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a   Make this.    *
261e0 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65  * fake index the
261f0 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61 69   first in a chai
26200 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63  n of Index objec
26210 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74  ts with all of t
26220 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69  he real.    ** i
26230 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77  ndices to follow
26240 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
26250 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
26260 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
26270 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73   of real indices
26280 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   on the table */
26290 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b  .    memset(&sPk
262a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65  , 0, sizeof(Inde
262b0 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b 65  x));.    sPk.nKe
262c0 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73 50  yCol = 1;.    sP
262d0 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69  k.aiColumn = &ai
262e0 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50  ColumnPk;.    sP
262f0 6b 2e 61 69 52 6f 77 45 73 74 20 3d 20 61 69 52  k.aiRowEst = aiR
26300 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b  owEstPk;.    sPk
26310 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65  .onError = OE_Re
26320 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70  place;.    sPk.p
26330 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20  Table = pTab;.  
26340 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20    aiRowEstPk[0] 
26350 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 3b  = pTab->nRowEst;
26360 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b  .    aiRowEstPk[
26370 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70 46 69 72  1] = 1;.    pFir
26380 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d  st = pSrc->pTab-
26390 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  >pIndex;.    if(
263a0 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65   pSrc->notIndexe
263b0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  d==0 ){.      /*
263c0 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65   The real indice
263d0 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  s of the table a
263e0 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72  re only consider
263f0 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20 20  ed if the.      
26400 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71  ** NOT INDEXED q
26410 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74  ualifier is omit
26420 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f  ted from the FRO
26430 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
26440 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46    sPk.pNext = pF
26450 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irst;.    }.    
26460 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20  pProbe = &sPk;. 
26470 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 73 71 6c   }.  rSize = sql
26480 69 74 65 33 4c 6f 67 45 73 74 28 70 54 61 62 2d  ite3LogEst(pTab-
26490 3e 6e 52 6f 77 45 73 74 29 3b 0a 20 20 72 4c 6f  >nRowEst);.  rLo
264a0 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72  gSize = estLog(r
264b0 53 69 7a 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20  Size);..#ifndef 
264c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
264d0 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 2f 2a  MATIC_INDEX.  /*
264e0 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   Automatic index
264f0 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75  es */.  if( !pBu
26500 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 0a 20 20  ilder->pOrSet.  
26510 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61   && (pWInfo->pPa
26520 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
26530 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65   SQLITE_AutoInde
26540 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72 63  x)!=0.   && pSrc
26550 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 26  ->pIndex==0.   &
26560 26 20 21 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f  & !pSrc->viaCoro
26570 75 74 69 6e 65 0a 20 20 20 26 26 20 21 70 53 72  utine.   && !pSr
26580 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a 20 20  c->notIndexed.  
26590 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 54 61   && HasRowid(pTa
265a0 62 29 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  b).   && !pSrc->
265b0 69 73 43 6f 72 72 65 6c 61 74 65 64 0a 20 20 20  isCorrelated.   
265c0 26 26 20 21 70 53 72 63 2d 3e 69 73 52 65 63 75  && !pSrc->isRecu
265d0 72 73 69 76 65 0a 20 20 29 7b 0a 20 20 20 20 2f  rsive.  ){.    /
265e0 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f 2d  * Generate auto-
265f0 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70 73  index WhereLoops
26600 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
26610 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57 68  m *pTerm;.    Wh
26620 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 20  ereTerm *pWCEnd 
26630 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e  = pWC->a + pWC->
26640 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70  nTerm;.    for(p
26650 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d  Term=pWC->a; rc=
26660 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54  =SQLITE_OK && pT
26670 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72  erm<pWCEnd; pTer
26680 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
26690 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
266a0 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  ht & pNew->maskS
266b0 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  elf ) continue;.
266c0 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 43 61        if( termCa
266d0 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
266e0 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a 20  m, pSrc, 0) ){. 
266f0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
26700 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20  tree.nEq = 1;.  
26710 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
26720 72 65 65 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20  ree.nSkip = 0;. 
26730 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
26740 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
26750 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
26760 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
26770 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
26780 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
26790 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f      /* TUNING: O
267a0 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72  ne-time cost for
267b0 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61   computing the a
267c0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
267d0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70  s.        ** app
267e0 72 6f 78 69 6d 61 74 65 6c 79 20 37 2a 4e 2a 6c  roximately 7*N*l
267f0 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69  og2(N) where N i
26800 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
26810 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20  rows in.        
26820 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
26830 6e 67 20 69 6e 64 65 78 65 64 2e 20 2a 2f 0a 20  ng indexed. */. 
26840 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65         pNew->rSe
26850 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b  tup = rLogSize +
26860 20 72 53 69 7a 65 20 2b 20 32 38 3b 20 20 61 73   rSize + 28;  as
26870 73 65 72 74 28 20 32 38 3d 3d 73 71 6c 69 74 65  sert( 28==sqlite
26880 33 4c 6f 67 45 73 74 28 37 29 20 29 3b 0a 20 20  3LogEst(7) );.  
26890 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
268a0 20 45 61 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b   Each index look
268b0 75 70 20 79 69 65 6c 64 73 20 32 30 20 72 6f 77  up yields 20 row
268c0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  s in the table. 
268d0 20 54 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   This.        **
268e0 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 74 68   is more than th
268f0 65 20 75 73 75 61 6c 20 67 75 65 73 73 20 6f 66  e usual guess of
26900 20 31 30 20 72 6f 77 73 2c 20 73 69 6e 63 65 20   10 rows, since 
26910 77 65 20 68 61 76 65 20 6e 6f 20 77 61 79 0a 20  we have no way. 
26920 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f         ** of kno
26930 77 6e 69 6e 67 20 68 6f 77 20 73 65 6c 65 63 74  wning how select
26940 69 76 65 20 74 68 65 20 69 6e 64 65 78 20 77 69  ive the index wi
26950 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65  ll ultimately be
26960 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20 20 20 20  .  It would.    
26970 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e      ** not be un
26980 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61  reasonable to ma
26990 6b 65 20 74 68 69 73 20 76 61 6c 75 65 20 6d 75  ke this value mu
269a0 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20  ch larger. */.  
269b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
269c0 20 3d 20 34 33 3b 20 20 61 73 73 65 72 74 28 20   = 43;  assert( 
269d0 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  43==sqlite3LogEs
269e0 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20 20  t(20) );.       
269f0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
26a00 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72  lite3LogEstAdd(r
26a10 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f  LogSize,pNew->nO
26a20 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ut);.        pNe
26a30 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
26a40 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20  RE_AUTO_INDEX;. 
26a50 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65         pNew->pre
26a60 72 65 71 20 3d 20 6d 45 78 74 72 61 20 7c 20 70  req = mExtra | p
26a70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
26a80 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        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 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
26ac0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
26ad0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
26ae0 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f  IC_INDEX */..  /
26af0 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  * Loop over all 
26b00 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66  indices.  */.  f
26b10 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  or(; rc==SQLITE_
26b20 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20 70 50  OK && pProbe; pP
26b30 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65  robe=pProbe->pNe
26b40 78 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b  xt, iSortIdx++){
26b50 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d  .    if( pProbe-
26b60 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d  >pPartIdxWhere!=
26b70 30 0a 20 20 20 20 20 26 26 20 21 77 68 65 72 65  0.     && !where
26b80 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
26b90 65 78 28 70 4e 65 77 2d 3e 69 54 61 62 2c 20 70  ex(pNew->iTab, p
26ba0 57 43 2c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72  WC, pProbe->pPar
26bb0 74 49 64 78 57 68 65 72 65 29 20 29 7b 0a 20 20  tIdxWhere) ){.  
26bc0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
26bd0 2a 20 50 61 72 74 69 61 6c 20 69 6e 64 65 78 20  * Partial index 
26be0 69 6e 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  inappropriate fo
26bf0 72 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  r this query */.
26c00 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e      }.    pNew->
26c10 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b  u.btree.nEq = 0;
26c20 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
26c30 65 65 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20  ee.nSkip = 0;.  
26c40 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
26c50 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53   0;.    pNew->iS
26c60 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  ortIdx = 0;.    
26c70 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
26c80 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
26c90 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20  eq = mExtra;.   
26ca0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
26cb0 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ize;.    pNew->u
26cc0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
26cd0 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20  pProbe;.    b = 
26ce0 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69  indexMightHelpWi
26cf0 74 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64  thOrderBy(pBuild
26d00 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63  er, pProbe, pSrc
26d10 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
26d20 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44  /* The ONEPASS_D
26d30 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76  ESIRED flags nev
26d40 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68  er occurs togeth
26d50 65 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59  er with ORDER BY
26d60 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
26d70 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
26d80 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
26d90 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
26da0 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69  || b==0 );.    i
26db0 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c  f( pProbe->tnum<
26dc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
26dd0 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b  nteger primary k
26de0 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ey index */.    
26df0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
26e00 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20  = WHERE_IPK;..  
26e10 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c      /* Full tabl
26e20 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20  e scan */.      
26e30 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
26e40 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20   b ? iSortIdx : 
26e50 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  0;.      /* TUNI
26e60 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c  NG: Cost of full
26e70 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 33   table scan is 3
26e80 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a  *(N + log2(N))..
26e90 20 20 20 20 20 20 2a 2a 20 20 2b 20 20 54 68 65        **  +  The
26ea0 20 65 78 74 72 61 20 33 20 66 61 63 74 6f 72 20   extra 3 factor 
26eb0 69 73 20 74 6f 20 65 6e 63 6f 75 72 61 67 65 20  is to encourage 
26ec0 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64 65 78  the use of index
26ed0 65 64 20 6c 6f 6f 6b 75 70 73 0a 20 20 20 20 20  ed lookups.     
26ee0 20 2a 2a 20 20 20 20 20 6f 76 65 72 20 66 75 6c   **     over ful
26ef0 6c 20 73 63 61 6e 73 2e 20 20 46 49 58 4d 45 20  l scans.  FIXME 
26f00 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  */.      pNew->r
26f10 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
26f20 45 73 74 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f  EstAdd(rSize,rLo
26f30 67 53 69 7a 65 29 20 2b 20 31 36 3b 0a 20 20 20  gSize) + 16;.   
26f40 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70     whereLoopOutp
26f50 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e  utAdjust(pWC, pN
26f60 65 77 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ew);.      rc = 
26f70 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
26f80 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
26f90 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
26fa0 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20  t = rSize;.     
26fb0 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
26fc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26fd0 20 20 42 69 74 6d 61 73 6b 20 6d 3b 0a 20 20 20    Bitmask m;.   
26fe0 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 69     if( pProbe->i
26ff0 73 43 6f 76 65 72 69 6e 67 20 29 7b 0a 20 20 20  sCovering ){.   
27000 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
27010 67 73 20 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs = WHERE_IDX_O
27020 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45  NLY | WHERE_INDE
27030 58 45 44 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d  XED;.        m =
27040 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
27050 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 70 53 72  .        m = pSr
27060 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f  c->colUsed & ~co
27070 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50 72  lumnsInIndex(pPr
27080 6f 62 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  obe);.        pN
27090 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d  ew->wsFlags = (m
270a0 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44  ==0) ? (WHERE_ID
270b0 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44  X_ONLY|WHERE_IND
270c0 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e  EXED) : WHERE_IN
270d0 44 45 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a  DEXED;.      }..
270e0 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63        /* Full sc
270f0 61 6e 20 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a  an via index */.
27100 20 20 20 20 20 20 69 66 28 20 62 0a 20 20 20 20        if( b.    
27110 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28     || !HasRowid(
27120 70 54 61 62 29 0a 20 20 20 20 20 20 20 7c 7c 20  pTab).       || 
27130 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ( m==0.         
27140 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72  && pProbe->bUnor
27150 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  dered==0.       
27160 20 20 26 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a    && (pProbe->sz
27170 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54  IdxRow<pTab->szT
27180 61 62 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20  abRow).         
27190 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
271a0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
271b0 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
271c0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 73  =0.         && s
271d0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
271e0 69 67 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20  ig.bUseCis.     
271f0 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
27200 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e 66  ionEnabled(pWInf
27210 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  o->pParse->db, S
27220 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63  QLITE_CoverIdxSc
27230 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20 29 0a  an).          ).
27240 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
27250 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
27260 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a  = b ? iSortIdx :
27270 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
27280 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
27290 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
272a0 74 20 6f 66 20 61 20 63 6f 76 65 72 69 6e 67 20  t of a covering 
272b0 69 6e 64 65 78 20 73 63 61 6e 20 69 73 20 4b 2a  index scan is K*
272c0 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20  (N + log2(N)).. 
272d0 20 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 20           **  +  
272e0 54 68 65 20 65 78 74 72 61 20 66 61 63 74 6f 72  The extra factor
272f0 20 4b 20 6f 66 20 62 65 74 77 65 65 6e 20 31 2e   K of between 1.
27300 31 20 61 6e 64 20 33 2e 30 20 74 68 61 74 20 64  1 and 3.0 that d
27310 65 70 65 6e 64 73 0a 20 20 20 20 20 20 20 20 20  epends.         
27320 20 2a 2a 20 20 20 20 20 6f 6e 20 74 68 65 20 72   **     on the r
27330 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66  elative sizes of
27340 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74   the table and t
27350 68 65 20 69 6e 64 65 78 2e 20 20 4b 0a 20 20 20  he index.  K.   
27360 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 73         **     is
27370 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 73 6d 61   smaller for sma
27380 6c 6c 65 72 20 69 6e 64 69 63 65 73 2c 20 74 68  ller indices, th
27390 75 73 20 66 61 76 6f 72 69 6e 67 20 74 68 65 6d  us favoring them
273a0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
273b0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72           pNew->r
273c0 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
273d0 45 73 74 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f  EstAdd(rSize,rLo
273e0 67 53 69 7a 65 29 20 2b 20 31 20 2b 0a 20 20 20  gSize) + 1 +.   
273f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27400 20 20 20 20 20 28 31 35 2a 70 50 72 6f 62 65 2d       (15*pProbe-
27410 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54 61 62 2d  >szIdxRow)/pTab-
27420 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 20  >szTabRow;.     
27430 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27440 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
27450 6f 73 74 20 6f 66 20 73 63 61 6e 6e 69 6e 67 20  ost of scanning 
27460 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  a non-covering i
27470 6e 64 65 78 20 69 73 20 28 4e 2b 31 29 2a 6c 6f  ndex is (N+1)*lo
27480 67 32 28 4e 29 0a 20 20 20 20 20 20 20 20 20 20  g2(N).          
27490 2a 2a 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c  ** which we will
274a0 20 73 69 6d 70 6c 69 66 79 20 74 6f 20 6a 75 73   simplify to jus
274b0 74 20 4e 2a 6c 6f 67 32 28 4e 29 20 2a 2f 0a 20  t N*log2(N) */. 
274c0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72           pNew->r
274d0 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 72 4c  Run = rSize + rL
274e0 6f 67 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ogSize;.        
274f0 7d 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  }.        whereL
27500 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
27510 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  pWC, pNew);.    
27520 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
27530 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
27540 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
27550 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
27560 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
27570 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
27580 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
27590 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
275a0 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
275b0 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
275c0 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64 65 66 20  obe, 0);.#ifdef 
275d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
275e0 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
275f0 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
27600 62 65 46 72 65 65 28 70 42 75 69 6c 64 65 72 2d  beFree(pBuilder-
27610 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75 69  >pRec);.    pBui
27620 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
27630 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64 65  = 0;.    pBuilde
27640 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e  r->pRec = 0;.#en
27650 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  dif..    /* If t
27660 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45  here was an INDE
27670 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74  XED BY clause, t
27680 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e  hen only that on
27690 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a  e index is.    *
276a0 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f  * considered. */
276b0 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70  .    if( pSrc->p
276c0 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 20  Index ) break;. 
276d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
276e0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
276f0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
27700 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c  BLE./*.** Add al
27710 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  l WhereLoop obje
27720 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20  cts for a table 
27730 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e  of the join iden
27740 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75  tified by.** pBu
27750 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61  ilder->pNew->iTa
27760 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69  b.  That table i
27770 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
27780 62 65 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  be a virtual tab
27790 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
277a0 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  t whereLoopAddVi
277b0 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f  rtual(.  WhereLo
277c0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
277d0 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20 63  der,  /* WHERE c
277e0 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f  lause informatio
277f0 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d  n */.  Bitmask m
27800 45 78 74 72 61 0a 29 7b 0a 20 20 57 68 65 72 65  Extra.){.  Where
27810 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
27820 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
27830 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78   analysis contex
27840 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  t */.  Parse *pP
27850 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
27860 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
27870 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
27880 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
27890 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
278a0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
278b0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
278c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b  List_item *pSrc;
278d0 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
278e0 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
278f0 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20  arch */.  Table 
27900 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
27910 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f   *db;.  sqlite3_
27920 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
27930 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73  Info;.  struct s
27940 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
27950 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e  straint *pIdxCon
27960 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  s;.  struct sqli
27970 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
27980 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
27990 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ge;.  WhereTerm 
279a0 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pTerm;.  int i,
279b0 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c   j;.  int iTerm,
279c0 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e   mxTerm;.  int n
279d0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e  Constraint;.  in
279e0 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20  t seenIn = 0;   
279f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
27a00 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70 65 72  ue if an IN oper
27a10 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a  ator is seen */.
27a20 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20 3d 20    int seenVar = 
27a30 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
27a40 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d  * True if a non-
27a50 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72 61  constant constra
27a60 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  int is seen */. 
27a70 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20 20 20   int iPhase;    
27a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27a90 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e   0: const w/o IN
27aa0 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e  , 1: const, 2: n
27ab0 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a  o IN,  2: IN */.
27ac0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
27ad0 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  w;.  int rc = SQ
27ae0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e  LITE_OK;..  pWIn
27af0 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
27b00 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20  WInfo;.  pParse 
27b10 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
27b20 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
27b30 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75  >db;.  pWC = pBu
27b40 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e  ilder->pWC;.  pN
27b50 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
27b60 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70  New;.  pSrc = &p
27b70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
27b80 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a  >a[pNew->iTab];.
27b90 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70    pTab = pSrc->p
27ba0 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 49  Tab;.  assert( I
27bb0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
27bc0 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 61  ;.  pIdxInfo = a
27bd0 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
27be0 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53  (pParse, pWC, pS
27bf0 72 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  rc, pBuilder->pO
27c00 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70  rderBy);.  if( p
27c10 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74  IdxInfo==0 ) ret
27c20 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
27c30 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  ;.  pNew->prereq
27c40 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53   = 0;.  pNew->rS
27c50 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77  etup = 0;.  pNew
27c60 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
27c70 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a  E_VIRTUALTABLE;.
27c80 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
27c90 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74   0;.  pNew->u.vt
27ca0 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
27cb0 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64 78  .  pUsage = pIdx
27cc0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
27cd0 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73 74  tUsage;.  nConst
27ce0 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f  raint = pIdxInfo
27cf0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->nConstraint;. 
27d00 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
27d10 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 6e  size(db, pNew, n
27d20 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a 20  Constraint) ){. 
27d30 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
27d40 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  (db, pIdxInfo);.
27d50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27d60 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
27d70 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20 69 50  for(iPhase=0; iP
27d80 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73 65 2b  hase<=3; iPhase+
27d90 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 65 65  +){.    if( !see
27da0 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65 26 31  nIn && (iPhase&1
27db0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50  )!=0 ){.      iP
27dc0 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  hase++;.      if
27dd0 28 20 69 50 68 61 73 65 3e 33 20 29 20 62 72 65  ( iPhase>3 ) bre
27de0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
27df0 28 20 21 73 65 65 6e 56 61 72 20 26 26 20 69 50  ( !seenVar && iP
27e00 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b 3b 0a  hase>1 ) break;.
27e10 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a      pIdxCons = *
27e20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
27e30 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
27e40 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
27e50 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66  onstraint;.    f
27e60 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e  or(i=0; i<pIdxIn
27e70 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
27e80 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
27e90 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 49 64  ){.      j = pId
27ea0 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
27eb0 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  et;.      pTerm 
27ec0 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20  = &pWC->a[j];.  
27ed0 20 20 20 20 73 77 69 74 63 68 28 20 69 50 68 61      switch( iPha
27ee0 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  se ){.        ca
27ef0 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e 73  se 0:    /* Cons
27f00 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20 49 4e  tants without IN
27f10 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
27f20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
27f30 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  >usable = 0;.   
27f40 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
27f50 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
27f60 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20  O_IN)!=0 ){.    
27f70 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e 20 3d          seenIn =
27f80 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
27f90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
27fa0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
27fb0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
27fc0 20 20 20 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a     seenVar = 1;.
27fd0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
27fe0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
27ff0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d  rator & WO_IN)==
28000 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
28010 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
28020 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
28030 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
28040 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
28050 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61   1:    /* Consta
28060 6e 74 73 20 77 69 74 68 20 49 4e 20 6f 70 65 72  nts with IN oper
28070 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20  ators */.       
28080 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 49     assert( seenI
28090 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  n );.          p
280a0 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
280b0 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  = (pTerm->prereq
280c0 52 69 67 68 74 3d 3d 30 29 3b 0a 20 20 20 20 20  Right==0);.     
280d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
280e0 20 20 20 20 63 61 73 65 20 32 3a 20 20 20 20 2f      case 2:    /
280f0 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68  * Variables with
28100 6f 75 74 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20  out IN */.      
28110 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e      assert( seen
28120 56 61 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Var );.         
28130 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
28140 65 20 3d 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  e = (pTerm->eOpe
28150 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d  rator & WO_IN)==
28160 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
28170 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61  ak;.        defa
28180 75 6c 74 3a 20 20 20 2f 2a 20 56 61 72 69 61 62  ult:   /* Variab
28190 6c 65 73 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20  les with IN */. 
281a0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
281b0 20 73 65 65 6e 56 61 72 20 26 26 20 73 65 65 6e   seenVar && seen
281c0 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  In );.          
281d0 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
281e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
281f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
28200 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
28210 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f  pUsage, 0, sizeo
28220 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64  f(pUsage[0])*pId
28230 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
28240 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  nt);.    if( pId
28250 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
28260 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65  eIdxStr ) sqlite
28270 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
28280 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70 49  >idxStr);.    pI
28290 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d  dxInfo->idxStr =
282a0 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
282b0 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20  ->idxNum = 0;.  
282c0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64    pIdxInfo->need
282d0 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30  ToFreeIdxStr = 0
282e0 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
282f0 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
28300 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
28310 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
28320 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42   = SQLITE_BIG_DB
28330 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20  L / (double)2;. 
28340 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
28350 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 35 3b  imatedRows = 25;
28360 0a 20 20 20 20 72 63 20 3d 20 76 74 61 62 42 65  .    rc = vtabBe
28370 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  stIndex(pParse, 
28380 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  pTab, pIdxInfo);
28390 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
283a0 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  to whereLoopAddV
283b0 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 70 49  tab_exit;.    pI
283c0 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63  dxCons = *(struc
283d0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
283e0 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
283f0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
28400 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  int;.    pNew->p
28410 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a  rereq = mExtra;.
28420 20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b      mxTerm = -1;
28430 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
28440 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73  w->nLSlot>=nCons
28450 74 72 61 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f  traint );.    fo
28460 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72  r(i=0; i<nConstr
28470 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d  aint; i++) pNew-
28480 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a  >aLTerm[i] = 0;.
28490 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
284a0 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20  .omitMask = 0;. 
284b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
284c0 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20  onstraint; i++, 
284d0 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20  pIdxCons++){.   
284e0 20 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20     if( (iTerm = 
284f0 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  pUsage[i].argvIn
28500 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20  dex - 1)>=0 ){. 
28510 20 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43         j = pIdxC
28520 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74  ons->iTermOffset
28530 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54  ;.        if( iT
28540 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  erm>=nConstraint
28550 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30  .         || j<0
28560 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d  .         || j>=
28570 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20  pWC->nTerm.     
28580 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54      || pNew->aLT
28590 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20  erm[iTerm]!=0.  
285a0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
285b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
285c0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
285d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
285e0 70 50 61 72 73 65 2c 20 22 25 73 2e 78 42 65 73  pParse, "%s.xBes
285f0 74 49 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e 63  tIndex() malfunc
28600 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  tion", pTab->zNa
28610 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
28620 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  oto whereLoopAdd
28630 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 20  Vtab_exit;.     
28640 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73     }.        tes
28650 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43  tcase( iTerm==nC
28660 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20  onstraint-1 );. 
28670 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
28680 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   j==0 );.       
28690 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57   testcase( j==pW
286a0 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20  C->nTerm-1 );.  
286b0 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
286c0 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20  WC->a[j];.      
286d0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c    pNew->prereq |
286e0 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  = pTerm->prereqR
286f0 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
28700 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77  sert( iTerm<pNew
28710 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20  ->nLSlot );.    
28720 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
28730 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b  [iTerm] = pTerm;
28740 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65  .        if( iTe
28750 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65  rm>mxTerm ) mxTe
28760 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20  rm = iTerm;.    
28770 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
28780 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20  erm==15 );.     
28790 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
287a0 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20  rm==16 );.      
287b0 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26    if( iTerm<16 &
287c0 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74  & pUsage[i].omit
287d0 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e   ) pNew->u.vtab.
287e0 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69  omitMask |= 1<<i
287f0 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
28800 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
28810 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20  tor & WO_IN)!=0 
28820 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
28830 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d   pUsage[i].omit=
28840 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
28850 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    /* Do not atte
28860 6d 70 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e  mpt to use an IN
28870 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74   constraint if t
28880 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
28890 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
288a0 73 61 79 73 20 74 68 61 74 20 74 68 65 20 65 71  says that the eq
288b0 75 69 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73  uivalent EQ cons
288c0 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65  traint cannot be
288d0 20 73 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e   safely omitted.
288e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
288f0 49 66 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74  If we do attempt
28900 20 74 6f 20 75 73 65 20 73 75 63 68 20 61 20 63   to use such a c
28910 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20  onstraint, some 
28920 72 6f 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20  rows might be.  
28930 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70            ** rep
28940 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74  eated in the out
28950 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  put. */.        
28960 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
28970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
28980 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61   /* A virtual ta
28990 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73  ble that is cons
289a0 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e  trained by an IN
289b0 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a   clause may not.
289c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
289d0 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42  sume the ORDER B
289e0 59 20 63 6c 61 75 73 65 20 62 65 63 61 75 73 65  Y clause because
289f0 20 28 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f   (1) the order o
28a00 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20  f IN terms.     
28a10 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e       ** is not n
28a20 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74  ecessarily relat
28a30 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20  ed to the order 
28a40 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20  of output terms 
28a50 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
28a60 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75   (2) Multiple ou
28a70 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e  tputs from a sin
28a80 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c  gle IN value wil
28a90 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20  l not merge.    
28aa0 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65        ** togethe
28ab0 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  r.  */.         
28ac0 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
28ad0 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a  ByConsumed = 0;.
28ae0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28af0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
28b00 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29  i>=nConstraint )
28b10 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  {.      pNew->nL
28b20 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b  Term = mxTerm+1;
28b30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
28b40 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65  New->nLTerm<=pNe
28b50 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20  w->nLSlot );.   
28b60 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
28b70 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66  idxNum = pIdxInf
28b80 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20  o->idxNum;.     
28b90 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
28ba0 65 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66  edFree = pIdxInf
28bb0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
28bc0 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49  Str;.      pIdxI
28bd0 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
28be0 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20  dxStr = 0;.     
28bf0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
28c00 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xStr = pIdxInfo-
28c10 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70  >idxStr;.      p
28c20 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72  New->u.vtab.isOr
28c30 64 65 72 65 64 20 3d 20 28 75 38 29 28 28 70 49  dered = (u8)((pI
28c40 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
28c50 21 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  !=0).           
28c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c70 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64            && pId
28c80 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
28c90 6e 73 75 6d 65 64 29 3b 0a 20 20 20 20 20 20 70  nsumed);.      p
28ca0 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
28cb0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
28cc0 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
28cd0 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78  tFromDouble(pIdx
28ce0 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
28cf0 6f 73 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ost);.      pNew
28d00 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ->nOut = sqlite3
28d10 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f 2d  LogEst(pIdxInfo-
28d20 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b  >estimatedRows);
28d30 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
28d40 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
28d50 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66   pNew);.      if
28d60 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e  ( pNew->u.vtab.n
28d70 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20  eedFree ){.     
28d80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28d90 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
28da0 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  Str);.        pN
28db0 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
28dc0 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ree = 0;.      }
28dd0 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a 77 68  .    }.  }  ..wh
28de0 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65  ereLoopAddVtab_e
28df0 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64 78 49  xit:.  if( pIdxI
28e00 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
28e10 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f  dxStr ) sqlite3_
28e20 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69  free(pIdxInfo->i
28e30 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  dxStr);.  sqlite
28e40 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78  3DbFree(db, pIdx
28e50 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20  Info);.  return 
28e60 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
28e70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
28e80 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
28e90 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70  ** Add WhereLoop
28ea0 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64   entries to hand
28eb0 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68  le OR terms.  Th
28ec0 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74  is works for eit
28ed0 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72  her.** btrees or
28ee0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
28ef0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
28f00 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 57 68  hereLoopAddOr(Wh
28f10 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
28f20 70 42 75 69 6c 64 65 72 2c 20 42 69 74 6d 61 73  pBuilder, Bitmas
28f30 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20 57 68 65  k mExtra){.  Whe
28f40 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
28f50 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
28f60 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  o;.  WhereClause
28f70 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f   *pWC;.  WhereLo
28f80 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72  op *pNew;.  Wher
28f90 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70  eTerm *pTerm, *p
28fa0 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20  WCEnd;.  int rc 
28fb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
28fc0 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65  nt iCur;.  Where
28fd0 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20  Clause tempWC;. 
28fe0 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
28ff0 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57  r sSubBuild;.  W
29000 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20  hereOrSet sSum, 
29010 73 43 75 72 2c 20 73 50 72 65 76 3b 0a 20 20 73  sCur, sPrev;.  s
29020 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
29030 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20  em *pItem;.  .  
29040 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
29050 70 57 43 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  pWC;.  if( pWInf
29060 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
29070 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 29  WHERE_AND_ONLY )
29080 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29090 4b 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57  K;.  pWCEnd = pW
290a0 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72  C->a + pWC->nTer
290b0 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  m;.  pNew = pBui
290c0 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65  lder->pNew;.  me
290d0 6d 73 65 74 28 26 73 53 75 6d 2c 20 30 2c 20 73  mset(&sSum, 0, s
290e0 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20  izeof(sSum));.  
290f0 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
29100 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e  pTabList->a + pN
29110 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69 66 28 20  ew->iTab;.  if( 
29120 21 48 61 73 52 6f 77 69 64 28 70 49 74 65 6d 2d  !HasRowid(pItem-
29130 3e 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  >pTab) ) return 
29140 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 43 75  SQLITE_OK;.  iCu
29150 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  r = pItem->iCurs
29160 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d  or;..  for(pTerm
29170 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
29180 57 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c  WCEnd && rc==SQL
29190 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29  ITE_OK; pTerm++)
291a0 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  {.    if( (pTerm
291b0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
291c0 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20  _OR)!=0.     && 
291d0 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  (pTerm->u.pOrInf
291e0 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70  o->indexable & p
291f0 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d  New->maskSelf)!=
29200 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
29210 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f  WhereClause * co
29220 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65  nst pOrWC = &pTe
29230 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
29240 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  c;.      WhereTe
29250 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43  rm * const pOrWC
29260 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b  End = &pOrWC->a[
29270 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  pOrWC->nTerm];. 
29280 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
29290 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  pOrTerm;.      i
292a0 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20  nt once = 1;.   
292b0 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
292c0 20 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c   .      sSubBuil
292d0 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20  d = *pBuilder;. 
292e0 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
292f0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
29300 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72     sSubBuild.pOr
29310 53 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20  Set = &sCur;..  
29320 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d      for(pOrTerm=
29330 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72  pOrWC->a; pOrTer
29340 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54  m<pOrWCEnd; pOrT
29350 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
29360 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f  if( (pOrTerm->eO
29370 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44  perator & WO_AND
29380 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
29390 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20    sSubBuild.pWC 
293a0 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41  = &pOrTerm->u.pA
293b0 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  ndInfo->wc;.    
293c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
293d0 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
293e0 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20  r==iCur ){.     
293f0 20 20 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e       tempWC.pWIn
29400 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  fo = pWC->pWInfo
29410 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
29420 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b  WC.pOuter = pWC;
29430 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
29440 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  C.op = TK_AND;. 
29450 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
29460 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  nTerm = 1;.     
29470 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20       tempWC.a = 
29480 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  pOrTerm;.       
29490 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43     sSubBuild.pWC
294a0 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20   = &tempWC;.    
294b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
294c0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
294d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
294e0 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66   sCur.n = 0;.#if
294f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
29500 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
29510 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74        if( IsVirt
29520 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29  ual(pItem->pTab)
29530 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
29540 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
29550 69 72 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c  irtual(&sSubBuil
29560 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20  d, mExtra);.    
29570 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
29580 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
29590 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
295a0 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73 53 75  oopAddBtree(&sSu
295b0 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b  bBuild, mExtra);
295c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
295d0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
295e0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72  QLITE_OK || sCur
295f0 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  .n==0 );.       
29600 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29   if( sCur.n==0 )
29610 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d  {.          sSum
29620 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
29630 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
29640 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65 20   }else if( once 
29650 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65  ){.          whe
29660 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20  reOrMove(&sSum, 
29670 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20  &sCur);.        
29680 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20    once = 0;.    
29690 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
296a0 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65       whereOrMove
296b0 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b  (&sPrev, &sSum);
296c0 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e  .          sSum.
296d0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
296e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65   for(i=0; i<sPre
296f0 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  v.n; i++){.     
29700 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
29710 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a  j<sCur.n; j++){.
29720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
29730 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75  ereOrInsert(&sSu
29740 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72  m, sPrev.a[i].pr
29750 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d  ereq | sCur.a[j]
29760 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20  .prereq,.       
29770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29780 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45       sqlite3LogE
29790 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d  stAdd(sPrev.a[i]
297a0 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d  .rRun, sCur.a[j]
297b0 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20  .rRun),.        
297c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297d0 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73      sqlite3LogEs
297e0 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e  tAdd(sPrev.a[i].
297f0 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e  nOut, sCur.a[j].
29800 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20  nOut));.        
29810 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29820 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
29830 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e    }.      pNew->
29840 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
29850 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30    pNew->aLTerm[0
29860 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
29870 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
29880 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b   WHERE_MULTI_OR;
29890 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65  .      pNew->rSe
298a0 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tup = 0;.      p
298b0 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
298c0 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  0;.      memset(
298d0 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a  &pNew->u, 0, siz
298e0 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20  eof(pNew->u));. 
298f0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63       for(i=0; rc
29900 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
29910 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20  <sSum.n; i++){. 
29920 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
29930 3a 20 4d 75 6c 74 69 70 6c 65 20 62 79 20 33 2e  : Multiple by 3.
29940 35 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  5 for the second
29950 61 72 79 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70  ary table lookup
29960 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
29970 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b  ->rRun = sSum.a[
29980 69 5d 2e 72 52 75 6e 20 2b 20 31 38 3b 0a 20 20  i].rRun + 18;.  
29990 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
299a0 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75   = sSum.a[i].nOu
299b0 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  t;.        pNew-
299c0 3e 70 72 65 72 65 71 20 3d 20 73 53 75 6d 2e 61  >prereq = sSum.a
299d0 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20 20 20  [i].prereq;.    
299e0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
299f0 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
29a00 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
29a10 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
29a20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
29a30 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
29a40 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
29a50 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73  all tables .*/.s
29a60 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
29a70 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c  oopAddAll(WhereL
29a80 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
29a90 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e  lder){.  WhereIn
29aa0 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
29ab0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
29ac0 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20   Bitmask mExtra 
29ad0 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  = 0;.  Bitmask m
29ae0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74  Prior = 0;.  int
29af0 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74   iTab;.  SrcList
29b00 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
29b10 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
29b20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
29b30 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
29b40 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
29b50 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
29b60 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 20  .  int nTabList 
29b70 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
29b80 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
29b90 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 70 72 69  ITE_OK;.  u8 pri
29ba0 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 30 3b 0a  orJoinType = 0;.
29bb0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
29bc0 77 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76  w;..  /* Loop ov
29bd0 65 72 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  er the tables in
29be0 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20   the join, from 
29bf0 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f  left to right */
29c00 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
29c10 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72  er->pNew;.  wher
29c20 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b  eLoopInit(pNew);
29c30 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c 20 70  .  for(iTab=0, p
29c40 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  Item=pTabList->a
29c50 3b 20 69 54 61 62 3c 6e 54 61 62 4c 69 73 74 3b  ; iTab<nTabList;
29c60 20 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b   iTab++, pItem++
29c70 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61  ){.    pNew->iTa
29c80 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e  b = iTab;.    pN
29c90 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67  ew->maskSelf = g
29ca0 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
29cb0 73 4d 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d  sMaskSet, pItem-
29cc0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69  >iCursor);.    i
29cd0 66 28 20 28 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e  f( ((pItem->join
29ce0 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 54 79  type|priorJoinTy
29cf0 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  pe) & (JT_LEFT|J
29d00 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a  T_CROSS))!=0 ){.
29d10 20 20 20 20 20 20 6d 45 78 74 72 61 20 3d 20 6d        mExtra = m
29d20 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Prior;.    }.   
29d30 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d   priorJoinType =
29d40 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65   pItem->jointype
29d50 3b 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74  ;.    if( IsVirt
29d60 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29  ual(pItem->pTab)
29d70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
29d80 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
29d90 61 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78  al(pBuilder, mEx
29da0 74 72 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tra);.    }else{
29db0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
29dc0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42  eLoopAddBtree(pB
29dd0 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b  uilder, mExtra);
29de0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
29df0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29e00 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
29e10 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64  LoopAddOr(pBuild
29e20 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  er, mExtra);.   
29e30 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d   }.    mPrior |=
29e40 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b   pNew->maskSelf;
29e50 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64  .    if( rc || d
29e60 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
29e70 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77  ) break;.  }.  w
29e80 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62  hereLoopClear(db
29e90 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
29ea0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
29eb0 78 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61  xamine a WherePa
29ec0 74 68 20 28 77 69 74 68 20 74 68 65 20 61 64 64  th (with the add
29ed0 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74  ition of the ext
29ee0 72 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20  ra WhereLoop of 
29ef0 74 68 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d  the 5th.** param
29f00 65 74 65 72 73 29 20 74 6f 20 73 65 65 20 69 66  eters) to see if
29f10 20 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73   it outputs rows
29f20 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65   in the requeste
29f30 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f  d ORDER BY.** (o
29f40 72 20 47 52 4f 55 50 20 42 59 29 20 77 69 74 68  r GROUP BY) with
29f50 6f 75 74 20 72 65 71 75 69 72 69 6e 67 20 61 20  out requiring a 
29f60 73 65 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70  separate sort op
29f70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  eration.  Return
29f80 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 30 3a 20 20  :.** .**    0:  
29f90 4f 52 44 45 52 20 42 59 20 69 73 20 6e 6f 74 20  ORDER BY is not 
29fa0 73 61 74 69 73 66 69 65 64 2e 20 20 53 6f 72 74  satisfied.  Sort
29fb0 69 6e 67 20 72 65 71 75 69 72 65 64 0a 2a 2a 20  ing required.** 
29fc0 20 20 20 31 3a 20 20 4f 52 44 45 52 20 42 59 20     1:  ORDER BY 
29fd0 69 73 20 73 61 74 69 73 66 69 65 64 2e 20 20 20  is satisfied.   
29fe0 20 20 20 4f 6d 69 74 20 73 6f 72 74 69 6e 67 0a     Omit sorting.
29ff0 2a 2a 20 20 20 2d 31 3a 20 20 55 6e 6b 6e 6f 77  **   -1:  Unknow
2a000 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 0a 2a  n at this time.*
2a010 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70  *.** Note that p
2a020 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 48  rocessing for WH
2a030 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64 20  ERE_GROUPBY and 
2a040 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
2a050 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74   is not as.** st
2a060 72 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f 55  rict.  With GROU
2a070 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  P BY and DISTINC
2a080 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75 69  T the only requi
2a090 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a 2a  rement is that.*
2a0a0 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77  * equivalent row
2a0b0 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69 61  s appear immedia
2a0c0 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74 6f  tely adjacent to
2a0d0 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20 47   one another.  G
2a0e0 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44  ROUP BY.** and D
2a0f0 49 53 54 49 4e 54 20 64 6f 20 6e 6f 74 20 72 65  ISTINT do not re
2a100 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20 61 70  quire rows to ap
2a110 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61 72 74  pear in any part
2a120 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61 73 20  icular order as 
2a130 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69 76  long.** as equiv
2a140 65 6c 65 6e 74 20 72 6f 77 73 20 61 72 65 20 67  elent rows are g
2a150 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e  rouped together.
2a160 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f 55 50    Thus for GROUP
2a170 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
2a180 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42 79  .** the pOrderBy
2a190 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20 6d 61   terms can be ma
2a1a0 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f 72 64  tched in any ord
2a1b0 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45 52 20  er.  With ORDER 
2a1c0 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64  BY, the .** pOrd
2a1d0 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73 74 20  erBy terms must 
2a1e0 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 73 74  be matched in st
2a1f0 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67  rict left-to-rig
2a200 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ht order..*/.sta
2a210 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74  tic int wherePat
2a220 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
2a230 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  y(.  WhereInfo *
2a240 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68  pWInfo,    /* Th
2a250 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
2a260 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
2a270 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44  rderBy,   /* ORD
2a280 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
2a290 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63 6c  Y or DISTINCT cl
2a2a0 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  ause to check */
2a2b0 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 50  .  WherePath *pP
2a2c0 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ath,     /* The 
2a2d0 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68 65  WherePath to che
2a2e0 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  ck */.  u16 wctr
2a2f0 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a  lFlags,       /*
2a300 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 57   Might contain W
2a310 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72 20  HERE_GROUPBY or 
2a320 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
2a330 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c   */.  u16 nLoop,
2a340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2a350 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
2a360 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70   in pPath->aLoop
2a370 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  [] */.  WhereLoo
2a380 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a  p *pLast,     /*
2a390 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65 4c   Add this WhereL
2a3a0 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  oop to the end o
2a3b0 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d  f pPath->aLoop[]
2a3c0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70   */.  Bitmask *p
2a3d0 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f  RevMask     /* O
2a3e0 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72  UT: Mask of Wher
2a3f0 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e  eLoops to run in
2a400 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
2a410 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74  /.){.  u8 revSet
2a420 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2a430 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20 6b  True if rev is k
2a440 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76  nown */.  u8 rev
2a450 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a460 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72  /* Composite sor
2a470 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
2a480 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20 20  revIdx;         
2a490 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74     /* Index sort
2a4a0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69   order */.  u8 i
2a4b0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20  sOrderDistinct; 
2a4c0 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57    /* All prior W
2a4d0 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72  hereLoops are or
2a4e0 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a  der-distinct */.
2a4f0 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c    u8 distinctCol
2a500 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20  umns;   /* True 
2a510 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20  if the loop has 
2a520 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20  UNIQUE NOT NULL 
2a530 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20  columns */.  u8 
2a540 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20  isMatch;        
2a550 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61     /* iColumn ma
2a560 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20  tches a term of 
2a570 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2a580 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65  use */.  u16 nKe
2a590 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 2f  yCol;          /
2a5a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20  * Number of key 
2a5b0 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65  columns in pInde
2a5c0 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75  x */.  u16 nColu
2a5d0 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn;          /* 
2a5e0 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2a5f0 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73 20  ordered columns 
2a600 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  in the index */.
2a610 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 20    u16 nOrderBy; 
2a620 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2a630 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  r terms in the O
2a640 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
2a650 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20  /.  int iLoop;  
2a660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2a670 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20  ex of WhereLoop 
2a680 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20 70  in pPath being p
2a690 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e  rocessed */.  in
2a6a0 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
2a6b0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2a6c0 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ters */.  int iC
2a6d0 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ur;             
2a6e0 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
2a6f0 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68 65   for current Whe
2a700 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  reLoop */.  int 
2a710 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  iColumn;        
2a720 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75    /* A column nu
2a730 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61 62 6c  mber within tabl
2a740 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65 72  e iCur */.  Wher
2a750 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30  eLoop *pLoop = 0
2a760 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65  ; /* Current Whe
2a770 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f  reLoop being pro
2a780 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65  cessed. */.  Whe
2a790 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
2a7a0 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
2a7b0 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
2a7c0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
2a7d0 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20  r *pOBExpr;     
2a7e0 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73     /* An express
2a7f0 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52 44  ion from the ORD
2a800 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
2a810 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
2a820 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41  ;       /* COLLA
2a830 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d  TE function from
2a840 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
2a850 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e  use term */.  In
2a860 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
2a870 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
2a880 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2a890 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69   pLoop */.  sqli
2a8a0 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f  te3 *db = pWInfo
2a8b0 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  ->pParse->db;  /
2a8c0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
2a8d0 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  ction */.  Bitma
2a8e0 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20 20  sk obSat = 0;   
2a8f0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45   /* Mask of ORDE
2a900 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69 73  R BY terms satis
2a910 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  fied so far */. 
2a920 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b   Bitmask obDone;
2a930 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
2a940 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74  f all ORDER BY t
2a950 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  erms */.  Bitmas
2a960 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d  k orderDistinctM
2a970 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  ask;  /* Mask of
2a980 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65   all well-ordere
2a990 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74  d loops */.  Bit
2a9a0 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20 20  mask ready;     
2a9b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
2a9c0 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20   of inner loops 
2a9d0 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65  */..  /*.  ** We
2a9e0 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f   say the WhereLo
2a9f0 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20  op is "one-row" 
2aa00 69 66 20 69 74 20 67 65 6e 65 72 61 74 65 73 20  if it generates 
2aa10 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
2aa20 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74  .  ** row of out
2aa30 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f  put.  A WhereLoo
2aa40 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20  p is one-row if 
2aa50 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
2aa60 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
2aa70 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e 64   **  (a) All ind
2aa80 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68  ex columns match
2aa90 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c 55   with WHERE_COLU
2aaa0 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29  MN_EQ..  **  (b)
2aab0 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e   The index is un
2aac0 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68  ique.  ** Any Wh
2aad0 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20  ereLoop with an 
2aae0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
2aaf0 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68  constraint on th
2ab00 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72  e rowid is one-r
2ab10 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f  ow..  ** Every o
2ab20 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70  ne-row WhereLoop
2ab30 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20 57   will have the W
2ab40 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20  HERE_ONEROW bit 
2ab50 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a  set in wsFlags..
2ab60 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79    **.  ** We say
2ab70 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69   the WhereLoop i
2ab80 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  s "order-distinc
2ab90 74 22 20 69 66 20 74 68 65 20 73 65 74 20 6f 66  t" if the set of
2aba0 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20   columns from.  
2abb0 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f  ** that WhereLoo
2abc0 70 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68  p that are in th
2abd0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2abe0 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20  e are different 
2abf0 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20 72  for every.  ** r
2ac00 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c  ow of the WhereL
2ac10 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d  oop.  Every one-
2ac20 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  row WhereLoop is
2ac30 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20   automatically. 
2ac40 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   ** order-distin
2ac50 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f 6f  ct.   A WhereLoo
2ac60 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63 6f  p that has no co
2ac70 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52 44  lumns in the ORD
2ac80 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a  ER BY clause.  *
2ac90 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64  * is not order-d
2aca0 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f  istinct. To be o
2acb0 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69 73  rder-distinct is
2acc0 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20 73   not quite the s
2acd0 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20 2a  ame as being.  *
2ace0 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20 61  * UNIQUE since a
2acf0 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f   UNIQUE column o
2ad00 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76 65  r index can have
2ad10 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74   multiple rows t
2ad20 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55  hat .  ** are NU
2ad30 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75  LL and NULL valu
2ad40 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e  es are equivalen
2ad50 74 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73  t for the purpos
2ad60 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74 69  e of order-disti
2ad70 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20  nct..  ** To be 
2ad80 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c 20  order-distinct, 
2ad90 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74  the columns must
2ada0 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20 4e   be UNIQUE and N
2adb0 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20  OT NULL..  **.  
2adc0 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
2add0 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61   a table is alwa
2ade0 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f  ys UNIQUE and NO
2adf0 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76  T NULL so whenev
2ae00 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69  er the.  ** rowi
2ae10 64 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  d appears in the
2ae20 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2ae30 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
2ae40 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  ing WhereLoop is
2ae50 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  .  ** automatica
2ae60 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  lly order-distin
2ae70 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65  ct..  */..  asse
2ae80 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
2ae90 29 3b 0a 0a 20 20 2f 2a 20 53 6f 72 74 61 62 69  );..  /* Sortabi
2aea0 6c 69 74 79 20 6f 66 20 76 69 72 74 75 61 6c 20  lity of virtual 
2aeb0 74 61 62 6c 65 73 20 69 73 20 64 65 74 65 72 6d  tables is determ
2aec0 69 6e 65 64 20 62 79 20 74 68 65 20 78 42 65 73  ined by the xBes
2aed0 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 0a 20 20  tIndex method.  
2aee0 2a 2a 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  ** of the virtua
2aef0 6c 20 74 61 62 6c 65 20 69 74 73 65 6c 66 20 2a  l table itself *
2af00 2f 0a 20 20 69 66 28 20 70 4c 61 73 74 2d 3e 77  /.  if( pLast->w
2af10 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
2af20 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20  IRTUALTABLE ){. 
2af30 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 4c 6f     testcase( nLo
2af40 6f 70 3e 30 20 29 3b 20 20 2f 2a 20 54 72 75 65  op>0 );  /* True
2af50 20 77 68 65 6e 20 6f 75 74 65 72 20 6c 6f 6f 70   when outer loop
2af60 73 20 61 72 65 20 6f 6e 65 2d 72 6f 77 20 61 6e  s are one-row an
2af70 64 20 6d 61 74 63 68 20 0a 20 20 20 20 20 20 20  d match .       
2af80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af90 20 20 20 2a 2a 20 6e 6f 20 4f 52 44 45 52 20 42     ** no ORDER B
2afa0 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 72  Y terms */.    r
2afb0 65 74 75 72 6e 20 70 4c 61 73 74 2d 3e 75 2e 76  eturn pLast->u.v
2afc0 74 61 62 2e 69 73 4f 72 64 65 72 65 64 3b 0a 20  tab.isOrdered;. 
2afd0 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26   }.  if( nLoop &
2afe0 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  & OptimizationDi
2aff0 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
2b000 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e  E_OrderByIdxJoin
2b010 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  ) ) return 0;.. 
2b020 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
2b030 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74  erBy->nExpr;.  t
2b040 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72 42  estcase( nOrderB
2b050 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66  y==BMS-1 );.  if
2b060 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31  ( nOrderBy>BMS-1
2b070 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
2b080 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65   Cannot optimize
2b090 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f 52   overly large OR
2b0a0 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f  DER BYs */.  isO
2b0b0 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31  rderDistinct = 1
2b0c0 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53  ;.  obDone = MAS
2b0d0 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d 31  KBIT(nOrderBy)-1
2b0e0 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63  ;.  orderDistinc
2b0f0 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61  tMask = 0;.  rea
2b100 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c  dy = 0;.  for(iL
2b110 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69  oop=0; isOrderDi
2b120 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c  stinct && obSat<
2b130 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c  obDone && iLoop<
2b140 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  =nLoop; iLoop++)
2b150 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e  {.    if( iLoop>
2b160 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f  0 ) ready |= pLo
2b170 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
2b180 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c    pLoop = iLoop<
2b190 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61  nLoop ? pPath->a
2b1a0 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c  Loop[iLoop] : pL
2b1b0 61 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ast;.    assert(
2b1c0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
2b1d0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
2b1e0 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 20  TABLE)==0 );.   
2b1f0 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e   iCur = pWInfo->
2b200 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f  pTabList->a[pLoo
2b210 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72  p->iTab].iCursor
2b220 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f  ;..    /* Mark o
2b230 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20  ff any ORDER BY 
2b240 74 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61  term X that is a
2b250 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74   column in the t
2b260 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  able of.    ** t
2b270 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20  he current loop 
2b280 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20  for which there 
2b290 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57  is term in the W
2b2a0 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75  HERE.    ** clau
2b2b0 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  se of the form X
2b2c0 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20   IS NULL or X=? 
2b2d0 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f  that reference o
2b2e0 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a  nly outer.    **
2b2f0 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20   loops..    */. 
2b300 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
2b310 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
2b320 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
2b330 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
2b340 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42  tinue;.      pOB
2b350 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
2b360 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
2b370 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2b380 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
2b390 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  OBExpr->op!=TK_C
2b3a0 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65  OLUMN ) continue
2b3b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45  ;.      if( pOBE
2b3c0 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75  xpr->iTable!=iCu
2b3d0 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
2b3e0 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
2b3f0 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57  Term(&pWInfo->sW
2b400 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72  C, iCur, pOBExpr
2b410 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->iColumn,.     
2b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b430 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c    ~ready, WO_EQ|
2b440 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20  WO_ISNULL, 0);. 
2b450 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
2b460 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2b470 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
2b480 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29  eOperator&WO_EQ)
2b490 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e  !=0 && pOBExpr->
2b4a0 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
2b4b0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2b4c0 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20   *z1, *z2;.     
2b4d0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2b4e0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
2b4f0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f  Info->pParse, pO
2b500 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2b510 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
2b520 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
2b530 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
2b540 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43  .        z1 = pC
2b550 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
2b560 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
2b570 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2b580 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
2b590 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Term->pExpr);.  
2b5a0 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
2b5b0 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
2b5c0 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
2b5d0 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e    z2 = pColl->zN
2b5e0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
2b5f0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2b600 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e  z1, z2)!=0 ) con
2b610 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
2b620 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
2b630 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a  SKBIT(i);.    }.
2b640 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
2b650 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2b660 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20  _ONEROW)==0 ){. 
2b670 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
2b680 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2b690 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  IPK ){.        p
2b6a0 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
2b6b0 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a     nKeyCol = 0;.
2b6c0 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20          nColumn 
2b6d0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
2b6e0 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70   if( (pIndex = p
2b6f0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
2b700 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64  ndex)==0 || pInd
2b710 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
2b720 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2b730 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
2b740 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c  .        nKeyCol
2b750 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43   = pIndex->nKeyC
2b760 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  ol;.        nCol
2b770 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43  umn = pIndex->nC
2b780 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61  olumn;.        a
2b790 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
2b7a0 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61  nKeyCol+1 || !Ha
2b7b0 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70  sRowid(pIndex->p
2b7c0 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20  Table) );.      
2b7d0 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
2b7e0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75  ->aiColumn[nColu
2b7f0 6d 6e 2d 31 5d 3d 3d 28 2d 31 29 20 7c 7c 20 21  mn-1]==(-1) || !
2b800 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d  HasRowid(pIndex-
2b810 3e 70 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20  >pTable));.     
2b820 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
2b830 63 74 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  ct = pIndex->onE
2b840 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20  rror!=OE_None;. 
2b850 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2b860 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
2b870 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  l columns of the
2b880 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20   index and deal 
2b890 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20  with the ones.  
2b8a0 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20      ** that are 
2b8b0 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20  not constrained 
2b8c0 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20  by == or IN..   
2b8d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20     */.      rev 
2b8e0 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20  = revSet = 0;.  
2b8f0 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75      distinctColu
2b900 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  mns = 0;.      f
2b910 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d  or(j=0; j<nColum
2b920 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
2b930 20 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20   u8 bOnce;   /* 
2b940 54 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20  True to run the 
2b950 4f 52 44 45 52 20 42 59 20 73 65 61 72 63 68 20  ORDER BY search 
2b960 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20  loop */..       
2b970 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d   /* Skip over ==
2b980 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65 72   and IS NULL ter
2b990 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ms */.        if
2b9a0 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ( j<pLoop->u.btr
2b9b0 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20  ee.nEq.         
2b9c0 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  && pLoop->u.btre
2b9d0 65 2e 6e 53 6b 69 70 3d 3d 30 0a 20 20 20 20 20  e.nSkip==0.     
2b9e0 20 20 20 20 26 26 20 28 28 69 20 3d 20 70 4c 6f      && ((i = pLo
2b9f0 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65  op->aLTerm[j]->e
2ba00 4f 70 65 72 61 74 6f 72 29 20 26 20 28 57 4f 5f  Operator) & (WO_
2ba10 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d  EQ|WO_ISNULL))!=
2ba20 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
2ba30 20 20 20 20 20 20 20 69 66 28 20 69 20 26 20 57         if( i & W
2ba40 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
2ba50 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2ba60 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
2ba70 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t );.           
2ba80 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2ba90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2baa0 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  }.          cont
2bab0 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20  inue;  .        
2bac0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65  }..        /* Ge
2bad0 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d  t the column num
2bae0 62 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ber in the table
2baf0 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73   (iColumn) and s
2bb00 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ort order.      
2bb10 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f    ** (revIdx) fo
2bb20 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d  r the j-th colum
2bb30 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a  n of the index..
2bb40 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2bb50 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b     if( pIndex ){
2bb60 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75  .          iColu
2bb70 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43  mn = pIndex->aiC
2bb80 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20  olumn[j];.      
2bb90 20 20 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e      revIdx = pIn
2bba0 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
2bbb0 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  j];.          if
2bbc0 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65  ( iColumn==pInde
2bbd0 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79  x->pTable->iPKey
2bbe0 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b   ) iColumn = -1;
2bbf0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2bc00 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d            iColum
2bc10 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
2bc20 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20    revIdx = 0;.  
2bc30 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2bc40 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61   /* An unconstra
2bc50 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74  ined column that
2bc60 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d   might be NULL m
2bc70 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20  eans that this. 
2bc80 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c         ** WhereL
2bc90 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d  oop is not well-
2bca0 6f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20  ordered.        
2bcb0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
2bcc0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a 20  sOrderDistinct. 
2bcd0 20 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c 75          && iColu
2bce0 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26  mn>=0.         &
2bcf0 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74  & j>=pLoop->u.bt
2bd00 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20  ree.nEq.        
2bd10 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61 62   && pIndex->pTab
2bd20 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e  le->aCol[iColumn
2bd30 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20  ].notNull==0.   
2bd40 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2bd50 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2bd60 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
2bd70 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e  ..        /* Fin
2bd80 64 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  d the ORDER BY t
2bd90 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73 70  erm that corresp
2bda0 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74 68  onds to the j-th
2bdb0 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20   column.        
2bdc0 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ** of the index 
2bdd0 61 6e 64 20 61 6e 64 20 6d 61 72 6b 20 74 68 61  and and mark tha
2bde0 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  t ORDER BY term 
2bdf0 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  off .        */.
2be00 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20          bOnce = 
2be10 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74  1;.        isMat
2be20 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
2be30 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26  for(i=0; bOnce &
2be40 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  & i<nOrderBy; i+
2be50 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
2be60 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
2be70 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
2be80 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45 78  .          pOBEx
2be90 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
2bea0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64  SkipCollate(pOrd
2beb0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2bec0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
2bed0 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67  tcase( wctrlFlag
2bee0 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42  s & WHERE_GROUPB
2bef0 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  Y );.          t
2bf00 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c  estcase( wctrlFl
2bf10 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
2bf20 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20 20  INCTBY );.      
2bf30 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
2bf40 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52 4f  ags & (WHERE_GRO
2bf50 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54 49  UPBY|WHERE_DISTI
2bf60 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e  NCTBY))==0 ) bOn
2bf70 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ce = 0;.        
2bf80 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f    if( pOBExpr->o
2bf90 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63  p!=TK_COLUMN ) c
2bfa0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2bfb0 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
2bfc0 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63  iTable!=iCur ) c
2bfd0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2bfe0 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
2bff0 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  iColumn!=iColumn
2c000 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2c010 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
2c020 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mn>=0 ){.       
2c030 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
2c040 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2c050 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
2c060 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2c070 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
2c080 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
2c090 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
2c0a0 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  tColl;.         
2c0b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
2c0c0 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
2c0d0 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  me, pIndex->azCo
2c0e0 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74  ll[j])!=0 ) cont
2c0f0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2c100 7d 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d 61  }.          isMa
2c110 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  tch = 1;.       
2c120 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2c130 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2c140 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  isMatch ){.     
2c150 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
2c160 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
2c170 20 20 74 65 73 74 63 61 73 65 28 20 64 69 73 74    testcase( dist
2c180 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29  inctColumns==0 )
2c190 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69  ;.            di
2c1a0 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20  stinctColumns = 
2c1b0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
2c1c0 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c           obSat |
2c1d0 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  = MASKBIT(i);.  
2c1e0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 49          if( (pWI
2c1f0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2c200 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 29  & WHERE_GROUPBY)
2c210 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2c220 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
2c230 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 69  the sort order i
2c240 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20  s compatible in 
2c250 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
2c260 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  se..            
2c270 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69 73  ** Sort order is
2c280 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20   irrelevant for 
2c290 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
2c2a0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
2c2b0 20 20 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a    if( revSet ){.
2c2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2c2d0 28 20 28 72 65 76 20 5e 20 72 65 76 49 64 78 29  ( (rev ^ revIdx)
2c2e0 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  !=pOrderBy->a[i]
2c2f0 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74  .sortOrder ) ret
2c300 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20  urn 0;.         
2c310 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c320 20 20 20 20 20 20 20 20 72 65 76 20 3d 20 72 65          rev = re
2c330 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d  vIdx ^ pOrderBy-
2c340 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
2c350 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2c360 66 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61  f( rev ) *pRevMa
2c370 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c  sk |= MASKBIT(iL
2c380 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oop);.          
2c390 20 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a      revSet = 1;.
2c3a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2c3b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c3c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c3d0 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66     /* No match f
2c3e0 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
2c3f0 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c    if( j==0 || j<
2c400 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20  nKeyCol ){.     
2c410 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2c420 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2c430 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
2c440 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
2c450 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
2c460 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
2c470 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
2c480 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f       } /* end Lo
2c490 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65  op over all inde
2c4a0 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  x columns */.   
2c4b0 20 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 43     if( distinctC
2c4c0 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20  olumns ){.      
2c4d0 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
2c4e0 64 65 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29  derDistinct==0 )
2c4f0 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65  ;.        isOrde
2c500 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20  rDistinct = 1;. 
2c510 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20       }.    } /* 
2c520 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72  end-if not one-r
2c530 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61  ow */..    /* Ma
2c540 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72  rk off any other
2c550 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
2c560 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 70  that reference p
2c570 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20  Loop */.    if( 
2c580 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2c590 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69  ){.      orderDi
2c5a0 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c  stinctMask |= pL
2c5b0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
2c5c0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2c5d0 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
2c5e0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b          Expr *p;
2c5f0 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
2c600 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   mTerm;.        
2c610 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26  if( MASKBIT(i) &
2c620 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75   obSat ) continu
2c630 65 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70  e;.        p = p
2c640 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2c650 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6d 54 65  xpr;.        mTe
2c660 72 6d 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  rm = exprTableUs
2c670 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  age(&pWInfo->sMa
2c680 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20 20 20  skSet,p);.      
2c690 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20 26    if( mTerm==0 &
2c6a0 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  & !sqlite3ExprIs
2c6b0 43 6f 6e 73 74 61 6e 74 28 70 29 20 29 20 63 6f  Constant(p) ) co
2c6c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2c6d0 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64 65  if( (mTerm&~orde
2c6e0 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d  rDistinctMask)==
2c6f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  0 ){.          o
2c700 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
2c710 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
2c720 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
2c730 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20  /* End the loop 
2c740 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f  over all WhereLo
2c750 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d  ops from outer-m
2c760 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65  ost down to inne
2c770 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20  r-most */.  if( 
2c780 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20  obSat==obDone ) 
2c790 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
2c7a0 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74  !isOrderDistinct
2c7b0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
2c7c0 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 23 69 66  eturn -1;.}..#if
2c7d0 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
2c7e0 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65  NABLED./* For de
2c7f0 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79  bugging use only
2c800 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  : */.static cons
2c810 74 20 63 68 61 72 20 2a 77 68 65 72 65 50 61 74  t char *wherePat
2c820 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68 20  hName(WherePath 
2c830 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f  *pPath, int nLoo
2c840 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  p, WhereLoop *pL
2c850 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ast){.  static c
2c860 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20  har zName[65];. 
2c870 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
2c880 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29  0; i<nLoop; i++)
2c890 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61  { zName[i] = pPa
2c8a0 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49  th->aLoop[i]->cI
2c8b0 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74  d; }.  if( pLast
2c8c0 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20   ) zName[i++] = 
2c8d0 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e  pLast->cId;.  zN
2c8e0 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65  ame[i] = 0;.  re
2c8f0 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65  turn zName;.}.#e
2c900 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ndif.../*.** Giv
2c910 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57  en the list of W
2c920 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
2c930 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f   at pWInfo->pLoo
2c940 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ps, this routine
2c950 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
2c960 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20  find the lowest 
2c970 63 6f 73 74 20 70 61 74 68 20 74 68 61 74 20 76  cost path that v
2c980 69 73 69 74 73 20 65 61 63 68 20 57 68 65 72 65  isits each Where
2c990 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54  Loop.** once.  T
2c9a0 68 69 73 20 70 61 74 68 20 69 73 20 74 68 65 6e  his path is then
2c9b0 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65   loaded into the
2c9c0 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c   pWInfo->a[].pWL
2c9d0 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a  oop fields..**.*
2c9e0 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20 74 68  * Assume that th
2c9f0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
2ca00 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68  f output rows th
2ca10 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  at will need to 
2ca20 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c  be sorted.** wil
2ca30 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e  l be nRowEst (in
2ca40 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70   the 10*log2 rep
2ca50 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f  resentation).  O
2ca60 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e  r, ignore sortin
2ca70 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52  g.** costs if nR
2ca80 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  owEst==0..**.** 
2ca90 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2caa0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53   on success or S
2cab0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61  QLITE_NOMEM of a
2cac0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2cad0 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  on.** error occu
2cae0 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
2caf0 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65  t wherePathSolve
2cb00 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  r(WhereInfo *pWI
2cb10 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77  nfo, LogEst nRow
2cb20 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68  Est){.  int mxCh
2cb30 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  oice;           
2cb40 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
2cb50 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65  ber of simultane
2cb60 6f 75 73 20 70 61 74 68 73 20 74 72 61 63 6b 65  ous paths tracke
2cb70 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70  d */.  int nLoop
2cb80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cb90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
2cba0 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20  rms in the join 
2cbb0 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
2cbc0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  se;            /
2cbd0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
2cbe0 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
2cbf0 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
2cc00 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
2cc10 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
2cc20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20   int iLoop;     
2cc30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2cc40 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20  op counter over 
2cc50 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
2cc60 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69   join */.  int i
2cc70 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20  i, jj;          
2cc80 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2cc90 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d  nters */.  int m
2cca0 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  xI = 0;         
2ccb0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2ccc0 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20 72   next entry to r
2ccd0 65 70 6c 61 63 65 20 2a 2f 0a 20 20 4c 6f 67 45  eplace */.  LogE
2cce0 73 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20  st rCost;       
2ccf0 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66        /* Cost of
2cd00 20 61 20 70 61 74 68 20 2a 2f 0a 20 20 4c 6f 67   a path */.  Log
2cd10 45 73 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20  Est nOut;       
2cd20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2cd30 20 6f 66 20 6f 75 74 70 75 74 73 20 2a 2f 0a 20   of outputs */. 
2cd40 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74 20 3d   LogEst mxCost =
2cd50 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   0;        /* Ma
2cd60 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20  ximum cost of a 
2cd70 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a  set of paths */.
2cd80 20 20 4c 6f 67 45 73 74 20 6d 78 4f 75 74 20 3d    LogEst mxOut =
2cd90 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d   0;         /* M
2cda0 61 78 69 6d 75 6d 20 6e 4f 75 74 20 76 61 6c 75  aximum nOut valu
2cdb0 65 20 6f 6e 20 74 68 65 20 73 65 74 20 6f 66 20  e on the set of 
2cdc0 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73  paths */.  LogEs
2cdd0 74 20 72 53 6f 72 74 43 6f 73 74 3b 20 20 20 20  t rSortCost;    
2cde0 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 74 6f 20       /* Cost to 
2cdf0 64 6f 20 61 20 73 6f 72 74 20 2a 2f 0a 20 20 69  do a sort */.  i
2ce00 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20  nt nTo, nFrom;  
2ce10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2ce20 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72  er of valid entr
2ce30 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64  ies in aTo[] and
2ce40 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68   aFrom[] */.  Wh
2ce50 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20  erePath *aFrom; 
2ce60 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e          /* All n
2ce70 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68  From paths at th
2ce80 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c  e previous level
2ce90 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
2cea0 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20  *aTo;           
2ceb0 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20  /* The nTo best 
2cec0 70 61 74 68 73 20 61 74 20 74 68 65 20 63 75 72  paths at the cur
2ced0 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  rent level */.  
2cee0 57 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d  WherePath *pFrom
2cef0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ;         /* An 
2cf00 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d  element of aFrom
2cf10 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
2cf20 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
2cf30 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20  herePath *pTo;  
2cf40 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
2cf50 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20  lement of aTo[] 
2cf60 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b  that we are work
2cf70 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ing on */.  Wher
2cf80 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20  eLoop *pWLoop;  
2cf90 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
2cfa0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
2cfb0 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65  jects */.  Where
2cfc0 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20  Loop **pX;      
2cfd0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
2cfe0 64 69 76 79 20 75 70 20 74 68 65 20 70 53 70 61  divy up the pSpa
2cff0 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 63  ce memory */.  c
2d000 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20  har *pSpace;    
2d010 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
2d020 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65  orary memory use
2d030 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
2d040 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d  e */..  pParse =
2d050 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
2d060 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
2d070 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57  db;.  nLoop = pW
2d080 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20  Info->nLevel;.  
2d090 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73  /* TUNING: For s
2d0a0 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f  imple queries, o
2d0b0 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70 61 74  nly the best pat
2d0c0 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20  h is tracked..  
2d0d0 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69  ** For 2-way joi
2d0e0 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74 20 70  ns, the 5 best p
2d0f0 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65  aths are followe
2d100 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e  d..  ** For join
2d110 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74  s of 3 or more t
2d120 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65  ables, track the
2d130 20 31 30 20 62 65 73 74 20 70 61 74 68 73 20 2a   10 best paths *
2d140 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28  /.  mxChoice = (
2d150 6e 4c 6f 6f 70 3d 3d 31 29 20 3f 20 31 20 3a 20  nLoop==1) ? 1 : 
2d160 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20  (nLoop==2 ? 5 : 
2d170 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  10);.  assert( n
2d180 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54  Loop<=pWInfo->pT
2d190 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
2d1a0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30    WHERETRACE(0x0
2d1b0 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e  02, ("---- begin
2d1c0 20 73 6f 6c 76 65 72 5c 6e 22 29 29 3b 0a 0a 20   solver\n"));.. 
2d1d0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
2d1e0 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63   initialize spac
2d1f0 65 20 66 6f 72 20 61 54 6f 20 61 6e 64 20 61 46  e for aTo and aF
2d200 72 6f 6d 20 2a 2f 0a 20 20 69 69 20 3d 20 28 73  rom */.  ii = (s
2d210 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68 29  izeof(WherePath)
2d220 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f  +sizeof(WhereLoo
2d230 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f  p*)*nLoop)*mxCho
2d240 69 63 65 2a 32 3b 0a 20 20 70 53 70 61 63 65 20  ice*2;.  pSpace 
2d250 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2d260 63 52 61 77 28 64 62 2c 20 69 69 29 3b 0a 20 20  cRaw(db, ii);.  
2d270 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20  if( pSpace==0 ) 
2d280 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2d290 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68  MEM;.  aTo = (Wh
2d2a0 65 72 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b  erePath*)pSpace;
2d2b0 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d  .  aFrom = aTo+m
2d2c0 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65  xChoice;.  memse
2d2d0 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65  t(aFrom, 0, size
2d2e0 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20  of(aFrom[0]));. 
2d2f0 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70   pX = (WhereLoop
2d300 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69  **)(aFrom+mxChoi
2d310 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78  ce);.  for(ii=mx
2d320 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d  Choice*2, pFrom=
2d330 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c  aTo; ii>0; ii--,
2d340 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20   pFrom++, pX += 
2d350 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f  nLoop){.    pFro
2d360 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20  m->aLoop = pX;. 
2d370 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68   }..  /* Seed th
2d380 65 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20  e search with a 
2d390 73 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68  single WherePath
2d3a0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f   containing zero
2d3b0 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a   WhereLoops..  *
2d3c0 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44  *.  ** TUNING: D
2d3d0 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75  o not let the nu
2d3e0 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f  mber of iteratio
2d3f0 6e 73 20 67 6f 20 61 62 6f 76 65 20 32 35 2e 20  ns go above 25. 
2d400 20 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a   If the cost.  *
2d410 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61  * of computing a
2d420 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
2d430 78 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61  x is not paid ba
2d440 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  ck within the fi
2d450 72 73 74 20 32 35 0a 20 20 2a 2a 20 72 6f 77 73  rst 25.  ** rows
2d460 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73  , then do not us
2d470 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
2d480 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f  index. */.  aFro
2d490 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28  m[0].nRow = MIN(
2d4a0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
2d4b0 6f 70 2c 20 34 36 29 3b 20 20 61 73 73 65 72 74  op, 46);  assert
2d4c0 28 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 46==sqlite3Log
2d4d0 45 73 74 28 32 35 29 20 29 3b 0a 20 20 6e 46 72  Est(25) );.  nFr
2d4e0 6f 6d 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 50 72  om = 1;..  /* Pr
2d4f0 65 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 73  ecompute the cos
2d500 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65  t of sorting the
2d510 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 73 65   final result se
2d520 74 2c 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72  t, if the caller
2d530 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  .  ** to sqlite3
2d540 57 68 65 72 65 42 65 67 69 6e 28 29 20 77 61 73  WhereBegin() was
2d550 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
2d560 20 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 72 53   sorting */.  rS
2d570 6f 72 74 43 6f 73 74 20 3d 20 30 3b 0a 20 20 69  ortCost = 0;.  i
2d580 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
2d590 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73  rBy==0 || nRowEs
2d5a0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 46 72 6f  t==0 ){.    aFro
2d5b0 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 56 61  m[0].isOrderedVa
2d5c0 6c 69 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  lid = 1;.  }else
2d5d0 7b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  {.    /* TUNING:
2d5e0 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20   Estimated cost 
2d5f0 6f 66 20 73 6f 72 74 69 6e 67 20 69 73 20 34 38  of sorting is 48
2d600 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65  *N*log2(N) where
2d610 20 4e 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a   N is the.    **
2d620 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
2d630 74 20 72 6f 77 73 2e 20 54 68 65 20 34 38 20 69  t rows. The 48 i
2d640 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 73  s the expected s
2d650 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 74 6f 20  ize of a row to 
2d660 73 6f 72 74 2e 20 0a 20 20 20 20 2a 2a 20 46 49  sort. .    ** FI
2d670 58 4d 45 3a 20 20 63 6f 6d 70 75 74 65 20 61 20  XME:  compute a 
2d680 62 65 74 74 65 72 20 65 73 74 69 6d 61 74 65 20  better estimate 
2d690 6f 66 20 74 68 65 20 34 38 20 6d 75 6c 74 69 70  of the 48 multip
2d6a0 6c 69 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68  lier based on th
2d6b0 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20  e.    ** result 
2d6c0 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  set expressions.
2d6d0 20 2a 2f 0a 20 20 20 20 72 53 6f 72 74 43 6f 73   */.    rSortCos
2d6e0 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 65 73  t = nRowEst + es
2d6f0 74 4c 6f 67 28 6e 52 6f 77 45 73 74 29 3b 0a 20  tLog(nRowEst);. 
2d700 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
2d710 30 30 32 2c 28 22 2d 2d 2d 2d 20 73 6f 72 74 20  002,("---- sort 
2d720 63 6f 73 74 3d 25 2d 33 64 5c 6e 22 2c 20 72 53  cost=%-3d\n", rS
2d730 6f 72 74 43 6f 73 74 29 29 3b 0a 20 20 7d 0a 0a  ortCost));.  }..
2d740 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75 63    /* Compute suc
2d750 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72  cessively longer
2d760 20 57 68 65 72 65 50 61 74 68 73 20 75 73 69 6e   WherePaths usin
2d770 67 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 67  g the previous g
2d780 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f  eneration.  ** o
2d790 66 20 57 68 65 72 65 50 61 74 68 73 20 61 73 20  f WherePaths as 
2d7a0 74 68 65 20 62 61 73 69 73 20 66 6f 72 20 74 68  the basis for th
2d7b0 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20 74 72  e next.  Keep tr
2d7c0 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43 68 6f  ack of the mxCho
2d7d0 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20 70 61  ice.  ** best pa
2d7e0 74 68 73 20 61 74 20 65 61 63 68 20 67 65 6e 65  ths at each gene
2d7f0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28  ration */.  for(
2d800 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e  iLoop=0; iLoop<n
2d810 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
2d820 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20      nTo = 0;.   
2d830 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d   for(ii=0, pFrom
2d840 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d  =aFrom; ii<nFrom
2d850 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  ; ii++, pFrom++)
2d860 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57 4c 6f  {.      for(pWLo
2d870 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  op=pWInfo->pLoop
2d880 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f  s; pWLoop; pWLoo
2d890 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c  p=pWLoop->pNextL
2d8a0 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20 42 69  oop){.        Bi
2d8b0 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 0a 20  tmask maskNew;. 
2d8c0 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72         Bitmask r
2d8d0 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  evMask = 0;.    
2d8e0 20 20 20 20 75 38 20 69 73 4f 72 64 65 72 65 64      u8 isOrdered
2d8f0 56 61 6c 69 64 20 3d 20 70 46 72 6f 6d 2d 3e 69  Valid = pFrom->i
2d900 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b 0a 20  sOrderedValid;. 
2d910 20 20 20 20 20 20 20 75 38 20 69 73 4f 72 64 65         u8 isOrde
2d920 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f  red = pFrom->isO
2d930 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20  rdered;.        
2d940 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65  if( (pWLoop->pre
2d950 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61  req & ~pFrom->ma
2d960 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
2d970 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
2d980 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  f( (pWLoop->mask
2d990 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61  Self & pFrom->ma
2d9a0 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
2d9b0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 2f  tinue;.        /
2d9c0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
2d9d0 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e   pWLoop is a can
2d9e0 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 68 65  didate to be the
2d9f0 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20   next loop. .   
2da00 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20       ** Compute 
2da10 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20  its cost */.    
2da20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69      rCost = sqli
2da30 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 57 4c  te3LogEstAdd(pWL
2da40 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f  oop->rSetup,pWLo
2da50 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d  op->rRun + pFrom
2da60 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 20  ->nRow);.       
2da70 20 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33   rCost = sqlite3
2da80 4c 6f 67 45 73 74 41 64 64 28 72 43 6f 73 74 2c  LogEstAdd(rCost,
2da90 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 29 3b 0a   pFrom->rCost);.
2daa0 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 70          nOut = p
2dab0 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c  From->nRow + pWL
2dac0 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20  oop->nOut;.     
2dad0 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72     maskNew = pFr
2dae0 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70  om->maskLoop | p
2daf0 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  WLoop->maskSelf;
2db00 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73  .        if( !is
2db10 4f 72 64 65 72 65 64 56 61 6c 69 64 20 29 7b 0a  OrderedValid ){.
2db20 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68            switch
2db30 28 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  ( wherePathSatis
2db40 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e  fiesOrderBy(pWIn
2db50 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo,.            
2db60 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
2db70 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72  o->pOrderBy, pFr
2db80 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  om, pWInfo->wctr
2db90 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20  lFlags,.        
2dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2dbb0 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72  Loop, pWLoop, &r
2dbc0 65 76 4d 61 73 6b 29 20 29 7b 0a 20 20 20 20 20  evMask) ){.     
2dbd0 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 20         case 1:  
2dbe0 2f 2a 20 59 65 73 2e 20 20 70 46 72 6f 6d 2b 70  /* Yes.  pFrom+p
2dbf0 57 4c 6f 6f 70 20 64 6f 65 73 20 73 61 74 69 73  WLoop does satis
2dc00 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  fy the ORDER BY 
2dc10 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
2dc20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
2dc30 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  d = 1;.         
2dc40 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61       isOrderedVa
2dc50 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  lid = 1;.       
2dc60 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2dc70 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 30            case 0
2dc80 3a 20 20 2f 2a 20 4e 6f 2e 20 20 70 46 72 6f 6d  :  /* No.  pFrom
2dc90 2b 70 57 4c 6f 6f 70 20 77 69 6c 6c 20 72 65 71  +pWLoop will req
2dca0 75 69 72 65 20 61 20 73 65 70 61 72 61 74 65 20  uire a separate 
2dcb0 73 6f 72 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  sort */.        
2dcc0 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 20        isOrdered 
2dcd0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
2dce0 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69     isOrderedVali
2dcf0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  d = 1;.         
2dd00 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c       rCost = sql
2dd10 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 43  ite3LogEstAdd(rC
2dd20 6f 73 74 2c 20 72 53 6f 72 74 43 6f 73 74 29 3b  ost, rSortCost);
2dd30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
2dd40 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2dd50 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20 43 61    default: /* Ca
2dd60 6e 6e 6f 74 20 74 65 6c 6c 20 79 65 74 2e 20 20  nnot tell yet.  
2dd70 54 72 79 20 61 67 61 69 6e 20 6f 6e 20 74 68 65  Try again on the
2dd80 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
2dd90 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
2dda0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2ddb0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
2ddc0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76  e{.          rev
2ddd0 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65  Mask = pFrom->re
2dde0 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d  vLoop;.        }
2ddf0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
2de00 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f  k to see if pWLo
2de10 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64  op should be add
2de20 65 64 20 74 6f 20 74 68 65 20 6d 78 43 68 6f 69  ed to the mxChoi
2de30 63 65 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a  ce best so far *
2de40 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a  /.        for(jj
2de50 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c  =0, pTo=aTo; jj<
2de60 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b  nTo; jj++, pTo++
2de70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2de80 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d   pTo->maskLoop==
2de90 6d 61 73 6b 4e 65 77 0a 20 20 20 20 20 20 20 20  maskNew.        
2dea0 20 20 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64     && pTo->isOrd
2deb0 65 72 65 64 56 61 6c 69 64 3d 3d 69 73 4f 72 64  eredValid==isOrd
2dec0 65 72 65 64 56 61 6c 69 64 0a 20 20 20 20 20 20  eredValid.      
2ded0 20 20 20 20 20 26 26 20 28 28 70 54 6f 2d 3e 72       && ((pTo->r
2dee0 43 6f 73 74 3c 3d 72 43 6f 73 74 20 26 26 20 70  Cost<=rCost && p
2def0 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20  To->nRow<=nOut) 
2df00 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
2df10 20 20 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3e 3d     (pTo->rCost>=
2df20 72 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52  rCost && pTo->nR
2df30 6f 77 3e 3d 6e 4f 75 74 29 29 0a 20 20 20 20 20  ow>=nOut)).     
2df40 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2df50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 6a      testcase( jj
2df60 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20  ==nTo-1 );.     
2df70 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2df80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2df90 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2dfa0 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20  jj>=nTo ){.     
2dfb0 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78       if( nTo>=mx
2dfc0 43 68 6f 69 63 65 20 26 26 20 72 43 6f 73 74 3e  Choice && rCost>
2dfd0 3d 6d 78 43 6f 73 74 20 29 7b 0a 23 69 66 64 65  =mxCost ){.#ifde
2dfe0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
2dff0 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20  BLED /* 0x4 */. 
2e000 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
2e010 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
2e020 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
2e030 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2e040 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70 20 20  ugPrintf("Skip  
2e050 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
2e060 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
2e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e080 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
2e090 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
2e0a0 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
2e0b0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2e0c0 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61       isOrderedVa
2e0d0 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64  lid ? (isOrdered
2e0e0 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20   ? 'Y' : 'N') : 
2e0f0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
2e100 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2e110 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2e120 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2e130 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20         /* Add a 
2e140 6e 65 77 20 50 61 74 68 20 74 6f 20 74 68 65 20  new Path to the 
2e150 61 54 6f 5b 5d 20 73 65 74 20 2a 2f 0a 20 20 20  aTo[] set */.   
2e160 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d         if( nTo<m
2e170 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20  xChoice ){.     
2e180 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61         /* Increa
2e190 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
2e1a0 68 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f 6e  he aTo set by on
2e1b0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
2e1c0 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20   jj = nTo++;.   
2e1d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2e1e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
2e1f0 20 70 61 74 68 20 72 65 70 6c 61 63 65 73 20 74   path replaces t
2e200 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20 74  he prior worst t
2e210 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65 6c  o keep count bel
2e220 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20  ow mxChoice */. 
2e230 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20             jj = 
2e240 6d 78 49 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  mxI;.          }
2e250 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f 20 3d  .          pTo =
2e260 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65   &aTo[jj];.#ifde
2e270 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
2e280 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20  BLED /* 0x4 */. 
2e290 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2e2a0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
2e2b0 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
2e2c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2e2d0 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73 20  intf("New    %s 
2e2e0 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
2e2f0 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
2e300 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
2e310 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
2e320 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
2e330 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20  rCost, nOut,.   
2e340 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
2e350 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69  rderedValid ? (i
2e360 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a  sOrdered ? 'Y' :
2e370 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20   'N') : '?');.  
2e380 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
2e390 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2e3a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
2e3b0 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73 74 20  o->rCost<=rCost 
2e3c0 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f  && pTo->nRow<=nO
2e3d0 75 74 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45  ut ){.#ifdef WHE
2e3e0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
2e3f0 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
2e400 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2e410 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
2e420 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2e430 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2e440 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
2e450 20 20 20 20 20 20 20 22 53 6b 69 70 20 20 20 25         "Skip   %
2e460 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
2e470 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
2e480 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
2e490 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
2e4a0 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
2e4b0 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
2e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e4d0 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20   isOrderedValid 
2e4e0 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27  ? (isOrdered ? '
2e4f0 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29  Y' : 'N') : '?')
2e500 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2e510 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2e520 74 66 28 22 20 20 20 76 73 20 25 73 20 63 6f 73  tf("   vs %s cos
2e530 74 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65 72 3d  t=%-3d,%d order=
2e540 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
2e550 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
2e560 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f  thName(pTo, iLoo
2e570 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43  p+1, 0), pTo->rC
2e580 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a  ost, pTo->nRow,.
2e590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e5a0 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
2e5b0 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73  Valid ? (pTo->is
2e5c0 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
2e5d0 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
2e5e0 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
2e5f0 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  f.            te
2e600 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f  stcase( pTo->rCo
2e610 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20  st==rCost );.   
2e620 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2e630 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2e640 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2e650 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  e( pTo->rCost==r
2e660 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20  Cost+1 );.      
2e670 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 61 6e 64      /* A new and
2e680 20 62 65 74 74 65 72 20 73 63 6f 72 65 20 66 6f   better score fo
2e690 72 20 61 20 70 72 65 76 69 6f 75 73 6c 79 20 63  r a previously c
2e6a0 72 65 61 74 65 64 20 65 71 75 69 76 61 6c 65 6e  reated equivalen
2e6b0 74 20 70 61 74 68 20 2a 2f 0a 23 69 66 64 65 66  t path */.#ifdef
2e6c0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
2e6d0 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20  LED /* 0x4 */.  
2e6e0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2e6f0 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
2e700 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
2e710 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2e720 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
2e730 20 20 20 20 20 22 55 70 64 61 74 65 20 25 73 20       "Update %s 
2e740 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
2e750 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
2e760 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
2e770 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
2e780 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
2e790 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20  ost, nOut,.     
2e7a0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
2e7b0 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f  eredValid ? (isO
2e7c0 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27  rdered ? 'Y' : '
2e7d0 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  N') : '?');.    
2e7e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2e7f0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 77 61  ebugPrintf("  wa
2e800 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25  s %s cost=%-3d,%
2e810 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
2e820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e830 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54  wherePathName(pT
2e840 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20  o, iLoop+1, 0), 
2e850 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d  pTo->rCost, pTo-
2e860 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  >nRow,.         
2e870 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
2e880 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54  deredValid ? (pT
2e890 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27  o->isOrdered ? '
2e8a0 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29  Y' : 'N') : '?')
2e8b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
2e8c0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20  ndif.        }. 
2e8d0 20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70         /* pWLoop
2e8e0 20 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41   is a winner.  A
2e8f0 64 64 20 69 74 20 74 6f 20 74 68 65 20 73 65 74  dd it to the set
2e900 20 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72 20   of best so far 
2e910 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  */.        pTo->
2e920 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d  maskLoop = pFrom
2e930 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c  ->maskLoop | pWL
2e940 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
2e950 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c         pTo->revL
2e960 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20  oop = revMask;. 
2e970 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77         pTo->nRow
2e980 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20   = nOut;.       
2e990 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43   pTo->rCost = rC
2e9a0 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ost;.        pTo
2e9b0 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
2e9c0 20 3d 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69   = isOrderedVali
2e9d0 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  d;.        pTo->
2e9e0 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72  isOrdered = isOr
2e9f0 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d  dered;.        m
2ea00 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70  emcpy(pTo->aLoop
2ea10 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20  , pFrom->aLoop, 
2ea20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
2ea30 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  *)*iLoop);.     
2ea40 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c     pTo->aLoop[iL
2ea50 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20  oop] = pWLoop;. 
2ea60 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
2ea70 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
2ea80 20 20 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20        mxI = 0;. 
2ea90 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
2eaa0 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a  = aTo[0].rCost;.
2eab0 20 20 20 20 20 20 20 20 20 20 6d 78 4f 75 74 20            mxOut 
2eac0 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20  = aTo[0].nRow;. 
2ead0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d           for(jj=
2eae0 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20  1, pTo=&aTo[1]; 
2eaf0 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b  jj<mxChoice; jj+
2eb00 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
2eb10 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
2eb20 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20  rCost>mxCost || 
2eb30 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43  (pTo->rCost==mxC
2eb40 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77  ost && pTo->nRow
2eb50 3e 6d 78 4f 75 74 29 20 29 7b 0a 20 20 20 20 20  >mxOut) ){.     
2eb60 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
2eb70 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20  = pTo->rCost;.  
2eb80 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 4f 75              mxOu
2eb90 74 20 3d 20 70 54 6f 2d 3e 6e 52 6f 77 3b 0a 20  t = pTo->nRow;. 
2eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 49               mxI
2ebb0 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20   = jj;.         
2ebc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2ebd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ebe0 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66   }.    }..#ifdef
2ebf0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
2ec00 4c 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20  LED  /* >=2 */. 
2ec10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
2ec20 65 72 65 54 72 61 63 65 3e 3d 32 20 29 7b 0a 20  ereTrace>=2 ){. 
2ec30 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2ec40 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66  gPrintf("---- af
2ec50 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d  ter round %d ---
2ec60 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20  -\n", iLoop);.  
2ec70 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54      for(ii=0, pT
2ec80 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69  o=aTo; ii<nTo; i
2ec90 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  i++, pTo++){.   
2eca0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2ecb0 67 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73  gPrintf(" %s cos
2ecc0 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64  t=%-3d nrow=%-3d
2ecd0 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
2ece0 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
2ecf0 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b  Name(pTo, iLoop+
2ed00 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73  1, 0), pTo->rCos
2ed10 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20  t, pTo->nRow,.  
2ed20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73           pTo->is
2ed30 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28  OrderedValid ? (
2ed40 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f  pTo->isOrdered ?
2ed50 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f   'Y' : 'N') : '?
2ed60 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ');.        if( 
2ed70 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61  pTo->isOrderedVa
2ed80 6c 69 64 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72  lid && pTo->isOr
2ed90 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  dered ){.       
2eda0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2edb0 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c  rintf(" rev=0x%l
2edc0 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c  lx\n", pTo->revL
2edd0 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  oop);.        }e
2ede0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
2edf0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2ee00 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  f("\n");.       
2ee10 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2ee20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
2ee30 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f  Swap the roles o
2ee40 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20  f aFrom and aTo 
2ee50 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e  for the next gen
2ee60 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70  eration */.    p
2ee70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20  From = aTo;.    
2ee80 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20  aTo = aFrom;.   
2ee90 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a   aFrom = pFrom;.
2eea0 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b      nFrom = nTo;
2eeb0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f  .  }..  if( nFro
2eec0 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  m==0 ){.    sqli
2eed0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2eee0 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f  se, "no query so
2eef0 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71  lution");.    sq
2ef00 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2ef10 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74  pSpace);.    ret
2ef20 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2ef30 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69  ;.  }.  .  /* Fi
2ef40 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  nd the lowest co
2ef50 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20  st path.  pFrom 
2ef60 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69  will be left poi
2ef70 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61  nting to that pa
2ef80 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20  th */.  pFrom = 
2ef90 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d  aFrom;.  for(ii=
2efa0 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b  1; ii<nFrom; ii+
2efb0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  +){.    if( pFro
2efc0 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69  m->rCost>aFrom[i
2efd0 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d  i].rCost ) pFrom
2efe0 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20   = &aFrom[ii];. 
2eff0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57 49   }.  assert( pWI
2f000 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f  nfo->nLevel==nLo
2f010 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20  op );.  /* Load 
2f020 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
2f030 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f  path into pWInfo
2f040 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d   */.  for(iLoop=
2f050 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20  0; iLoop<nLoop; 
2f060 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68  iLoop++){.    Wh
2f070 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
2f080 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69   = pWInfo->a + i
2f090 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Loop;.    pLevel
2f0a0 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f  ->pWLoop = pWLoo
2f0b0 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  p = pFrom->aLoop
2f0c0 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65  [iLoop];.    pLe
2f0d0 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c  vel->iFrom = pWL
2f0e0 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70  oop->iTab;.    p
2f0f0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d  Level->iTabCur =
2f100 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2f110 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
2f120 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d  om].iCursor;.  }
2f130 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e  .  if( (pWInfo->
2f140 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2f150 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
2f160 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e  )!=0.   && (pWIn
2f170 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
2f180 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
2f190 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49 6e  Y)==0.   && pWIn
2f1a0 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57  fo->eDistinct==W
2f1b0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f  HERE_DISTINCT_NO
2f1c0 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74  OP.   && nRowEst
2f1d0 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  .  ){.    Bitmas
2f1e0 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69  k notUsed;.    i
2f1f0 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74  nt rc = wherePat
2f200 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
2f210 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f  y(pWInfo, pWInfo
2f220 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70 46  ->pResultSet, pF
2f230 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rom,.           
2f240 20 20 20 20 20 20 57 48 45 52 45 5f 44 49 53 54        WHERE_DIST
2f250 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c  INCTBY, nLoop-1,
2f260 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c   pFrom->aLoop[nL
2f270 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64  oop-1], &notUsed
2f280 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 31  );.    if( rc==1
2f290 20 29 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74   ) pWInfo->eDist
2f2a0 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
2f2b0 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
2f2c0 20 7d 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e   }.  if( pFrom->
2f2d0 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20 20 20  isOrdered ){.   
2f2e0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74   if( pWInfo->wct
2f2f0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2f300 44 49 53 54 49 4e 43 54 42 59 20 29 7b 0a 20 20  DISTINCTBY ){.  
2f310 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
2f320 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
2f330 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
2f340 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f350 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20   pWInfo->bOBSat 
2f360 3d 20 31 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  = 1;.      pWInf
2f370 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46 72  o->revMask = pFr
2f380 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20  om->revLoop;.   
2f390 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d   }.  }.  pWInfo-
2f3a0 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d  >nRowOut = pFrom
2f3b0 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72  ->nRow;..  /* Fr
2f3c0 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d  ee temporary mem
2f3d0 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e 20 73  ory and return s
2f3e0 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69  uccess */.  sqli
2f3f0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
2f400 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  pace);.  return 
2f410 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2f420 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69 65 73  .** Most queries
2f430 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67   use only a sing
2f440 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79 20 61  le table (they a
2f450 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e  re not joins) an
2f460 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65  d have.** simple
2f470 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
2f480 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65 64 20  against indexed 
2f490 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20 72 6f  fields.  This ro
2f4a0 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a  utine attempts.*
2f4b0 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20  * to plan those 
2f4c0 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75 73 69  simple cases usi
2f4d0 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63 65 72  ng much less cer
2f4e0 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a  emony than the.*
2f4f0 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73  * general-purpos
2f500 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c  e query planner,
2f510 20 61 6e 64 20 74 68 65 72 65 62 79 20 79 69 65   and thereby yie
2f520 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69 74 65  ld faster sqlite
2f530 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a 20 74  3_prepare().** t
2f540 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6d  imes for the com
2f550 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  mon case..**.** 
2f560 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
2f570 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66 20 74  on success, if t
2f580 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65  his query can be
2f590 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73   handled by this
2f5a0 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75  .** no-frills qu
2f5b0 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65  ery planner.  Re
2f5c0 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74 68 69  turn zero if thi
2f5d0 73 20 71 75 65 72 79 20 6e 65 65 64 73 20 74 68  s query needs th
2f5e0 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75  e .** general-pu
2f5f0 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e  rpose query plan
2f600 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ner..*/.static i
2f610 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43 75 74  nt whereShortCut
2f620 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
2f630 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20  r *pBuilder){.  
2f640 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2f650 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  o;.  struct SrcL
2f660 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2f670 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2f680 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  pWC;.  WhereTerm
2f690 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65 72 65   *pTerm;.  Where
2f6a0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69  Loop *pLoop;.  i
2f6b0 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a  nt iCur;.  int j
2f6c0 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
2f6d0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
2f6e0 20 20 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42    .  pWInfo = pB
2f6f0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
2f700 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
2f710 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2f720 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 29 20 72  _FORCE_TABLE ) r
2f730 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72  eturn 0;.  asser
2f740 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  t( pWInfo->pTabL
2f750 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a  ist->nSrc>=1 );.
2f760 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f    pItem = pWInfo
2f770 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20  ->pTabList->a;. 
2f780 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70   pTab = pItem->p
2f790 54 61 62 3b 0a 20 20 69 66 28 20 49 73 56 69 72  Tab;.  if( IsVir
2f7a0 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
2f7b0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 74  urn 0;.  if( pIt
2f7c0 65 6d 2d 3e 7a 49 6e 64 65 78 20 29 20 72 65 74  em->zIndex ) ret
2f7d0 75 72 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d 20  urn 0;.  iCur = 
2f7e0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
2f7f0 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d    pWC = &pWInfo-
2f800 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20  >sWC;.  pLoop = 
2f810 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
2f820 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
2f830 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75   = 0;.  pLoop->u
2f840 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20 30  .btree.nSkip = 0
2f850 3b 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64  ;.  pTerm = find
2f860 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
2f870 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 30 29  -1, 0, WO_EQ, 0)
2f880 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b  ;.  if( pTerm ){
2f890 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  .    pLoop->wsFl
2f8a0 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
2f8b0 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c  MN_EQ|WHERE_IPK|
2f8c0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
2f8d0 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b    pLoop->aLTerm[
2f8e0 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
2f8f0 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
2f900 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  1;.    pLoop->u.
2f910 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
2f920 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
2f930 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f  st of a rowid lo
2f940 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20  okup is 10 */.  
2f950 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20    pLoop->rRun = 
2f960 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69  33;  /* 33==sqli
2f970 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f  te3LogEst(10) */
2f980 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
2f990 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
2f9a0 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
2f9b0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
2f9c0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
2f9d0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d  p->aLTermSpace==
2f9e0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b  pLoop->aLTerm );
2f9f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 41  .      assert( A
2fa00 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e  rraySize(pLoop->
2fa10 61 4c 54 65 72 6d 53 70 61 63 65 29 3d 3d 34 20  aLTermSpace)==4 
2fa20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
2fa30 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e  x->onError==OE_N
2fa40 6f 6e 65 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  one .       || p
2fa50 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
2fa60 72 65 21 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c  re!=0 .       ||
2fa70 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41   pIdx->nKeyCol>A
2fa80 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e  rraySize(pLoop->
2fa90 61 4c 54 65 72 6d 53 70 61 63 65 29 20 0a 20 20  aLTermSpace) .  
2faa0 20 20 20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a      ) continue;.
2fab0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2fac0 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
2fad0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54  j++){.        pT
2fae0 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
2faf0 57 43 2c 20 69 43 75 72 2c 20 70 49 64 78 2d 3e  WC, iCur, pIdx->
2fb00 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c 20  aiColumn[j], 0, 
2fb10 57 4f 5f 45 51 2c 20 70 49 64 78 29 3b 0a 20 20  WO_EQ, pIdx);.  
2fb20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
2fb30 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
2fb40 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
2fb50 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[j] = pTerm;.  
2fb60 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2fb70 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  j!=pIdx->nKeyCol
2fb80 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2fb90 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
2fba0 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
2fbb0 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57  _EQ|WHERE_ONEROW
2fbc0 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a  |WHERE_INDEXED;.
2fbd0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
2fbe0 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70  isCovering || (p
2fbf0 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20  Item->colUsed & 
2fc00 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28  ~columnsInIndex(
2fc10 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20  pIdx))==0 ){.   
2fc20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c       pLoop->wsFl
2fc30 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58  ags |= WHERE_IDX
2fc40 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20  _ONLY;.      }. 
2fc50 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65       pLoop->nLTe
2fc60 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c  rm = j;.      pL
2fc70 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
2fc80 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f   = j;.      pLoo
2fc90 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
2fca0 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  x = pIdx;.      
2fcb0 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
2fcc0 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  of a unique inde
2fcd0 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a  x lookup is 15 *
2fce0 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72  /.      pLoop->r
2fcf0 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39  Run = 39;  /* 39
2fd00 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
2fd10 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  15) */.      bre
2fd20 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
2fd30 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
2fd40 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d  gs ){.    pLoop-
2fd50 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29  >nOut = (LogEst)
2fd60 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  1;.    pWInfo->a
2fd70 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f  [0].pWLoop = pLo
2fd80 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d  op;.    pLoop->m
2fd90 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73  askSelf = getMas
2fda0 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
2fdb0 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  Set, iCur);.    
2fdc0 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61  pWInfo->a[0].iTa
2fdd0 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20  bCur = iCur;.   
2fde0 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
2fdf0 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57   = 1;.    if( pW
2fe00 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
2fe10 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20   pWInfo->bOBSat 
2fe20 3d 20 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57  =  1;.    if( pW
2fe30 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2fe40 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
2fe50 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20  STINCT ){.      
2fe60 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
2fe70 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
2fe80 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  CT_UNIQUE;.    }
2fe90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2fea0 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  EBUG.    pLoop->
2feb0 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69  cId = '0';.#endi
2fec0 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  f.    return 1;.
2fed0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2fee0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
2fef0 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  e the beginning 
2ff00 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64  of the loop used
2ff10 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73   for WHERE claus
2ff20 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
2ff30 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
2ff40 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
2ff50 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75  o an opaque stru
2ff60 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
2ff70 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  ins.** informati
2ff80 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72  on needed to ter
2ff90 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
2ffa0 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c    Later, the cal
2ffb0 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  ling routine.** 
2ffc0 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71  should invoke sq
2ffd0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
2ffe0 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
2fff0 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
30000 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64  nction.** in ord
30010 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  er to complete t
30020 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
30030 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
30040 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
30050 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69  curs, this routi
30060 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e  ne returns NULL.
30070 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63  .**.** The basic
30080 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61   idea is to do a
30090 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e   nested loop, on
300a0 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20  e loop for each 
300b0 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20  table in.** the 
300c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
300d0 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52   select.  (INSER
300e0 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61  T and UPDATE sta
300f0 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a  tements are the.
30100 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c  ** same as a SEL
30110 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20  ECT with only a 
30120 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
30130 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
30140 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  )  For.** exampl
30150 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73  e, if the SQL is
30160 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
30170 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
30180 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52   t1, t2, t3 WHER
30190 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  E ...;.**.** The
301a0 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  n the code gener
301b0 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75  ated is conceptu
301c0 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f  ally like the fo
301d0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
301e0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
301f0 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20   in t1 do       
30200 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
30210 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f  ted.**        fo
30220 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
30230 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20   do      |-- by 
30240 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
30250 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  n().**          
30260 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20  foreach row3 in 
30270 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20  t3 do   /.**    
30280 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
30290 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
302a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
302b0 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
302c0 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e  ted.**        en
302d0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
302e0 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20           |-- by 
302f0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
30300 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20  ).**      end   
30310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30320 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f        /.**.** No
30330 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70  te that the loop
30340 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e  s might not be n
30350 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ested in the ord
30360 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79  er in which they
30370 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68  .** appear in th
30380 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66  e FROM clause if
30390 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64   a different ord
303a0 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62 6c  er is better abl
303b0 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65  e to make.** use
303c0 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f   of indices.  No
303d0 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65  te also that whe
303e0 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  n the IN operato
303f0 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20  r appears in.** 
30400 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
30410 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c  , it might resul
30420 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  t in additional 
30430 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72  nested loops for
30440 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  .** scanning thr
30450 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20  ough all values 
30460 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
30470 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  d side of the IN
30480 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
30490 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20  e Btree cursors 
304a0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
304b0 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20  each table.  t1 
304c0 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e  uses cursor.** n
304d0 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e  umber pTabList->
304e0 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74  a[0].iCursor.  t
304f0 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f  2 uses the curso
30500 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d  r pTabList->a[1]
30510 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64  .iCursor..** And
30520 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73   so forth.  This
30530 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
30540 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20  es code to open 
30550 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f  those VDBE curso
30560 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  rs.** and sqlite
30570 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65  3WhereEnd() gene
30580 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  rates the code t
30590 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a  o close them..**
305a0 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61  .** The code tha
305b0 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  t sqlite3WhereBe
305c0 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20  gin() generates 
305d0 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f  leaves the curso
305e0 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70  rs named.** in p
305f0 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67  TabList pointing
30600 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70   at their approp
30610 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20  riate entries.  
30620 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a  The [...] code.*
30630 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c  * can use OP_Col
30640 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64  umn and OP_Rowid
30650 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73   opcodes on thes
30660 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74  e cursors to ext
30670 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f  ract.** data fro
30680 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61  m the various ta
30690 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  bles of the loop
306a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57  ..**.** If the W
306b0 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65  HERE clause is e
306c0 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63  mpty, the foreac
306d0 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63  h loops must eac
306e0 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20  h scan their.** 
306f0 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20  entire tables.  
30700 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79  Thus a three-way
30710 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e   join is an O(N^
30720 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  3) operation.  B
30730 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  ut if.** the tab
30740 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73  les have indices
30750 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74   and there are t
30760 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
30770 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a  E clause that.**
30780 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20   refer to those 
30790 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c  indices, a compl
307a0 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63  ete table scan c
307b0 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e  an be avoided an
307c0 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69  d the.** code wi
307d0 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74  ll run much fast
307e0 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65  er.  Most of the
307f0 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f   work of this ro
30800 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e  utine is checkin
30810 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74  g.** to see if t
30820 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73  here are indices
30830 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
30840 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68  d to speed up th
30850 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65  e loop..**.** Te
30860 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
30870 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f   clause are also
30880 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77   used to limit w
30890 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c  hich rows actual
308a0 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f  ly.** make it to
308b0 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68   the "..." in th
308c0 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20  e middle of the 
308d0 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63  loop.  After eac
308e0 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20  h "foreach",.** 
308f0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
30900 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75  RE clause that u
30910 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e  se only terms in
30920 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f   that loop and o
30930 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72  uter.** loops ar
30940 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  e evaluated and 
30950 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20  if false a jump 
30960 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61  is made around a
30970 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  ll subsequent.**
30980 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72   inner loops (or
30990 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e   around the "...
309a0 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63  " if the test oc
309b0 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
309c0 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c  inner-.** most l
309d0 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52  oop).**.** OUTER
309e0 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20   JOINS.**.** An 
309f0 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61  outer join of ta
30a00 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69  bles t1 and t2 i
30a10 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f  s conceptally co
30a20 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ded as follows:.
30a30 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68  **.**    foreach
30a40 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a   row1 in t1 do.*
30a50 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a  *      flag = 0.
30a60 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
30a70 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a  row2 in t2 do.**
30a80 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a          start:.*
30a90 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a  *          ....*
30aa0 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  *          flag 
30ab0 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a  = 1.**      end.
30ac0 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d  **      if flag=
30ad0 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  =0 then.**      
30ae0 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20    move the row2 
30af0 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c  cursor to a null
30b00 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67   row.**        g
30b10 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20  oto start.**    
30b20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a    fi.**    end.*
30b30 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c  *.** ORDER BY CL
30b40 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a  AUSE PROCESSING.
30b50 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69  **.** pOrderBy i
30b60 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
30b70 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
30b80 73 65 20 28 6f 72 20 74 68 65 20 47 52 4f 55 50  se (or the GROUP
30b90 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66   BY clause.** if
30ba0 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50   the WHERE_GROUP
30bb0 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  BY flag is set i
30bc0 6e 20 77 63 74 72 6c 46 6c 61 67 73 29 20 6f 66  n wctrlFlags) of
30bd0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
30be0 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ent.** if there 
30bf0 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72  is one.  If ther
30c00 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
30c10 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68   clause or if th
30c20 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
30c30 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20   called from an 
30c40 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
30c50 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
30c60 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c   pOrderBy is NUL
30c70 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 49 64  L..**.** The iId
30c80 78 43 75 72 20 70 61 72 61 6d 65 74 65 72 20 69  xCur parameter i
30c90 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  s the cursor num
30ca0 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e  ber of an index.
30cb0 20 20 49 66 20 0a 2a 2a 20 57 48 45 52 45 5f 4f    If .** WHERE_O
30cc0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20  NETABLE_ONLY is 
30cd0 73 65 74 2c 20 69 49 64 78 43 75 72 20 69 73 20  set, iIdxCur is 
30ce0 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
30cf0 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  r of an index.**
30d00 20 74 6f 20 75 73 65 20 66 6f 72 20 4f 52 20 63   to use for OR c
30d10 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
30d20 2e 20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  .  The WHERE cla
30d30 75 73 65 20 73 68 6f 75 6c 64 20 75 73 65 20 74  use should use t
30d40 68 69 73 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  his.** specific 
30d50 63 75 72 73 6f 72 2e 20 20 49 66 20 57 48 45 52  cursor.  If WHER
30d60 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
30d70 44 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 69  D is set, then i
30d80 49 64 78 43 75 72 20 69 73 0a 2a 2a 20 74 68 65  IdxCur is.** the
30d90 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 69 6e   first cursor in
30da0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 63 75 72   an array of cur
30db0 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64  sors for all ind
30dc0 69 63 65 73 2e 20 20 69 49 64 78 43 75 72 20 73  ices.  iIdxCur s
30dd0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73 65 64  hould.** be used
30de0 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
30df0 61 70 70 72 6f 70 72 69 61 74 65 20 63 75 72 73  appropriate curs
30e00 6f 72 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  or depending on 
30e10 77 68 69 63 68 20 69 6e 64 65 78 20 69 73 0a 2a  which index is.*
30e20 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65 72 65  * used..*/.Where
30e30 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65  Info *sqlite3Whe
30e40 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65  reBegin(.  Parse
30e50 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
30e60 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
30e70 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
30e80 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
30e90 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
30ea0 3a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  : A list of all 
30eb0 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61  tables to be sca
30ec0 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nned */.  Expr *
30ed0 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
30ee0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
30ef0 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
30f00 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
30f10 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  * An ORDER BY cl
30f20 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ause, or NULL */
30f30 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52 65  .  ExprList *pRe
30f40 73 75 6c 74 53 65 74 2c 20 2f 2a 20 52 65 73 75  sultSet, /* Resu
30f50 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 71 75  lt set of the qu
30f60 65 72 79 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  ery */.  u16 wct
30f70 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
30f80 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
30f90 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e  RE_* flags defin
30fa0 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
30fb0 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  h */.  int iIdxC
30fc0 75 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur           /* 
30fd0 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  If WHERE_ONETABL
30fe0 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69  E_ONLY is set, i
30ff0 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62  ndex cursor numb
31000 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  er */.){.  int n
31010 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20  ByteWInfo;      
31020 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79        /* Num. by
31030 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
31040 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  r WhereInfo stru
31050 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62  ct */.  int nTab
31060 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
31070 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
31080 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62  elements in pTab
31090 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49  List */.  WhereI
310a0 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
310b0 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63       /* Will bec
310c0 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76  ome the return v
310d0 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
310e0 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20  ction */.  Vdbe 
310f0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
31100 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72  be;   /* The vir
31110 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
31120 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73  gine */.  Bitmas
31130 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20  k notReady;     
31140 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20       /* Cursors 
31150 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74  that are not yet
31160 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20   positioned */. 
31170 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
31180 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54  r sWLB;     /* T
31190 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69  he WhereLoop bui
311a0 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d  lder */.  WhereM
311b0 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
311c0 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72  ;    /* The expr
311d0 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20  ession mask set 
311e0 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
311f0 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20  *pLevel;        
31200 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65  /* A single leve
31210 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  l in pWInfo->a[]
31220 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
31230 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
31240 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
31250 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f   single WhereLoo
31260 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  p object */.  in
31270 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
31280 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
31290 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71   counter */.  sq
312a0 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
312b0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
312c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
312d0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
312e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
312f0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
31300 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c  /...  /* Variabl
31310 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
31320 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
31330 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28  e->db;.  memset(
31340 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66  &sWLB, 0, sizeof
31350 28 73 57 4c 42 29 29 3b 0a 20 20 73 57 4c 42 2e  (sWLB));.  sWLB.
31360 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
31370 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62  rBy;..  /* Disab
31380 6c 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  le the DISTINCT 
31390 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20  optimization if 
313a0 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f  SQLITE_DistinctO
313b0 70 74 20 69 73 20 73 65 74 20 76 69 61 0a 20 20  pt is set via.  
313c0 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  ** sqlite3_test_
313d0 63 74 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  ctrl(SQLITE_TEST
313e0 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
313f0 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28  NS,...) */.  if(
31400 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
31410 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
31420 5f 44 69 73 74 69 6e 63 74 4f 70 74 29 20 29 7b  _DistinctOpt) ){
31430 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20  .    wctrlFlags 
31440 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44  &= ~WHERE_WANT_D
31450 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20  ISTINCT;.  }..  
31460 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
31470 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
31480 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
31490 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  mited by the num
314a0 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73  ber of.  ** bits
314b0 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20   in a Bitmask . 
314c0 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
314d0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
314e0 42 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61  BMS );.  if( pTa
314f0 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20  bList->nSrc>BMS 
31500 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
31510 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
31520 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65  at most %d table
31530 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d  s in a join", BM
31540 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  S);.    return 0
31550 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
31560 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c   function normal
31570 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e  ly generates a n
31580 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61  ested loop for a
31590 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20  ll tables in .  
315a0 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75  ** pTabList.  Bu
315b0 74 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f  t if the WHERE_O
315c0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61  NETABLE_ONLY fla
315d0 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77  g is set, then w
315e0 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e  e should.  ** on
315f0 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  ly generate code
31600 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
31610 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74  able in pTabList
31620 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74   and assume that
31630 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72  .  ** any cursor
31640 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
31650 68 20 73 75 62 73 65 71 75 65 6e 74 20 74 61 62  h subsequent tab
31660 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61  les are uninitia
31670 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54  lized..  */.  nT
31680 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46  abList = (wctrlF
31690 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
316a0 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20  TABLE_ONLY) ? 1 
316b0 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  : pTabList->nSrc
316c0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
316d0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
316e0 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74  the WhereInfo st
316f0 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c  ructure that wil
31700 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a  l become the.  *
31710 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20  * return value. 
31720 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74  A single allocat
31730 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73  ion is used to s
31740 74 6f 72 65 20 74 68 65 20 57 68 65 72 65 49 6e  tore the WhereIn
31750 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20  fo.  ** struct, 
31760 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
31770 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74  WhereInfo.a[], t
31780 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
31790 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e  tructure.  ** an
317a0 64 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53  d the WhereMaskS
317b0 65 74 20 73 74 72 75 63 74 75 72 65 2e 20 53 69  et structure. Si
317c0 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  nce WhereClause 
317d0 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79  contains an 8-by
317e0 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74  te.  ** field (t
317f0 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20  ype Bitmask) it 
31800 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20  must be aligned 
31810 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75  on an 8-byte bou
31820 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f  ndary on.  ** so
31830 6d 65 20 61 72 63 68 69 74 65 63 74 75 72 65 73  me architectures
31840 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e  . Hence the ROUN
31850 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f  D8() below..  */
31860 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20  .  nByteWInfo = 
31870 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68  ROUND8(sizeof(Wh
31880 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69  ereInfo)+(nTabLi
31890 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65  st-1)*sizeof(Whe
318a0 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49  reLevel));.  pWI
318b0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
318c0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
318d0 79 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f  yteWInfo + sizeo
318e0 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20  f(WhereLoop));. 
318f0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
31900 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
31910 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
31920 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e  WInfo);.    pWIn
31930 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  fo = 0;.    goto
31940 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
31950 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
31960 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20  aiCurOnePass[0] 
31970 3d 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f  = pWInfo->aiCurO
31980 6e 65 50 61 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a  nePass[1] = -1;.
31990 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c    pWInfo->nLevel
319a0 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70   = nTabList;.  p
319b0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20  WInfo->pParse = 
319c0 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f  pParse;.  pWInfo
319d0 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61  ->pTabList = pTa
319e0 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  bList;.  pWInfo-
319f0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
31a00 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  erBy;.  pWInfo->
31a10 70 52 65 73 75 6c 74 53 65 74 20 3d 20 70 52 65  pResultSet = pRe
31a20 73 75 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e 66  sultSet;.  pWInf
31a30 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69  o->iBreak = sqli
31a40 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
31a50 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77  (v);.  pWInfo->w
31a60 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72  ctrlFlags = wctr
31a70 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f  lFlags;.  pWInfo
31a80 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
31a90 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
31aa0 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53  ryLoop;.  pMaskS
31ab0 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d  et = &pWInfo->sM
31ac0 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70  askSet;.  sWLB.p
31ad0 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a  WInfo = pWInfo;.
31ae0 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57    sWLB.pWC = &pW
31af0 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c  Info->sWC;.  sWL
31b00 42 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c  B.pNew = (WhereL
31b10 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57  oop*)(((char*)pW
31b20 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f  Info)+nByteWInfo
31b30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
31b40 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
31b50 54 28 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a  T(sWLB.pNew) );.
31b60 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
31b70 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64  sWLB.pNew);.#ifd
31b80 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
31b90 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64    sWLB.pNew->cId
31ba0 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a   = '*';.#endif..
31bb0 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57    /* Split the W
31bc0 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f  HERE clause into
31bd0 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70   separate subexp
31be0 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65  ressions where e
31bf0 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72  ach.  ** subexpr
31c00 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
31c10 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70  ted by an AND op
31c20 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69  erator..  */.  i
31c30 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b  nitMaskSet(pMask
31c40 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61  Set);.  whereCla
31c50 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d  useInit(&pWInfo-
31c60 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  >sWC, pWInfo);. 
31c70 20 77 68 65 72 65 53 70 6c 69 74 28 26 70 57 49   whereSplit(&pWI
31c80 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72 65  nfo->sWC, pWhere
31c90 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a  , TK_AND);.    .
31ca0 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
31cb0 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  e: a WHERE claus
31cc0 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61  e that is consta
31cd0 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68  nt.  Evaluate th
31ce0 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  e.  ** expressio
31cf0 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d  n and either jum
31d00 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68  p over all of th
31d10 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74  e code or fall t
31d20 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  hru..  */.  for(
31d30 69 69 3d 30 3b 20 69 69 3c 73 57 4c 42 2e 70 57  ii=0; ii<sWLB.pW
31d40 43 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b  C->nTerm; ii++){
31d50 0a 20 20 20 20 69 66 28 20 6e 54 61 62 4c 69 73  .    if( nTabLis
31d60 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45  t==0 || sqlite3E
31d70 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
31d80 4a 6f 69 6e 28 73 57 4c 42 2e 70 57 43 2d 3e 61  Join(sWLB.pWC->a
31d90 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  [ii].pExpr) ){. 
31da0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
31db0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
31dc0 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e  sWLB.pWC->a[ii].
31dd0 70 45 78 70 72 2c 20 70 57 49 6e 66 6f 2d 3e 69  pExpr, pWInfo->i
31de0 42 72 65 61 6b 2c 0a 20 20 20 20 20 20 20 20 20  Break,.         
31df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e00 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
31e10 4c 29 3b 0a 20 20 20 20 20 20 73 57 4c 42 2e 70  L);.      sWLB.p
31e20 57 43 2d 3e 61 5b 69 69 5d 2e 77 74 46 6c 61 67  WC->a[ii].wtFlag
31e30 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
31e40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
31e50 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 4e   Special case: N
31e60 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  o FROM clause.  
31e70 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73  */.  if( nTabLis
31e80 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t==0 ){.    if( 
31e90 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66  pOrderBy ) pWInf
31ea0 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 31 3b 0a 20  o->bOBSat = 1;. 
31eb0 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67     if( wctrlFlag
31ec0 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
31ed0 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20  ISTINCT ){.     
31ee0 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
31ef0 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
31f00 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  NCT_UNIQUE;.    
31f10 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69  }.  }..  /* Assi
31f20 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68  gn a bit from th
31f30 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65  e bitmask to eve
31f40 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46  ry term in the F
31f50 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ROM clause..  **
31f60 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73 73 69 67  .  ** When assig
31f70 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20 76 61 6c  ning bitmask val
31f80 75 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75  ues to FROM clau
31f90 73 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 6d  se cursors, it m
31fa0 75 73 74 20 62 65 0a 20 20 2a 2a 20 74 68 65 20  ust be.  ** the 
31fb0 63 61 73 65 20 74 68 61 74 20 69 66 20 58 20 69  case that if X i
31fc0 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  s the bitmask fo
31fd0 72 20 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20  r the N-th FROM 
31fe0 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 65 6e  clause term then
31ff0 0a 20 20 2a 2a 20 74 68 65 20 62 69 74 6d 61 73  .  ** the bitmas
32000 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63  k for all FROM c
32010 6c 61 75 73 65 20 74 65 72 6d 73 20 74 6f 20 74  lause terms to t
32020 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 4e  he left of the N
32030 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73  -th term.  ** is
32040 20 28 58 2d 31 29 2e 20 20 20 41 6e 20 65 78 70   (X-1).   An exp
32050 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  ression from the
32060 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
32070 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73  LEFT JOIN can us
32080 65 0a 20 20 2a 2a 20 69 74 73 20 45 78 70 72 2e  e.  ** its Expr.
32090 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
320a0 76 61 6c 75 65 20 74 6f 20 66 69 6e 64 20 74 68  value to find th
320b0 65 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68 65  e bitmask of the
320c0 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20 2a   right table.  *
320d0 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  * of the join.  
320e0 53 75 62 74 72 61 63 74 69 6e 67 20 6f 6e 65 20  Subtracting one 
320f0 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74 20 74  from the right t
32100 61 62 6c 65 20 62 69 74 6d 61 73 6b 20 67 69 76  able bitmask giv
32110 65 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73  es a.  ** bitmas
32120 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  k for all tables
32130 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
32140 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69  the join.  Knowi
32150 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20  ng the bitmask. 
32160 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c   ** for all tabl
32170 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
32180 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73  f a left join is
32190 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63   important.  Tic
321a0 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a  ket #3015..  **.
321b0 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62    ** Note that b
321c0 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61  itmasks are crea
321d0 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62  ted for all pTab
321e0 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65  List->nSrc table
321f0 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69  s in.  ** pTabLi
32200 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65  st, not just the
32210 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20   first nTabList 
32220 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73  tables.  nTabLis
32230 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20  t is normally.  
32240 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62  ** equal to pTab
32250 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d  List->nSrc but m
32260 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65  ight be shortene
32270 64 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20  d to 1 if the.  
32280 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  ** WHERE_ONETABL
32290 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73  E_ONLY flag is s
322a0 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  et..  */.  for(i
322b0 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74  i=0; ii<pTabList
322c0 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20  ->nSrc; ii++){. 
322d0 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d     createMask(pM
322e0 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
322f0 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29  ->a[ii].iCursor)
32300 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ;.  }.#ifndef ND
32310 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74  EBUG.  {.    Bit
32320 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d  mask toTheLeft =
32330 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   0;.    for(ii=0
32340 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  ; ii<pTabList->n
32350 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Src; ii++){.    
32360 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65    Bitmask m = ge
32370 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
32380 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  pTabList->a[ii].
32390 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
323a0 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74  assert( (m-1)==t
323b0 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20  oTheLeft );.    
323c0 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d    toTheLeft |= m
323d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
323e0 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  if..  /* Analyze
323f0 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65   all of the sube
32400 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74  xpressions.  Not
32410 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79  e that exprAnaly
32420 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20  ze() might.  ** 
32430 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20  add new virtual 
32440 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65  terms onto the e
32450 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
32460 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e  clause.  We do n
32470 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20  ot.  ** want to 
32480 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69  analyze these vi
32490 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20  rtual terms, so 
324a0 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20  start analyzing 
324b0 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20  at the end.  ** 
324c0 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64  and work forward
324d0 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64 64   so that the add
324e0 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ed virtual terms
324f0 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65   are never proce
32500 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70  ssed..  */.  exp
32510 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62  rAnalyzeAll(pTab
32520 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  List, &pWInfo->s
32530 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  WC);.  if( db->m
32540 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
32550 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
32560 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20  inError;.  }..  
32570 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
32580 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
32590 49 4e 43 54 20 29 7b 0a 20 20 20 20 69 66 28 20  INCT ){.    if( 
325a0 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
325b0 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ant(pParse, pTab
325c0 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  List, &pWInfo->s
325d0 57 43 2c 20 70 52 65 73 75 6c 74 53 65 74 29 20  WC, pResultSet) 
325e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
325f0 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e 67  DISTINCT marking
32600 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20   is pointless.  
32610 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20  Ignore it. */.  
32620 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
32630 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
32640 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
32650 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
32660 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
32670 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44 45    /* Try to ORDE
32680 52 20 42 59 20 74 68 65 20 72 65 73 75 6c 74 20  R BY the result 
32690 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69 73 74  set to make dist
326a0 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e 67 20  inct processing 
326b0 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20 20 20  easier */.      
326c0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
326d0 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49 53 54  gs |= WHERE_DIST
326e0 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20 70 57  INCTBY;.      pW
326f0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d  Info->pOrderBy =
32700 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 20   pResultSet;.   
32710 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e   }.  }..  /* Con
32720 73 74 72 75 63 74 20 74 68 65 20 57 68 65 72 65  struct the Where
32730 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Loop objects */.
32740 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
32750 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  fff,("*** Optimi
32760 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22  zer Start ***\n"
32770 29 29 3b 0a 20 20 2f 2a 20 44 69 73 70 6c 61 79  ));.  /* Display
32780 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
32790 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
327a0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48  /.#if defined(WH
327b0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
327c0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
327d0 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f  ITE_ENABLE_TREE_
327e0 45 58 50 4c 41 49 4e 29 0a 20 20 69 66 28 20 73  EXPLAIN).  if( s
327f0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
32800 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20   & 0x100 ){.    
32810 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 20  int i;.    Vdbe 
32820 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
32830 62 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  be;.    sqlite3E
32840 78 70 6c 61 69 6e 42 65 67 69 6e 28 76 29 3b 0a  xplainBegin(v);.
32850 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
32860 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  WLB.pWC->nTerm; 
32870 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
32880 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
32890 28 76 2c 20 22 23 25 2d 32 64 20 22 2c 20 69 29  (v, "#%-2d ", i)
328a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
328b0 78 70 6c 61 69 6e 50 75 73 68 28 76 29 3b 0a 20  xplainPush(v);. 
328c0 20 20 20 20 20 77 68 65 72 65 45 78 70 6c 61 69       whereExplai
328d0 6e 54 65 72 6d 28 76 2c 20 26 73 57 4c 42 2e 70  nTerm(v, &sWLB.p
328e0 57 43 2d 3e 61 5b 69 5d 29 3b 0a 20 20 20 20 20  WC->a[i]);.     
328f0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
32900 6f 70 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  op(v);.      sql
32910 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 76 29  ite3ExplainNL(v)
32920 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
32930 74 65 33 45 78 70 6c 61 69 6e 46 69 6e 69 73 68  te3ExplainFinish
32940 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
32950 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 73 22  DebugPrintf("%s"
32960 2c 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  , sqlite3VdbeExp
32970 6c 61 6e 61 74 69 6f 6e 28 76 29 29 3b 0a 20 20  lanation(v));.  
32980 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6e  }.#endif.  if( n
32990 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20 77 68  TabList!=1 || wh
329a0 65 72 65 53 68 6f 72 74 43 75 74 28 26 73 57 4c  ereShortCut(&sWL
329b0 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  B)==0 ){.    rc 
329c0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c  = whereLoopAddAl
329d0 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20 20 69 66  l(&sWLB);.    if
329e0 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72  ( rc ) goto wher
329f0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 0a  eBeginError;.  .
32a00 20 20 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61      /* Display a
32a10 6c 6c 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c  ll of the WhereL
32a20 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69 66 20 77  oop objects if w
32a30 68 65 72 65 74 72 61 63 65 20 69 73 20 65 6e 61  heretrace is ena
32a40 62 6c 65 64 20 2a 2f 0a 23 69 66 64 65 66 20 57  bled */.#ifdef W
32a50 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
32a60 44 20 2f 2a 20 21 3d 30 20 2a 2f 0a 20 20 20 20  D /* !=0 */.    
32a70 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
32a80 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 57  Trace ){.      W
32a90 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20  hereLoop *p;.   
32aa0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
32ab0 73 74 61 74 69 63 20 63 68 61 72 20 7a 4c 61 62  static char zLab
32ac0 65 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37  el[] = "01234567
32ad0 38 39 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e  89abcdefghijklmn
32ae0 6f 70 71 72 73 74 75 76 77 79 78 7a 22 0a 20 20  opqrstuvwyxz".  
32af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b10 20 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a       "ABCDEFGHIJ
32b20 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a  KLMNOPQRSTUVWYXZ
32b30 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70  ";.      for(p=p
32b40 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69  WInfo->pLoops, i
32b50 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  =0; p; p=p->pNex
32b60 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20  tLoop, i++){.   
32b70 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c       p->cId = zL
32b80 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a 4c  abel[i%sizeof(zL
32b90 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20 20  abel)];.        
32ba0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
32bb0 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20  , sWLB.pWC);.   
32bc0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
32bd0 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50 61  f.  .    wherePa
32be0 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c  thSolver(pWInfo,
32bf0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d   0);.    if( db-
32c00 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
32c10 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
32c20 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 57  rror;.    if( pW
32c30 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
32c40 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65 50 61  {.       wherePa
32c50 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c  thSolver(pWInfo,
32c60 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
32c70 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  +1);.       if( 
32c80 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
32c90 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
32ca0 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  inError;.    }. 
32cb0 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d   }.  if( pWInfo-
32cc0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20  >pOrderBy==0 && 
32cd0 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
32ce0 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72  ITE_ReverseOrder
32cf0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57 49  )!=0 ){.     pWI
32d00 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 28  nfo->revMask = (
32d10 42 69 74 6d 61 73 6b 29 28 2d 31 29 3b 0a 20 20  Bitmask)(-1);.  
32d20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
32d30 6e 45 72 72 20 7c 7c 20 4e 45 56 45 52 28 64 62  nErr || NEVER(db
32d40 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20  ->mallocFailed) 
32d50 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  ){.    goto wher
32d60 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
32d70 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
32d80 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 21 3d  CE_ENABLED /* !=
32d90 30 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  0 */.  if( sqlit
32da0 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a  e3WhereTrace ){.
32db0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
32dc0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
32dd0 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f  tf("---- Solutio
32de0 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e  n nRow=%d", pWIn
32df0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20  fo->nRowOut);.  
32e00 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 62 4f    if( pWInfo->bO
32e10 42 53 61 74 20 29 7b 0a 20 20 20 20 20 20 73 71  BSat ){.      sq
32e20 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
32e30 28 22 20 4f 52 44 45 52 42 59 3d 30 78 25 6c 6c  (" ORDERBY=0x%ll
32e40 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d  x", pWInfo->revM
32e50 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ask);.    }.    
32e60 73 77 69 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e  switch( pWInfo->
32e70 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  eDistinct ){.   
32e80 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
32e90 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b  STINCT_UNIQUE: {
32ea0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32eb0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44  DebugPrintf("  D
32ec0 49 53 54 49 4e 43 54 3d 75 6e 69 71 75 65 22 29  ISTINCT=unique")
32ed0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
32ee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
32ef0 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
32f00 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  CT_ORDERED: {.  
32f10 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
32f20 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54  ugPrintf("  DIST
32f30 49 4e 43 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a  INCT=ordered");.
32f40 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
32f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
32f60 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
32f70 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  _UNORDERED: {.  
32f80 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
32f90 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54  ugPrintf("  DIST
32fa0 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64 22 29  INCT=unordered")
32fb0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
32fc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
32fd0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
32fe0 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
32ff0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57   for(ii=0; ii<pW
33000 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69  Info->nLevel; ii
33010 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  ++){.      where
33020 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e 66 6f  LoopPrint(pWInfo
33030 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20  ->a[ii].pWLoop, 
33040 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 7d  sWLB.pWC);.    }
33050 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  .  }.#endif.  /*
33060 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74   Attempt to omit
33070 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74 68 65   tables from the
33080 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f   join that do no
33090 74 20 65 66 66 65 63 74 20 74 68 65 20 72 65 73  t effect the res
330a0 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20 70 57 49  ult */.  if( pWI
330b0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20  nfo->nLevel>=2. 
330c0 20 20 26 26 20 70 52 65 73 75 6c 74 53 65 74 21    && pResultSet!
330d0 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  =0.   && Optimiz
330e0 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
330f0 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70   SQLITE_OmitNoop
33100 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 42  Join).  ){.    B
33110 69 74 6d 61 73 6b 20 74 61 62 55 73 65 64 20 3d  itmask tabUsed =
33120 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
33130 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
33140 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69  esultSet);.    i
33150 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  f( sWLB.pOrderBy
33160 20 29 20 74 61 62 55 73 65 64 20 7c 3d 20 65 78   ) tabUsed |= ex
33170 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
33180 28 70 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e  (pMaskSet, sWLB.
33190 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 77  pOrderBy);.    w
331a0 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  hile( pWInfo->nL
331b0 65 76 65 6c 3e 3d 32 20 29 7b 0a 20 20 20 20 20  evel>=2 ){.     
331c0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
331d0 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20  m, *pEnd;.      
331e0 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  pLoop = pWInfo->
331f0 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  a[pWInfo->nLevel
33200 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  -1].pWLoop;.    
33210 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 70    if( (pWInfo->p
33220 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
33230 2d 3e 69 54 61 62 5d 2e 6a 6f 69 6e 74 79 70 65  ->iTab].jointype
33240 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29   & JT_LEFT)==0 )
33250 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
33260 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
33270 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
33280 4e 43 54 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  NCT)==0.       &
33290 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
332a0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
332b0 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  )==0.      ){.  
332c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
332d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
332e0 74 61 62 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d  tabUsed & pLoop-
332f0 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 20  >maskSelf)!=0 ) 
33300 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 45 6e  break;.      pEn
33310 64 20 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20  d = sWLB.pWC->a 
33320 2b 20 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72  + sWLB.pWC->nTer
33330 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65  m;.      for(pTe
33340 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20  rm=sWLB.pWC->a; 
33350 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72  pTerm<pEnd; pTer
33360 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
33370 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
33380 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  All & pLoop->mas
33390 6b 53 65 6c 66 29 21 3d 30 0a 20 20 20 20 20 20  kSelf)!=0.      
333a0 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
333b0 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45  operty(pTerm->pE
333c0 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
333d0 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
333e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
333f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33400 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3c        if( pTerm<
33410 70 45 6e 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  pEnd ) break;.  
33420 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
33430 78 66 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70  xffff, ("-> drop
33440 20 6c 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73 65   loop %c not use
33450 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64  d\n", pLoop->cId
33460 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ));.      pWInfo
33470 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20  ->nLevel--;.    
33480 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20    nTabList--;.  
33490 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54    }.  }.  WHERET
334a0 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a  RACE(0xffff,("**
334b0 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69  * Optimizer Fini
334c0 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20  shed ***\n"));. 
334d0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
334e0 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70  >nQueryLoop += p
334f0 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a  WInfo->nRowOut;.
33500 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c  .  /* If the cal
33510 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45  ler is an UPDATE
33520 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
33530 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71  ment that is req
33540 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  uesting.  ** to 
33550 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61  use a one-pass a
33560 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d  lgorithm, determ
33570 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61  ine if this is a
33580 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a  ppropriate..  **
33590 20 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c   The one-pass al
335a0 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72  gorithm only wor
335b0 6b 73 20 69 66 20 74 68 65 20 57 48 45 52 45 20  ks if the WHERE 
335c0 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
335d0 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65  s.  ** the state
335e0 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20 61  ment to update a
335f0 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a   single row..  *
33600 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74  /.  assert( (wct
33610 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
33620 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
33630 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e  ==0 || pWInfo->n
33640 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66  Level==1 );.  if
33650 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
33660 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
33670 53 49 52 45 44 29 21 3d 30 20 0a 20 20 20 26 26  SIRED)!=0 .   &&
33680 20 28 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70   (pWInfo->a[0].p
33690 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
336a0 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d   WHERE_ONEROW)!=
336b0 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  0 ){.    pWInfo-
336c0 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a  >okOnePass = 1;.
336d0 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64      if( HasRowid
336e0 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e  (pTabList->a[0].
336f0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 70  pTab) ){.      p
33700 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
33710 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e  op->wsFlags &= ~
33720 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
33730 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
33740 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20  Open all tables 
33750 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20  in the pTabList 
33760 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20  and any indices 
33770 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a  selected for.  *
33780 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73  * searching thos
33790 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
337a0 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
337b0 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
337c0 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
337d0 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69  fo->a; ii<nTabLi
337e0 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c  st; ii++, pLevel
337f0 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
33800 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62  pTab;     /* Tab
33810 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
33820 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
33830 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64     /* Index of d
33840 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
33850 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a  ng table/index *
33860 2f 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  /.    struct Src
33870 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
33880 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74  tem;..    pTabIt
33890 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
338a0 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
338b0 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61  ;.    pTab = pTa
338c0 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
338d0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
338e0 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
338f0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
33900 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
33910 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
33920 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
33930 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
33940 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e  al)!=0 || pTab->
33950 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
33960 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
33970 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e  /.    }else.#ifn
33980 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33990 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
339a0 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
339b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
339c0 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
339d0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
339e0 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73  r *pVTab = (cons
339f0 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
33a00 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54  GetVTable(db, pT
33a10 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab);.      int i
33a20 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
33a30 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73  iCursor;.      s
33a40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
33a50 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43  (v, OP_VOpen, iC
33a60 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c  ur, 0, 0, pVTab,
33a70 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d   P4_VTAB);.    }
33a80 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75  else if( IsVirtu
33a90 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
33aa0 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20    /* noop */.   
33ab0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
33ac0 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
33ad0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
33ae0 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20  X_ONLY)==0.     
33af0 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
33b00 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f  gs & WHERE_OMIT_
33b10 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29  OPEN_CLOSE)==0 )
33b20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d  {.      int op =
33b30 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20   OP_OpenRead;.  
33b40 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
33b50 6f 6b 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20 20  okOnePass ){.   
33b60 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65       op = OP_Ope
33b70 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20  nWrite;.        
33b80 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
33b90 50 61 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74  Pass[0] = pTabIt
33ba0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
33bb0 20 20 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69     };.      sqli
33bc0 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
33bd0 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  rse, pTabItem->i
33be0 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61  Cursor, iDb, pTa
33bf0 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 61 73  b, op);.      as
33c00 73 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e  sert( pTabItem->
33c10 69 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d  iCursor==pLevel-
33c20 3e 69 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20  >iTabCur );.    
33c30 20 20 74 65 73 74 63 61 73 65 28 20 21 70 57 49    testcase( !pWI
33c40 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26  nfo->okOnePass &
33c50 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d  & pTab->nCol==BM
33c60 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
33c70 74 63 61 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e  tcase( !pWInfo->
33c80 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61  okOnePass && pTa
33c90 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  b->nCol==BMS );.
33ca0 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66        if( !pWInf
33cb0 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20  o->okOnePass && 
33cc0 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26  pTab->nCol<BMS &
33cd0 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  & HasRowid(pTab)
33ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d   ){.        Bitm
33cf0 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d  ask b = pTabItem
33d00 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20  ->colUsed;.     
33d10 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20     int n = 0;.  
33d20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62        for(; b; b
33d30 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  =b>>1, n++){}.  
33d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
33d50 65 43 68 61 6e 67 65 50 34 28 76 2c 20 73 71 6c  eChangeP4(v, sql
33d60 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
33d70 64 64 72 28 76 29 2d 31 2c 20 0a 20 20 20 20 20  ddr(v)-1, .     
33d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d90 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e         SQLITE_IN
33da0 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f  T_TO_PTR(n), P4_
33db0 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20  INT32);.        
33dc0 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d  assert( n<=pTab-
33dd0 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d  >nCol );.      }
33de0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
33df0 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
33e00 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
33e10 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
33e20 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
33e30 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70   }.    if( pLoop
33e40 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
33e50 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20  E_INDEXED ){.   
33e60 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20     Index *pIx = 
33e70 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
33e80 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 6e 74  Index;.      int
33e90 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20   iIndexCur;.    
33ea0 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70    int op = OP_Op
33eb0 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 2f 2a  enRead;.      /*
33ec0 20 69 49 64 78 43 75 72 20 69 73 20 61 6c 77 61   iIdxCur is alwa
33ed0 79 73 20 73 65 74 20 69 66 20 74 6f 20 61 20 70  ys set if to a p
33ee0 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66  ositive value if
33ef0 20 4f 4e 45 50 41 53 53 20 69 73 20 70 6f 73 73   ONEPASS is poss
33f00 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  ible */.      as
33f10 73 65 72 74 28 20 69 49 64 78 43 75 72 21 3d 30  sert( iIdxCur!=0
33f20 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   || (pWInfo->wct
33f30 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
33f40 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
33f50 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
33f60 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61   pWInfo->okOnePa
33f70 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 49 6e  ss ){.        In
33f80 64 65 78 20 2a 70 4a 20 3d 20 70 54 61 62 49 74  dex *pJ = pTabIt
33f90 65 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78  em->pTab->pIndex
33fa0 3b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78  ;.        iIndex
33fb0 43 75 72 20 3d 20 69 49 64 78 43 75 72 3b 0a 20  Cur = iIdxCur;. 
33fc0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 77         assert( w
33fd0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
33fe0 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
33ff0 44 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  D );.        whi
34000 6c 65 28 20 41 4c 57 41 59 53 28 70 4a 29 20 26  le( ALWAYS(pJ) &
34010 26 20 70 4a 21 3d 70 49 78 20 29 7b 0a 20 20 20  & pJ!=pIx ){.   
34020 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
34030 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4a  ++;.          pJ
34040 20 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20   = pJ->pNext;.  
34050 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34060 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74  op = OP_OpenWrit
34070 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  e;.        pWInf
34080 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
34090 31 5d 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a  1] = iIndexCur;.
340a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
340b0 69 49 64 78 43 75 72 20 26 26 20 28 77 63 74 72  iIdxCur && (wctr
340c0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
340d0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30  NETABLE_ONLY)!=0
340e0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64   ){.        iInd
340f0 65 78 43 75 72 20 3d 20 69 49 64 78 43 75 72 3b  exCur = iIdxCur;
34100 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
34110 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20        iIndexCur 
34120 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
34130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34140 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
34150 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20  = iIndexCur;.   
34160 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e     assert( pIx->
34170 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
34180 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
34190 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 43 75  assert( iIndexCu
341a0 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  r>=0 );.      sq
341b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
341c0 76 2c 20 6f 70 2c 20 69 49 6e 64 65 78 43 75 72  v, op, iIndexCur
341d0 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  , pIx->tnum, iDb
341e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
341f0 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
34200 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20  (pParse, pIx);. 
34210 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
34220 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e  ((v, "%s", pIx->
34230 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
34240 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 20     if( iDb>=0 ) 
34250 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
34260 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
34270 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61  iDb);.    notRea
34280 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26  dy &= ~getMask(&
34290 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
342a0 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
342b0 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  sor);.  }.  pWIn
342c0 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74  fo->iTop = sqlit
342d0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
342e0 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  r(v);.  if( db->
342f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
34300 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
34310 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ror;..  /* Gener
34320 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
34330 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
34340 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
34350 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
34360 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
34370 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
34380 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
34390 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
343a0 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
343b0 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
343c0 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
343d0 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  i=0; ii<nTabList
343e0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65  ; ii++){.    pLe
343f0 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
34400 5b 69 69 5d 3b 0a 23 69 66 6e 64 65 66 20 53 51  [ii];.#ifndef SQ
34410 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
34420 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66  TIC_INDEX.    if
34430 28 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f  ( (pLevel->pWLoo
34440 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
34450 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
34460 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  0 ){.      const
34470 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64  ructAutomaticInd
34480 65 78 28 70 50 61 72 73 65 2c 20 26 70 57 49 6e  ex(pParse, &pWIn
34490 66 6f 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20 20  fo->sWC,.       
344a0 20 20 20 20 20 20 20 20 20 26 70 54 61 62 4c 69           &pTabLi
344b0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
344c0 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20  rom], notReady, 
344d0 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 69  pLevel);.      i
344e0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
344f0 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
34500 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20  BeginError;.    
34510 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 65 78 70  }.#endif.    exp
34520 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72  lainOneScan(pPar
34530 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c  se, pTabList, pL
34540 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c  evel, ii, pLevel
34550 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c  ->iFrom, wctrlFl
34560 61 67 73 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  ags);.    pLevel
34570 2d 3e 61 64 64 72 42 6f 64 79 20 3d 20 73 71 6c  ->addrBody = sql
34580 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
34590 64 64 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52  ddr(v);.    notR
345a0 65 61 64 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f  eady = codeOneLo
345b0 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20  opStart(pWInfo, 
345c0 69 69 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20  ii, notReady);. 
345d0 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74     pWInfo->iCont
345e0 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  inue = pLevel->a
345f0 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 20 20  ddrCont;.  }..  
34600 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64  /* Done. */.  Vd
34610 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
34620 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52 45  (v, "Begin WHERE
34630 2d 63 6f 72 65 22 29 29 3b 0a 20 20 72 65 74 75  -core"));.  retu
34640 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a  rn pWInfo;..  /*
34650 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61   Jump here if ma
34660 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68  lloc fails */.wh
34670 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20  ereBeginError:. 
34680 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20   if( pWInfo ){. 
34690 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
346a0 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  yLoop = pWInfo->
346b0 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
346c0 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72  .    whereInfoFr
346d0 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
346e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
346f0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
34700 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
34710 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65   WHERE loop.  Se
34720 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a  e comments on .*
34730 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  * sqlite3WhereBe
34740 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69  gin() for additi
34750 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
34760 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
34770 33 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49  3WhereEnd(WhereI
34780 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
34790 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
347a0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
347b0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
347c0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
347d0 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   i;.  WhereLevel
347e0 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72   *pLevel;.  Wher
347f0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20  eLoop *pLoop;.  
34800 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
34810 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
34820 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  List;.  sqlite3 
34830 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
34840 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
34850 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f   loop terminatio
34860 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 56  n code..  */.  V
34870 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
34880 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d  ((v, "End WHERE-
34890 63 6f 72 65 22 29 29 3b 0a 20 20 73 71 6c 69 74  core"));.  sqlit
348a0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
348b0 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28  (pParse);.  for(
348c0 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i=pWInfo->nLevel
348d0 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
348e0 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
348f0 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
34900 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c  fo->a[i];.    pL
34910 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
34920 4c 6f 6f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65  Loop;.    sqlite
34930 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
34940 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
34950 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  rCont);.    if( 
34960 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e  pLevel->op!=OP_N
34970 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  oop ){.      sql
34980 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
34990 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c  , pLevel->op, pL
349a0 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c  evel->p1, pLevel
349b0 2d 3e 70 32 2c 20 70 4c 65 76 65 6c 2d 3e 70 33  ->p2, pLevel->p3
349c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
349d0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
349e0 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20  pLevel->p5);.   
349f0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
34a00 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
34a10 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76  verageIf(v, pLev
34a20 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29  el->op==OP_Next)
34a30 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
34a40 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c  rageIf(v, pLevel
34a50 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a  ->op==OP_Prev);.
34a60 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
34a70 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  geIf(v, pLevel->
34a80 6f 70 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a 20  op==OP_VNext);. 
34a90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f     }.    if( pLo
34aa0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
34ab0 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70  ERE_IN_ABLE && p
34ac0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e  Level->u.in.nIn>
34ad0 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  0 ){.      struc
34ae0 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20  t InLoop *pIn;. 
34af0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
34b00 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
34b10 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
34b20 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20  vel->addrNxt);. 
34b30 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65       for(j=pLeve
34b40 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e  l->u.in.nIn, pIn
34b50 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  =&pLevel->u.in.a
34b60 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30  InLoop[j-1]; j>0
34b70 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20  ; j--, pIn--){. 
34b80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
34b90 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49  beJumpHere(v, pI
34ba0 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b  n->addrInTop+1);
34bb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34bc0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 49  VdbeAddOp2(v, pI
34bd0 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70  n->eEndLoopOp, p
34be0 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61  In->iCur, pIn->a
34bf0 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20  ddrInTop);.     
34c00 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
34c10 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  v);.        Vdbe
34c20 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 49  CoverageIf(v, pI
34c30 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f  n->eEndLoopOp==O
34c40 50 5f 50 72 65 76 49 66 4f 70 65 6e 29 3b 0a 20  P_PrevIfOpen);. 
34c50 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
34c60 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45  ageIf(v, pIn->eE
34c70 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e 65 78  ndLoopOp==OP_Nex
34c80 74 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  tIfOpen);.      
34c90 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
34ca0 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64  pHere(v, pIn->ad
34cb0 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20  drInTop-1);.    
34cc0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
34cd0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76  3DbFree(db, pLev
34ce0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
34cf0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
34d00 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
34d10 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
34d20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66  addrBrk);.    if
34d30 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b  ( pLevel->addrSk
34d40 69 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ip ){.      sqli
34d50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
34d60 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
34d70 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a  vel->addrSkip);.
34d80 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
34d90 74 28 28 76 2c 20 22 6e 65 78 74 20 73 6b 69 70  t((v, "next skip
34da0 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c  -scan on %s", pL
34db0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
34dc0 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  dex->zName));.  
34dd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
34de0 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65  umpHere(v, pLeve
34df0 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20  l->addrSkip);.  
34e00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
34e10 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65  umpHere(v, pLeve
34e20 6c 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a  l->addrSkip-2);.
34e30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
34e40 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
34e50 29 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  ){.      addr = 
34e60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34e70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70  1(v, OP_IfPos, p
34e80 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
34e90 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
34ea0 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  v);.      assert
34eb0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
34ec0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
34ed0 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  LY)==0.         
34ee0 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    || (pLoop->wsF
34ef0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
34f00 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20  EXED)!=0 );.    
34f10 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
34f20 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
34f30 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  X_ONLY)==0 ){.  
34f40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34f50 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
34f60 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d  llRow, pTabList-
34f70 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  >a[i].iCursor);.
34f80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
34f90 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
34fa0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
34fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
34fc0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
34fd0 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65   OP_NullRow, pLe
34fe0 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20  vel->iIdxCur);. 
34ff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
35000 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f   pLevel->op==OP_
35010 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20  Return ){.      
35020 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
35030 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
35040 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
35050 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
35060 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
35070 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
35080 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
35090 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61  to, 0, pLevel->a
350a0 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20  ddrFirst);.     
350b0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
350c0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
350d0 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  addr);.    }.   
350e0 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
350f0 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52  nt((v, "End WHER
35100 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 20 69  E-loop%d: %s", i
35110 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35120 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70         pWInfo->p
35130 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
35140 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e  l->iFrom].pTab->
35150 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20 20  zName));.  }..  
35160 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70  /* The "break" p
35170 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75  oint is here, ju
35180 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  st past the end 
35190 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
351a0 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a  p..  ** Set it..
351b0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
351c0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
351d0 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
351e0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57  );..  assert( pW
351f0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54  Info->nLevel<=pT
35200 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
35210 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
35220 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
35230 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
35240 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
35250 20 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74 3b 0a     int k, last;.
35260 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
35270 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
35280 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
35290 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
352a0 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
352b0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
352c0 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65  From];.    Table
352d0 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65   *pTab = pTabIte
352e0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73  m->pTab;.    ass
352f0 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
35300 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
35310 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20  el->pWLoop;..   
35320 20 2f 2a 20 46 6f 72 20 61 20 63 6f 2d 72 6f 75   /* For a co-rou
35330 74 69 6e 65 2c 20 63 68 61 6e 67 65 20 61 6c 6c  tine, change all
35340 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65 66 65 72   OP_Column refer
35350 65 6e 63 65 73 20 74 6f 20 74 68 65 20 74 61 62  ences to the tab
35360 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  le of.    ** the
35370 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 74 6f   co-routine into
35380 20 4f 50 5f 53 43 6f 70 79 20 6f 66 20 72 65 73   OP_SCopy of res
35390 75 6c 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ult contained in
353a0 20 61 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20   a register..   
353b0 20 2a 2a 20 4f 50 5f 52 6f 77 69 64 20 62 65 63   ** OP_Rowid bec
353c0 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20  omes OP_Null..  
353d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61    */.    if( pTa
353e0 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74  bItem->viaCorout
353f0 69 6e 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  ine && !db->mall
35400 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
35410 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33    last = sqlite3
35420 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
35430 76 29 3b 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c  v);.      k = pL
35440 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a  evel->addrBody;.
35450 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
35460 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
35470 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20  k);.      for(; 
35480 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70  k<last; k++, pOp
35490 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
354a0 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c   pOp->p1!=pLevel
354b0 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74  ->iTabCur ) cont
354c0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
354d0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
354e0 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  P_Column ){.    
354f0 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
35500 65 20 3d 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20  e = OP_SCopy;.  
35510 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
35520 3d 20 70 4f 70 2d 3e 70 32 20 2b 20 70 54 61 62  = pOp->p2 + pTab
35530 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 3b  Item->regResult;
35540 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
35550 70 32 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  p2 = pOp->p3;.  
35560 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 20          pOp->p3 
35570 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
35580 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  se if( pOp->opco
35590 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a  de==OP_Rowid ){.
355a0 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f            pOp->o
355b0 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b  pcode = OP_Null;
355c0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
355d0 70 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  p1 = 0;.        
355e0 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20    pOp->p3 = 0;. 
355f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
35600 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
35610 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
35620 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  lose all of the 
35630 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 72  cursors that wer
35640 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69  e opened by sqli
35650 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20  te3WhereBegin.. 
35660 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f     ** Except, do
35670 20 6e 6f 74 20 63 6c 6f 73 65 20 63 75 72 73 6f   not close curso
35680 72 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  rs that will be 
35690 72 65 75 73 65 64 20 62 79 20 74 68 65 20 4f 52  reused by the OR
356a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20   optimization.  
356b0 20 20 2a 2a 20 28 57 48 45 52 45 5f 4f 4d 49 54    ** (WHERE_OMIT
356c0 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 2e 20 20 41  _OPEN_CLOSE).  A
356d0 6e 64 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20  nd do not close 
356e0 74 68 65 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  the OP_OpenWrite
356f0 20 63 75 72 73 6f 72 73 0a 20 20 20 20 2a 2a 20   cursors.    ** 
35700 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 65 20  created for the 
35710 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61  ONEPASS optimiza
35720 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
35730 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46   if( (pTab->tabF
35740 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
35750 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  ral)==0.     && 
35760 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
35770 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f  .     && (pWInfo
35780 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
35790 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43  HERE_OMIT_OPEN_C
357a0 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a  LOSE)==0.    ){.
357b0 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20 70        int ws = p
357c0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  Loop->wsFlags;. 
357d0 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f       if( !pWInfo
357e0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 28  ->okOnePass && (
357f0 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  ws & WHERE_IDX_O
35800 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
35810 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
35820 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
35830 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
35840 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
35850 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57 48      if( (ws & WH
35860 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
35870 20 20 20 20 20 20 20 26 26 20 28 77 73 20 26 20         && (ws & 
35880 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  (WHERE_IPK|WHERE
35890 5f 41 55 54 4f 5f 49 4e 44 45 58 29 29 3d 3d 30  _AUTO_INDEX))==0
358a0 20 0a 20 20 20 20 20 20 20 26 26 20 70 4c 65 76   .       && pLev
358b0 65 6c 2d 3e 69 49 64 78 43 75 72 21 3d 70 57 49  el->iIdxCur!=pWI
358c0 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
358d0 73 5b 31 5d 0a 20 20 20 20 20 20 29 7b 0a 20 20  s[1].      ){.  
358e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
358f0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
35900 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ose, pLevel->iId
35910 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
35920 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
35930 74 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61  this scan uses a
35940 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44  n index, make VD
35950 42 45 20 63 6f 64 65 20 73 75 62 73 74 69 74 75  BE code substitu
35960 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61  tions to read da
35970 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  ta.    ** from t
35980 68 65 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64  he index instead
35990 20 6f 66 20 66 72 6f 6d 20 74 68 65 20 74 61 62   of from the tab
359a0 6c 65 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c  le where possibl
359b0 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63 61 73 65  e.  In some case
359c0 73 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 6f 70  s.    ** this op
359d0 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72 65 76 65  timization preve
359e0 6e 74 73 20 74 68 65 20 74 61 62 6c 65 20 66 72  nts the table fr
359f0 6f 6d 20 65 76 65 72 20 62 65 69 6e 67 20 72 65  om ever being re
35a00 61 64 2c 20 77 68 69 63 68 20 63 61 6e 0a 20 20  ad, which can.  
35a10 20 20 2a 2a 20 79 69 65 6c 64 20 61 20 73 69 67    ** yield a sig
35a20 6e 69 66 69 63 61 6e 74 20 70 65 72 66 6f 72 6d  nificant perform
35a30 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20  ance boost..    
35a40 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73  ** .    ** Calls
35a50 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
35a60 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65  erator in betwee
35a70 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  n sqlite3WhereBe
35a80 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73  gin and.    ** s
35a90 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77  qlite3WhereEnd w
35aa0 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64  ill have created
35ab0 20 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72   code that refer
35ac0 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a  ences the table.
35ad0 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e      ** directly.
35ae0 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e    This loop scan
35af0 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20  s all that code 
35b00 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f  looking for opco
35b10 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  des.    ** that 
35b20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61  reference the ta
35b30 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73  ble and converts
35b40 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64   them into opcod
35b50 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72  es that.    ** r
35b60 65 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64  eference the ind
35b70 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ex..    */.    i
35b80 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
35b90 73 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58  s & (WHERE_INDEX
35ba0 45 44 7c 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  ED|WHERE_IDX_ONL
35bb0 59 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  Y) ){.      pIdx
35bc0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
35bd0 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65  e.pIndex;.    }e
35be0 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  lse if( pLoop->w
35bf0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
35c00 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20  ULTI_OR ){.     
35c10 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   pIdx = pLevel->
35c20 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d  u.pCovidx;.    }
35c30 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 26 26  .    if( pIdx &&
35c40 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
35c50 65 64 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74  ed ){.      last
35c60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
35c70 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
35c80 20 20 20 20 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e      k = pLevel->
35c90 61 64 64 72 42 6f 64 79 3b 0a 20 20 20 20 20 20  addrBody;.      
35ca0 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
35cb0 65 47 65 74 4f 70 28 76 2c 20 6b 29 3b 0a 20 20  eGetOp(v, k);.  
35cc0 20 20 20 20 66 6f 72 28 3b 20 6b 3c 6c 61 73 74      for(; k<last
35cd0 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; k++, pOp++){. 
35ce0 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
35cf0 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62  p1!=pLevel->iTab
35d00 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
35d10 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
35d20 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75  >opcode==OP_Colu
35d30 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
35d40 69 6e 74 20 78 20 3d 20 70 4f 70 2d 3e 70 32 3b  int x = pOp->p2;
35d50 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
35d60 74 28 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3d  t( pIdx->pTable=
35d70 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20  =pTab );.       
35d80 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
35d90 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
35da0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b        Index *pPk
35db0 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
35dc0 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
35dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 20 3d  .            x =
35de0 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 78   pPk->aiColumn[x
35df0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ];.          }. 
35e00 20 20 20 20 20 20 20 20 20 78 20 3d 20 73 71 6c           x = sql
35e10 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
35e20 78 28 70 49 64 78 2c 20 78 29 3b 0a 20 20 20 20  x(pIdx, x);.    
35e30 20 20 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29        if( x>=0 )
35e40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f  {.            pO
35e50 70 2d 3e 70 32 20 3d 20 78 3b 0a 20 20 20 20 20  p->p2 = x;.     
35e60 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
35e70 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
35e80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
35e90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
35ea0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
35eb0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
35ec0 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20 29 3b 0a  )==0 || x>=0 );.
35ed0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
35ee0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
35ef0 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  P_Rowid ){.     
35f00 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70       pOp->p1 = p
35f10 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
35f20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f            pOp->o
35f30 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f  pcode = OP_IdxRo
35f40 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  wid;.        }. 
35f50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
35f60 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65  ..  /* Final cle
35f70 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72  anup.  */.  pPar
35f80 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
35f90 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
35fa0 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72  ueryLoop;.  wher
35fb0 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57  eInfoFree(db, pW
35fc0 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Info);.  return;
35fd0 0a 7d 0a                                         .}.