/ Hex Artifact Content
Login

Artifact 6e7e932ee32a4b2a0e4741880c06fe7a545e0059:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65  Int.h"../*.** Re
0360: 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61 74  turn the estimat
0370: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
0380: 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61 20  put rows from a 
0390: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a  WHERE clause.*/.
03a0: 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72 65  u64 sqlite3Where
03b0: 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 57  OutputRowCount(W
03c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
03d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
03e0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
03f0: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
0400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0410: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
0420: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
0430: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
0440: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
0450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0460: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
0470: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
0480: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
0490: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
04a0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
04b0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04c0: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
04d0: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
04e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
04f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0500: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
0510: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
0520: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
0530: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
0540: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
0550: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0560: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
0570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0580: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0590: 3e 62 4f 42 53 61 74 21 3d 30 3b 0a 7d 0a 0a 2f  >bOBSat!=0;.}../
05a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
05b0: 56 44 42 45 20 61 64 64 72 65 73 73 20 6f 72 20  VDBE address or 
05c0: 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f  label to jump to
05d0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e   in order to con
05e0: 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61  tinue.** immedia
05f0: 74 65 6c 79 20 77 69 74 68 20 74 68 65 20 6e 65  tely with the ne
0600: 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48 45 52  xt row of a WHER
0610: 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74  E clause..*/.int
0620: 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e   sqlite3WhereCon
0630: 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65 72 65  tinueLabel(Where
0640: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
0650: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
0660: 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  iContinue;.}../*
0670: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56  .** Return the V
0680: 44 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c  DBE address or l
0690: 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20  abel to jump to 
06a0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61  in order to brea
06b0: 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48  k.** out of a WH
06c0: 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74  ERE loop..*/.int
06d0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
06e0: 61 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  akLabel(WhereInf
06f0: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
0700: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72  turn pWInfo->iBr
0710: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eak;.}../*.** Re
0720: 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20  turn TRUE if an 
0730: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
0740: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f   statement can o
0750: 70 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20  perate directly 
0760: 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73  on.** the rowids
0770: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57   returned by a W
0780: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65  HERE clause.  Re
0790: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f  turn FALSE if do
07a0: 69 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45  ing an.** UPDATE
07b0: 20 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74   or DELETE might
07c0: 20 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65   change subseque
07d0: 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  nt WHERE clause 
07e0: 72 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49  results..**.** I
07f0: 66 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70  f the ONEPASS op
0800: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73  timization is us
0810: 65 64 20 28 69 66 20 74 68 69 73 20 72 6f 75 74  ed (if this rout
0820: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65  ine returns true
0830: 29 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77  ).** then also w
0840: 72 69 74 65 20 74 68 65 20 69 6e 64 69 63 65 73  rite the indices
0850: 20 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72 73   of open cursors
0860: 20 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53 53   used by ONEPASS
0870: 0a 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b 30  .** into aiCur[0
0880: 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20  ] and aiCur[1]. 
0890: 20 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20 74   iaCur[0] gets t
08a0: 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65  he cursor of the
08b0: 20 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61   data.** table a
08c0: 6e 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74 73  nd iaCur[1] gets
08d0: 20 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64   the cursor used
08e0: 20 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79   by an auxiliary
08f0: 20 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65   index..** Eithe
0900: 72 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 2d  r value may be -
0910: 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  1, indicating th
0920: 61 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  at cursor is not
0930: 20 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75   used..** Any cu
0940: 72 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20 77  rsors returned w
0950: 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ill have been op
0960: 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  ened for writing
0970: 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d  ..**.** aiCur[0]
0980: 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62 6f   and aiCur[1] bo
0990: 74 68 20 67 65 74 20 2d 31 20 69 66 20 74 68 65  th get -1 if the
09a0: 20 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f   where-clause lo
09b0: 67 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65  gic is.** unable
09c0: 20 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45 50   to use the ONEP
09d0: 41 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ASS optimization
09e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
09f0: 57 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57  WhereOkOnePass(W
0a00: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
0a10: 2c 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20  , int *aiCur){. 
0a20: 20 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20 70   memcpy(aiCur, p
0a30: 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
0a40: 61 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  ass, sizeof(int)
0a50: 2a 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57  *2);.  return pW
0a60: 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b  Info->okOnePass;
0a70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
0a80: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53  he content of pS
0a90: 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f  rc into pDest.*/
0aa0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
0ab0: 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72  reOrMove(WhereOr
0ac0: 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72  Set *pDest, Wher
0ad0: 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20  eOrSet *pSrc){. 
0ae0: 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63   pDest->n = pSrc
0af0: 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44  ->n;.  memcpy(pD
0b00: 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c  est->a, pSrc->a,
0b10: 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66   pDest->n*sizeof
0b20: 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pDest->a[0]));.
0b30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
0b40: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65  insert a new pre
0b50: 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65  requisite/cost e
0b60: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68  ntry into the Wh
0b70: 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a  ereOrSet pSet..*
0b80: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74  *.** The new ent
0b90: 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ry might overwri
0ba0: 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  te an existing e
0bb0: 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  ntry, or it migh
0bc0: 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64  t be.** appended
0bd0: 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  , or it might be
0be0: 20 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20   discarded.  Do 
0bf0: 77 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20  whatever is the 
0c00: 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73  right thing.** s
0c10: 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70  o that pSet keep
0c20: 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20  s the N_OR_COST 
0c30: 62 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65  best entries see
0c40: 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61  n so far..*/.sta
0c50: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49  tic int whereOrI
0c60: 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72  nsert(.  WhereOr
0c70: 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20  Set *pSet,      
0c80: 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65  /* The WhereOrSe
0c90: 74 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  t to be updated 
0ca0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
0cb0: 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  req,        /* P
0cc0: 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20  rerequisites of 
0cd0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
0ce0: 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20  .  LogEst rRun, 
0cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e            /* Run
0d00: 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77  -cost of the new
0d10: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
0d20: 73 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20  st nOut         
0d30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0d40: 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20  outputs for the 
0d50: 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a  new entry */.){.
0d60: 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65    u16 i;.  Where
0d70: 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72  OrCost *p;.  for
0d80: 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53  (i=pSet->n, p=pS
0d90: 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  et->a; i>0; i--,
0da0: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72   p++){.    if( r
0db0: 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20  Run<=p->rRun && 
0dc0: 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65  (prereq & p->pre
0dd0: 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a  req)==prereq ){.
0de0: 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
0df0: 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20  OrInsert_done;. 
0e00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
0e10: 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70  rRun<=rRun && (p
0e20: 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65  ->prereq & prere
0e30: 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b  q)==p->prereq ){
0e40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
0e50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
0e60: 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f   pSet->n<N_OR_CO
0e70: 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  ST ){.    p = &p
0e80: 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b  Set->a[pSet->n++
0e90: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d  ];.    p->nOut =
0ea0: 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nOut;.  }else{.
0eb0: 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b      p = pSet->a;
0ec0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
0ed0: 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  pSet->n; i++){. 
0ee0: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e       if( p->rRun
0ef0: 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e  >pSet->a[i].rRun
0f00: 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b   ) p = pSet->a +
0f10: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
0f20: 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20  ( p->rRun<=rRun 
0f30: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
0f40: 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f  whereOrInsert_do
0f50: 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20  ne:.  p->prereq 
0f60: 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72  = prereq;.  p->r
0f70: 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66  Run = rRun;.  if
0f80: 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  ( p->nOut>nOut )
0f90: 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b   p->nOut = nOut;
0fa0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
0fb0: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
0fc0: 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
0fd0: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
0fe0: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
0ff0: 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73   void whereClaus
1000: 65 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c  eInit(.  WhereCl
1010: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
1020: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c    /* The WhereCl
1030: 61 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69  ause to be initi
1040: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alized */.  Wher
1050: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20  eInfo *pWInfo   
1060: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
1070: 45 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e  E processing con
1080: 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43  text */.){.  pWC
1090: 2d 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66  ->pWInfo = pWInf
10a0: 6f 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72  o;.  pWC->pOuter
10b0: 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65   = 0;.  pWC->nTe
10c0: 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e  rm = 0;.  pWC->n
10d0: 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65  Slot = ArraySize
10e0: 28 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a  (pWC->aStatic);.
10f0: 20 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e    pWC->a = pWC->
1100: 61 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46  aStatic;.}../* F
1110: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1120: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
1130: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
1140: 28 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a  (WhereClause*);.
1150: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
1160: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
1170: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57  ociated with a W
1180: 68 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63  hereOrInfo objec
1190: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
11a0: 64 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c  d whereOrInfoDel
11b0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
11c0: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29   WhereOrInfo *p)
11d0: 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43  {.  whereClauseC
11e0: 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20  lear(&p->wc);.  
11f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1200: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  , p);.}../*.** D
1210: 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65  eallocate all me
1220: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
1230: 77 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49  with a WhereAndI
1240: 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  nfo object..*/.s
1250: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
1260: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71  AndInfoDelete(sq
1270: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
1280: 41 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77  AndInfo *p){.  w
1290: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
12a0: 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74  &p->wc);.  sqlit
12b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
12c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
12d0: 63 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75  cate a WhereClau
12e0: 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  se structure.  T
12f0: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
1300: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65  tructure.** itse
1310: 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e  lf is not freed.
1320: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
1330: 73 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66  s the inverse of
1340: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
1350: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
1360: 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  id whereClauseCl
1370: 65 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20  ear(WhereClause 
1380: 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  *pWC){.  int i;.
1390: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a    WhereTerm *a;.
13a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
13b0: 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61  pWC->pWInfo->pPa
13c0: 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69  rse->db;.  for(i
13d0: 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61  =pWC->nTerm-1, a
13e0: 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69  =pWC->a; i>=0; i
13f0: 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66  --, a++){.    if
1400: 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  ( a->wtFlags & T
1410: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ERM_DYNAMIC ){. 
1420: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1430: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45  Delete(db, a->pE
1440: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xpr);.    }.    
1450: 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26  if( a->wtFlags &
1460: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a   TERM_ORINFO ){.
1470: 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66        whereOrInf
1480: 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75  oDelete(db, a->u
1490: 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  .pOrInfo);.    }
14a0: 65 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c  else if( a->wtFl
14b0: 61 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e  ags & TERM_ANDIN
14c0: 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72  FO ){.      wher
14d0: 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64  eAndInfoDelete(d
14e0: 62 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  b, a->u.pAndInfo
14f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
1500: 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e  f( pWC->a!=pWC->
1510: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73  aStatic ){.    s
1520: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1530: 20 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a   pWC->a);.  }.}.
1540: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e  ./*.** Add a sin
1550: 67 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72  gle new WhereTer
1560: 6d 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57  m entry to the W
1570: 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63  hereClause objec
1580: 74 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65  t pWC..** The ne
1590: 77 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65  w WhereTerm obje
15a0: 63 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65  ct is constructe
15b0: 64 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e  d from Expr p an
15c0: 64 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a  d with wtFlags..
15d0: 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20  ** The index in 
15e0: 70 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  pWC->a[] of the 
15f0: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73  new WhereTerm is
1600: 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
1610: 63 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65  cess..** 0 is re
1620: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65  turned if the ne
1630: 77 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c  w WhereTerm coul
1640: 64 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64  d not be added d
1650: 75 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a  ue to a memory.*
1660: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  * allocation err
1670: 6f 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20  or.  The memory 
1680: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75  allocation failu
1690: 72 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72  re will be recor
16a0: 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62  ded in.** the db
16b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
16c0: 6c 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68  lag so that high
16d0: 65 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f  er-level functio
16e0: 6e 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74  ns can detect it
16f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1700: 74 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61  tine will increa
1710: 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
1720: 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61  he pWC->a[] arra
1730: 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  y as necessary..
1740: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46  **.** If the wtF
1750: 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e  lags argument in
1760: 63 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41  cludes TERM_DYNA
1770: 4d 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e  MIC, then respon
1780: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20  sibility.** for 
1790: 66 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72  freeing the expr
17a0: 65 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75  ession p is assu
17b0: 6d 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65  med by the Where
17c0: 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57  Clause object pW
17d0: 43 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72  C..** This is tr
17e0: 75 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20  ue even if this 
17f0: 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f  routine fails to
1800: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
1810: 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a  WhereTerm..**.**
1820: 20 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20   WARNING:  This 
1830: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65  routine might re
1840: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61  allocate the spa
1850: 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ce used to store
1860: 0a 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20  .** WhereTerms. 
1870: 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f   All pointers to
1880: 20 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75   WhereTerms shou
1890: 6c 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  ld be invalidate
18a0: 64 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69  d after.** calli
18b0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
18c0: 20 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20    Such pointers 
18d0: 6d 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c  may be reinitial
18e0: 69 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63  ized by referenc
18f0: 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e  ing.** the pWC->
1900: 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  a[] array..*/.st
1910: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c  atic int whereCl
1920: 61 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65  auseInsert(Where
1930: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70  Clause *pWC, Exp
1940: 72 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73  r *p, u8 wtFlags
1950: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
1960: 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78  pTerm;.  int idx
1970: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74  ;.  testcase( wt
1980: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1990: 54 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57  TUAL );.  if( pW
19a0: 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e  C->nTerm>=pWC->n
19b0: 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72  Slot ){.    Wher
19c0: 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57  eTerm *pOld = pW
19d0: 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65  C->a;.    sqlite
19e0: 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49  3 *db = pWC->pWI
19f0: 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
1a00: 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71  .    pWC->a = sq
1a10: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1a20: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  (db, sizeof(pWC-
1a30: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f  >a[0])*pWC->nSlo
1a40: 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  t*2 );.    if( p
1a50: 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  WC->a==0 ){.    
1a60: 20 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20    if( wtFlags & 
1a70: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
1a80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a90: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29  xprDelete(db, p)
1aa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ab0: 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20  pWC->a = pOld;. 
1ac0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1ad0: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
1ae0: 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69  pWC->a, pOld, si
1af0: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
1b00: 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  pWC->nTerm);.   
1b10: 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e   if( pOld!=pWC->
1b20: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  aStatic ){.     
1b30: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1b40: 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a  b, pOld);.    }.
1b50: 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d      pWC->nSlot =
1b60: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1b70: 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Size(db, pWC->a)
1b80: 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30  /sizeof(pWC->a[0
1b90: 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20  ]);.  }.  pTerm 
1ba0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20  = &pWC->a[idx = 
1bb0: 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20  pWC->nTerm++];. 
1bc0: 20 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61   if( p && ExprHa
1bd0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
1be0: 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20  Unlikely) ){.   
1bf0: 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
1c00: 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  b = sqlite3LogEs
1c10: 74 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 39  t(p->iTable) - 9
1c20: 39 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  9;.  }else{.    
1c30: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c40: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 70 54 65   = -1;.  }.  pTe
1c50: 72 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69  rm->pExpr = sqli
1c60: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
1c70: 74 65 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e  te(p);.  pTerm->
1c80: 77 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67  wtFlags = wtFlag
1c90: 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20  s;.  pTerm->pWC 
1ca0: 3d 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e  = pWC;.  pTerm->
1cb0: 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20  iParent = -1;.  
1cc0: 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f  return idx;.}../
1cd0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1ce0: 65 20 69 64 65 6e 74 69 66 69 65 73 20 73 75 62  e identifies sub
1cf0: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
1d00: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1d10: 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75  where.** each su
1d20: 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
1d30: 65 70 61 72 61 74 65 64 20 62 79 20 74 68 65 20  eparated by the 
1d40: 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  AND operator or 
1d50: 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70  some other.** op
1d60: 65 72 61 74 6f 72 20 73 70 65 63 69 66 69 65 64  erator specified
1d70: 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d   in the op param
1d80: 65 74 65 72 2e 20 20 54 68 65 20 57 68 65 72 65  eter.  The Where
1d90: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
1da0: 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69  .** is filled wi
1db0: 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73  th pointers to s
1dc0: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  ubexpressions.  
1dd0: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
1de0: 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d  **    WHERE  a==
1df0: 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c  'hello' AND coal
1e00: 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e  esce(b,11)<10 AN
1e10: 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d  D (c+12!=d OR c=
1e20: 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =22).**         
1e30: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20    \________/    
1e40: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
1e50: 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  _/     \________
1e60: 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
1e70: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20          slot[0] 
1e80: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
1e90: 31 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1]              
1ea0: 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54   slot[2].**.** T
1eb0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52  he original WHER
1ec0: 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70  E clause in pExp
1ed0: 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20  r is unaltered. 
1ee0: 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e   All this routin
1ef0: 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b  e.** does is mak
1f00: 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73  e slot[] entries
1f10: 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72   point to substr
1f20: 75 63 74 75 72 65 20 77 69 74 68 69 6e 20 70 45  ucture within pE
1f30: 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  xpr..**.** In th
1f40: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
1f50: 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64  nce and in the d
1f60: 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22  iagram, "slot[]"
1f70: 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68   refers to.** th
1f80: 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b  e WhereClause.a[
1f90: 5d 20 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c  ] array.  The sl
1fa0: 6f 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73  ot[] array grows
1fb0: 20 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f   as needed to co
1fc0: 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72  ntain.** all ter
1fd0: 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
1fe0: 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  clause..*/.stati
1ff0: 63 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69  c void whereSpli
2000: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
2010: 57 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  WC, Expr *pExpr,
2020: 20 75 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e   u8 op){.  pWC->
2030: 6f 70 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70  op = op;.  if( p
2040: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
2050: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
2060: 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65  p!=op ){.    whe
2070: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
2080: 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  WC, pExpr, 0);. 
2090: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72   }else{.    wher
20a0: 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70  eSplit(pWC, pExp
20b0: 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20  r->pLeft, op);. 
20c0: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57     whereSplit(pW
20d0: 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  C, pExpr->pRight
20e0: 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  , op);.  }.}../*
20f0: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
2100: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62   WhereMaskSet ob
2110: 6a 65 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ject.*/.#define 
2120: 69 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20  initMaskSet(P)  
2130: 28 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20  (P)->n=0../*.** 
2140: 52 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61  Return the bitma
2150: 73 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  sk for the given
2160: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20   cursor number. 
2170: 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20   Return 0 if.** 
2180: 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69  iCursor is not i
2190: 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74  n the set..*/.st
21a0: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74  atic Bitmask get
21b0: 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65  Mask(WhereMaskSe
21c0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74  t *pMaskSet, int
21d0: 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74   iCursor){.  int
21e0: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   i;.  assert( pM
21f0: 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29  askSet->n<=(int)
2200: 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a  sizeof(Bitmask)*
2210: 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  8 );.  for(i=0; 
2220: 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69  i<pMaskSet->n; i
2230: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61  ++){.    if( pMa
2240: 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43  skSet->ix[i]==iC
2250: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72  ursor ){.      r
2260: 65 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29  eturn MASKBIT(i)
2270: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2280: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2290: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61   Create a new ma
22a0: 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43  sk for cursor iC
22b0: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
22c0: 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72  re is one cursor
22d0: 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68   per table in th
22e0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
22f0: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  The number of.**
2300: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
2310: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
2320: 6d 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20  mited by a test 
2330: 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20  early in the.** 
2340: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2350: 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f  n() routine.  So
2360: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
2370: 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d  e pMaskSet->ix[]
2380: 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e  .** array will n
2390: 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a  ever overflow..*
23a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72  /.static void cr
23b0: 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61  eateMask(WhereMa
23c0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
23d0: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
23e0: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
23f0: 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65  t->n < ArraySize
2400: 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29  (pMaskSet->ix) )
2410: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  ;.  pMaskSet->ix
2420: 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20  [pMaskSet->n++] 
2430: 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a  = iCursor;.}../*
2440: 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
2450: 65 73 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69  es walk (recursi
2460: 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73  vely) an express
2470: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e  ion tree and gen
2480: 65 72 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61  erate.** a bitma
2490: 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68  sk indicating wh
24a0: 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75  ich tables are u
24b0: 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72  sed in that expr
24c0: 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a  ession.** tree..
24d0: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
24e0: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
24f0: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
2500: 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  t*, ExprList*);.
2510: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
2520: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
2530: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
2540: 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61  *, Select*);.sta
2550: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
2560: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
2570: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
2580: 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42  t, Expr *p){.  B
2590: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
25a0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
25b0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
25c0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
25d0: 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74  {.    mask = get
25e0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
25f0: 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72  ->iTable);.    r
2600: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a  eturn mask;.  }.
2610: 20 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62    mask = exprTab
2620: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2630: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
2640: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
2650: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2660: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66   p->pLeft);.  if
2670: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
2680: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
2690: 74 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c  t) ){.    mask |
26a0: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
26b0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
26c0: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a   p->x.pSelect);.
26d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73    }else{.    mas
26e0: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
26f0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2700: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  , p->x.pList);. 
2710: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
2720: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
2730: 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  sk exprListTable
2740: 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53  Usage(WhereMaskS
2750: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78  et *pMaskSet, Ex
2760: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
2770: 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61    int i;.  Bitma
2780: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69  sk mask = 0;.  i
2790: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
27a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
27b0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
27c0: 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70       mask |= exp
27d0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
27e0: 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  kSet, pList->a[i
27f0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ].pExpr);.    }.
2800: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73    }.  return mas
2810: 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d  k;.}.static Bitm
2820: 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61  ask exprSelectTa
2830: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
2840: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
2850: 20 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20   Select *pS){.  
2860: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30  Bitmask mask = 0
2870: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b  ;.  while( pS ){
2880: 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
2890: 72 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  rc = pS->pSrc;. 
28a0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
28b0: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
28c0: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69  askSet, pS->pELi
28d0: 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  st);.    mask |=
28e0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
28f0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
2900: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
2910: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
2920: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
2930: 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72  kSet, pS->pOrder
2940: 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  By);.    mask |=
2950: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
2960: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57  pMaskSet, pS->pW
2970: 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20  here);.    mask 
2980: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
2990: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
29a0: 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66  pHaving);.    if
29b0: 28 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30  ( ALWAYS(pSrc!=0
29c0: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
29d0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
29e0: 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69   i<pSrc->nSrc; i
29f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73  ++){.        mas
2a00: 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54  k |= exprSelectT
2a10: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2a20: 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  et, pSrc->a[i].p
2a30: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
2a40: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
2a50: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2a60: 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e  , pSrc->a[i].pOn
2a70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2a80: 0a 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50  .    pS = pS->pP
2a90: 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rior;.  }.  retu
2aa0: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn mask;.}../*.*
2ab0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
2ac0: 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61   the given opera
2ad0: 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  tor is one of th
2ae0: 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  e operators that
2af0: 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66   is.** allowed f
2b00: 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20  or an indexable 
2b10: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
2b20: 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20  m.  The allowed 
2b30: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a  operators are.**
2b40: 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20   "=", "<", ">", 
2b50: 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22  "<=", ">=", "IN"
2b60: 2c 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a  , and "IS NULL".
2b70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
2b80: 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b  lowedOp(int op){
2b90: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54  .  assert( TK_GT
2ba0: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c  >TK_EQ && TK_GT<
2bb0: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
2bc0: 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26  t( TK_LT>TK_EQ &
2bd0: 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b  & TK_LT<TK_GE );
2be0: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45  .  assert( TK_LE
2bf0: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c  >TK_EQ && TK_LE<
2c00: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
2c10: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b  t( TK_GE==TK_EQ+
2c20: 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70  4 );.  return op
2c30: 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d  ==TK_IN || (op>=
2c40: 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f  TK_EQ && op<=TK_
2c50: 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53  GE) || op==TK_IS
2c60: 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  NULL;.}../*.** S
2c70: 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20  wap two objects 
2c80: 6f 66 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f  of type TYPE..*/
2c90: 0a 23 64 65 66 69 6e 65 20 53 57 41 50 28 54 59  .#define SWAP(TY
2ca0: 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d  PE,A,B) {TYPE t=
2cb0: 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f  A; A=B; B=t;}../
2cc0: 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63  *.** Commute a c
2cd0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
2ce0: 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73  or.  Expressions
2cf0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
2d00: 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e  op Y".** are con
2d10: 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f  verted into "Y o
2d20: 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c  p X"..**.** If l
2d30: 65 66 74 2f 72 69 67 68 74 20 70 72 65 63 65 64  eft/right preced
2d40: 65 6e 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20  ence rules come 
2d50: 69 6e 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64  into play when d
2d60: 65 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a  etermining the.*
2d70: 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * collating sequ
2d80: 65 6e 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c 41  ence, then COLLA
2d90: 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65  TE operators are
2da0: 20 61 64 6a 75 73 74 65 64 20 74 6f 20 65 6e 73   adjusted to ens
2db0: 75 72 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ure.** that the 
2dc0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
2dd0: 63 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e  ce does not chan
2de0: 67 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ge.  For example
2df0: 3a 0a 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65 20  :.** "Y collate 
2e00: 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62 65 63  NOCASE op X" bec
2e10: 6f 6d 65 73 20 22 58 20 6f 70 20 59 22 20 62 65  omes "X op Y" be
2e20: 63 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74  cause any collat
2e30: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a  ion sequence on.
2e40: 2a 2a 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64  ** the left hand
2e50: 20 73 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61   side of a compa
2e60: 72 69 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  rison overrides 
2e70: 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  any collation se
2e80: 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63  quence .** attac
2e90: 68 65 64 20 74 6f 20 74 68 65 20 72 69 67 68 74  hed to the right
2ea0: 2e 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72  . For the same r
2eb0: 65 61 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c  eason the EP_Col
2ec0: 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20  late flag.** is 
2ed0: 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f  not commuted..*/
2ee0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
2ef0: 72 43 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a  rCommute(Parse *
2f00: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
2f10: 78 70 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52  xpr){.  u16 expR
2f20: 69 67 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70  ight = (pExpr->p
2f30: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
2f40: 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31  P_Collate);.  u1
2f50: 36 20 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78  6 expLeft = (pEx
2f60: 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73  pr->pLeft->flags
2f70: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a   & EP_Collate);.
2f80: 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65    assert( allowe
2f90: 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26  dOp(pExpr->op) &
2fa0: 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  & pExpr->op!=TK_
2fb0: 49 4e 20 29 3b 0a 20 20 69 66 28 20 65 78 70 52  IN );.  if( expR
2fc0: 69 67 68 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b  ight==expLeft ){
2fd0: 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 58  .    /* Either X
2fe0: 20 61 6e 64 20 59 20 62 6f 74 68 20 68 61 76 65   and Y both have
2ff0: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
3000: 72 20 6f 72 20 6e 65 69 74 68 65 72 20 64 6f 20  r or neither do 
3010: 2a 2f 0a 20 20 20 20 69 66 28 20 65 78 70 52 69  */.    if( expRi
3020: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ght ){.      /* 
3030: 42 6f 74 68 20 58 20 61 6e 64 20 59 20 68 61 76  Both X and Y hav
3040: 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  e COLLATE operat
3050: 6f 72 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ors.  Make sure 
3060: 58 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20  X is always.    
3070: 20 20 2a 2a 20 75 73 65 64 20 62 79 20 63 6c 65    ** used by cle
3080: 61 72 69 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c  aring the EP_Col
3090: 6c 61 74 65 20 66 6c 61 67 20 66 72 6f 6d 20 59  late flag from Y
30a0: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72  . */.      pExpr
30b0: 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ->pRight->flags 
30c0: 26 3d 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a  &= ~EP_Collate;.
30d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
30e0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
30f0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
3100: 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20  pLeft)!=0 ){.   
3110: 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 58 20     /* Neither X 
3120: 6e 6f 72 20 59 20 68 61 76 65 20 43 4f 4c 4c 41  nor Y have COLLA
3130: 54 45 20 6f 70 65 72 61 74 6f 72 73 2c 20 62 75  TE operators, bu
3140: 74 20 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65  t X has a non-de
3150: 66 61 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63  fault.      ** c
3160: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
3170: 65 2e 20 20 53 6f 20 61 64 64 20 74 68 65 20 45  e.  So add the E
3180: 50 5f 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72  P_Collate marker
3190: 20 6f 6e 20 58 20 74 6f 20 63 61 75 73 65 0a 20   on X to cause. 
31a0: 20 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65       ** it to be
31b0: 20 73 65 61 72 63 68 65 64 20 66 69 72 73 74 2e   searched first.
31c0: 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
31d0: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d  >pLeft->flags |=
31e0: 20 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20   EP_Collate;.   
31f0: 20 7d 0a 20 20 7d 0a 20 20 53 57 41 50 28 45 78   }.  }.  SWAP(Ex
3200: 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68  pr*,pExpr->pRigh
3210: 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  t,pExpr->pLeft);
3220: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
3230: 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61  >=TK_GT ){.    a
3240: 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b  ssert( TK_LT==TK
3250: 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73  _GT+2 );.    ass
3260: 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c  ert( TK_GE==TK_L
3270: 45 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  E+2 );.    asser
3280: 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29  t( TK_GT>TK_EQ )
3290: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
32a0: 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  _GT<TK_LE );.   
32b0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
32c0: 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78  op>=TK_GT && pEx
32d0: 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b  pr->op<=TK_GE );
32e0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
32f0: 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f   ((pExpr->op-TK_
3300: 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20  GT)^2)+TK_GT;.  
3310: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  }.}../*.** Trans
3320: 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20  late from TK_xx 
3330: 6f 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78  operator to WO_x
3340: 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74  x bitmask..*/.st
3350: 61 74 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f  atic u16 operato
3360: 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20  rMask(int op){. 
3370: 20 75 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74   u16 c;.  assert
3380: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20  ( allowedOp(op) 
3390: 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
33a0: 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f  IN ){.    c = WO
33b0: 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _IN;.  }else if(
33c0: 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
33d0: 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e  {.    c = WO_ISN
33e0: 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
33f0: 20 20 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51    assert( (WO_EQ
3400: 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20  <<(op-TK_EQ)) < 
3410: 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20  0x7fff );.    c 
3420: 3d 20 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28  = (u16)(WO_EQ<<(
3430: 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a  op-TK_EQ));.  }.
3440: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
3450: 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f  _ISNULL || c==WO
3460: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73  _ISNULL );.  ass
3470: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c  ert( op!=TK_IN |
3480: 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20  | c==WO_IN );.  
3490: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45  assert( op!=TK_E
34a0: 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b  Q || c==WO_EQ );
34b0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
34c0: 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54  K_LT || c==WO_LT
34d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
34e0: 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f  !=TK_LE || c==WO
34f0: 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _LE );.  assert(
3500: 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d   op!=TK_GT || c=
3510: 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65  =WO_GT );.  asse
3520: 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c  rt( op!=TK_GE ||
3530: 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72   c==WO_GE );.  r
3540: 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn c;.}../*.*
3550: 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65  * Advance to the
3560: 20 6e 65 78 74 20 57 68 65 72 65 54 65 72 6d 20   next WhereTerm 
3570: 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 63 63  that matches acc
3580: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72  ording to the cr
3590: 69 74 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c  iteria.** establ
35a0: 69 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 70  ished when the p
35b0: 53 63 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20  Scan object was 
35c0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77  initialized by w
35d0: 68 65 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a  hereScanInit()..
35e0: 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
35f0: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  f there are no m
3600: 6f 72 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65  ore matching Whe
3610: 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74  reTerms..*/.stat
3620: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68  ic WhereTerm *wh
3630: 65 72 65 53 63 61 6e 4e 65 78 74 28 57 68 65 72  ereScanNext(Wher
3640: 65 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20  eScan *pScan){. 
3650: 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
3660: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
3670: 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f  sor on the LHS o
3680: 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20  f the term */.  
3690: 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  int iColumn;    
36a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75       /* The colu
36b0: 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66  mn on the LHS of
36c0: 20 74 68 65 20 74 65 72 6d 2e 20 20 2d 31 20 66   the term.  -1 f
36d0: 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72  or IPK */.  Expr
36e0: 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
36f0: 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f   /* An expressio
3700: 6e 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a  n being tested *
3710: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
3720: 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72  *pWC;    /* Shor
3730: 74 68 61 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d  thand for pScan-
3740: 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65 72 65 54  >pWC */.  WhereT
3750: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f  erm *pTerm;    /
3760: 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67  * The term being
3770: 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74   tested */.  int
3780: 20 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20   k = pScan->k;  
3790: 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74    /* Where to st
37a0: 61 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a  art scanning */.
37b0: 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d  .  while( pScan-
37c0: 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e  >iEquiv<=pScan->
37d0: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43  nEquiv ){.    iC
37e0: 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75  ur = pScan->aEqu
37f0: 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  iv[pScan->iEquiv
3800: 2d 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e  -2];.    iColumn
3810: 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76   = pScan->aEquiv
3820: 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31  [pScan->iEquiv-1
3830: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70  ];.    while( (p
3840: 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29  WC = pScan->pWC)
3850: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  !=0 ){.      for
3860: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b  (pTerm=pWC->a+k;
3870: 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b   k<pWC->nTerm; k
3880: 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
3890: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
38a0: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
38b0: 72 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 54  r.         && pT
38c0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
38d0: 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  n==iColumn.     
38e0: 20 20 20 20 26 26 20 28 70 53 63 61 6e 2d 3e 69      && (pScan->i
38f0: 45 71 75 69 76 3c 3d 32 20 7c 7c 20 21 45 78 70  Equiv<=2 || !Exp
3900: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
3910: 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
3920: 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 20  omJoin)).       
3930: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
3940: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
3950: 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21  tor & WO_EQUIV)!
3960: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
3970: 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41   pScan->nEquiv<A
3980: 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e  rraySize(pScan->
3990: 61 45 71 75 69 76 29 0a 20 20 20 20 20 20 20 20  aEquiv).        
39a0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
39b0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
39c0: 20 20 20 20 70 58 20 3d 20 73 71 6c 69 74 65 33      pX = sqlite3
39d0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
39e0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
39f0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
3a00: 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f     assert( pX->o
3a10: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
3a30: 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45  j=0; j<pScan->nE
3a40: 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20  quiv; j+=2){.   
3a50: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
3a60: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d  Scan->aEquiv[j]=
3a70: 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20  =pX->iTable.    
3a80: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 53             && pS
3a90: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d  can->aEquiv[j+1]
3aa0: 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  ==pX->iColumn ){
3ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3ac0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3ad0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3ae0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3af0: 20 20 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e      if( j==pScan
3b00: 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20  ->nEquiv ){.    
3b10: 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d            pScan-
3b20: 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58 2d  >aEquiv[j] = pX-
3b30: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
3b40: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45         pScan->aE
3b50: 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e  quiv[j+1] = pX->
3b60: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
3b70: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45         pScan->nE
3b80: 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20  quiv += 2;.     
3b90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3ba0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
3bb0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
3bc0: 61 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70  ator & pScan->op
3bd0: 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  Mask)!=0 ){.    
3be0: 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66          /* Verif
3bf0: 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 61  y the affinity a
3c00: 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nd collating seq
3c10: 75 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20  uence match */. 
3c20: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
3c30: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20  Scan->zCollName 
3c40: 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  && (pTerm->eOper
3c50: 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
3c60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
3c70: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
3c80: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
3c90: 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73      Parse *pPars
3ca0: 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d  e = pWC->pWInfo-
3cb0: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
3cc0: 20 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72         pX = pTer
3cd0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
3ce0: 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
3cf0: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
3d00: 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69  yOk(pX, pScan->i
3d10: 64 78 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20  dxaff) ){.      
3d20: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
3d30: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
3d40: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
3d50: 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65    assert(pX->pLe
3d60: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ft);.           
3d70: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
3d80: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
3d90: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20  ollSeq(pParse,. 
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e   pX->pLeft, pX->
3de0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
3df0: 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
3e00: 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50  ==0 ) pColl = pP
3e10: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
3e20: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
3e30: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
3e40: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
3e50: 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c  me, pScan->zColl
3e60: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
3e70: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
3e80: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
3e90: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
3ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
3eb0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3ec0: 6f 72 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20  or & WO_EQ)!=0. 
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
3ee0: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
3ef0: 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d  r->pRight)->op==
3f00: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
3f10: 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54         && pX->iT
3f20: 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71  able==pScan->aEq
3f30: 75 69 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20  uiv[0].         
3f40: 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75      && pX->iColu
3f50: 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69  mn==pScan->aEqui
3f60: 76 5b 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20  v[1].           
3f70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3f80: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
3f90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3fa0: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d        pScan->k =
3fb0: 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20   k+1;.          
3fc0: 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a    return pTerm;.
3fd0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3fe0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3ff0: 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d      pScan->pWC =
4000: 20 70 53 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75   pScan->pWC->pOu
4010: 74 65 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30  ter;.      k = 0
4020: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61  ;.    }.    pSca
4030: 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e  n->pWC = pScan->
4040: 70 4f 72 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d  pOrigWC;.    k =
4050: 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69   0;.    pScan->i
4060: 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a  Equiv += 2;.  }.
4070: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
4080: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
4090: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73  a WHERE clause s
40a0: 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20  canner object.  
40b0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
40c0: 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   to the.** first
40d0: 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20   match.  Return 
40e0: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
40f0: 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a  e no matches..**
4100: 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20  .** The scanner 
4110: 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e  will be searchin
4120: 67 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  g the WHERE clau
4130: 73 65 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c  se pWC.  It will
4140: 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72   look.** for ter
4150: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ms of the form "
4160: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77  X <op> <expr>" w
4170: 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e  here X is column
4180: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
4190: 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54 68 65 20  e.** iCur.  The 
41a0: 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65  <op> must be one
41b0: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
41c0: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 6f  s described by o
41d0: 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pMask..**.** If 
41e0: 74 68 65 20 73 65 61 72 63 68 20 69 73 20 66 6f  the search is fo
41f0: 72 20 58 20 61 6e 64 20 74 68 65 20 57 48 45 52  r X and the WHER
4200: 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
4210: 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  s terms of the.*
4220: 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20  * form X=Y then 
4230: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
4240: 68 74 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74  ht also return t
4250: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
4260: 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70  .** "Y <op> <exp
4270: 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  r>".  The number
4280: 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72   of levels of tr
4290: 61 6e 73 69 74 69 76 69 74 79 20 69 73 20 6c 69  ansitivity is li
42a0: 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73  mited,.** but is
42b0: 20 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c   enough to handl
42c0: 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20  e most commonly 
42d0: 6f 63 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74  occurring SQL st
42e0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
42f0: 49 66 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20  If X is not the 
4300: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
4310: 4b 45 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20  KEY then X must 
4320: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
4330: 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78  th.** index pIdx
4340: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
4350: 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e  eTerm *whereScan
4360: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53 63 61  Init(.  WhereSca
4370: 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20  n *pScan,       
4380: 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63 61 6e  /* The WhereScan
4390: 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e   object being in
43a0: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57  itialized */.  W
43b0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
43c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
43d0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
43e0: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e   scanned */.  in
43f0: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
4400: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
4410: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
4420: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
4430: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
4440: 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  mn to scan for *
4450: 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20  /.  u32 opMask, 
4460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4470: 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63  perator(s) to sc
4480: 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  an for */.  Inde
4490: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
44a0: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
44b0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
44c0: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a  his index */.){.
44d0: 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d    int j;..  /* m
44e0: 65 6d 73 65 74 28 70 53 63 61 6e 2c 20 30 2c 20  emset(pScan, 0, 
44f0: 73 69 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b  sizeof(*pScan));
4500: 20 2a 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72   */.  pScan->pOr
4510: 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53  igWC = pWC;.  pS
4520: 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a  can->pWC = pWC;.
4530: 20 20 69 66 28 20 70 49 64 78 20 26 26 20 69 43    if( pIdx && iC
4540: 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
4550: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20  pScan->idxaff = 
4560: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
4570: 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  ol[iColumn].affi
4580: 6e 69 74 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  nity;.    for(j=
4590: 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  0; pIdx->aiColum
45a0: 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a  n[j]!=iColumn; j
45b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4e  ++){.      if( N
45c0: 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 4b  EVER(j>=pIdx->nK
45d0: 65 79 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 20  eyCol) ) return 
45e0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63  0;.    }.    pSc
45f0: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20  an->zCollName = 
4600: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b  pIdx->azColl[j];
4610: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53  .  }else{.    pS
4620: 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b  can->idxaff = 0;
4630: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  .    pScan->zCol
4640: 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  lName = 0;.  }. 
4650: 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d   pScan->opMask =
4660: 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e   opMask;.  pScan
4670: 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e  ->k = 0;.  pScan
4680: 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d 20 69 43  ->aEquiv[0] = iC
4690: 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71  ur;.  pScan->aEq
46a0: 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e  uiv[1] = iColumn
46b0: 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69  ;.  pScan->nEqui
46c0: 76 20 3d 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e  v = 2;.  pScan->
46d0: 69 45 71 75 69 76 20 3d 20 32 3b 0a 20 20 72 65  iEquiv = 2;.  re
46e0: 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65  turn whereScanNe
46f0: 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a  xt(pScan);.}../*
4700: 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61  .** Search for a
4710: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
4720: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
4730: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
4740: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a   <op> <expr>".**
4750: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 72 65   where X is a re
4760: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69  ference to the i
4770: 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  Column of table 
4780: 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73  iCur and <op> is
4790: 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57   one of.** the W
47a0: 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f  O_xx operator co
47b0: 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62 79  des specified by
47c0: 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65   the op paramete
47d0: 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  r..** Return a p
47e0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65  ointer to the te
47f0: 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  rm.  Return 0 if
4800: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
4810: 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74 75 72  * The term retur
4820: 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59 3d 3c  ned might by Y=<
4830: 65 78 70 72 3e 20 69 66 20 74 68 65 72 65 20 69  expr> if there i
4840: 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72  s another constr
4850: 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57  aint in.** the W
4860: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
4870: 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20   specifies that 
4880: 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68 20 63  X=Y.  Any such c
4890: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
48a0: 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64  be.** identified
48b0: 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55 49 56   by the WO_EQUIV
48c0: 20 62 69 74 20 69 6e 20 74 68 65 20 70 54 65 72   bit in the pTer
48d0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66 69 65  m->eOperator fie
48e0: 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45 71 75  ld.  The.** aEqu
48f0: 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64 73  iv[] array holds
4900: 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65   X and all its e
4910: 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69 74 68  quivalents, with
4920: 20 65 61 63 68 20 53 51 4c 20 76 61 72 69 61 62   each SQL variab
4930: 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20  le.** taking up 
4940: 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61 45 71  two slots in aEq
4950: 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69 72 73  uiv[].  The firs
4960: 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20 74 68  t slot is for th
4970: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a  e cursor number.
4980: 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  ** and the secon
4990: 64 20 69 73 20 66 6f 72 20 74 68 65 20 63 6f 6c  d is for the col
49a0: 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  umn number.  The
49b0: 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74 73 20  re are 22 slots 
49c0: 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73  in aEquiv[].** s
49d0: 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  o that means we 
49e0: 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70  can look for X p
49f0: 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f 74 68  lus up to 10 oth
4a00: 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61  er equivalent va
4a10: 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61  lues..** Hence a
4a20: 20 73 65 61 72 63 68 20 66 6f 72 20 58 20 77 69   search for X wi
4a30: 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e  ll return <expr>
4a40: 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41 31 3d   if X=A1 and A1=
4a50: 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20  A2 and A2=A3.** 
4a60: 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41  and ... and A9=A
4a70: 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72  10 and A10=<expr
4a80: 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  >..**.** If ther
4a90: 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74  e are multiple t
4aa0: 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
4ab0: 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
4ac0: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
4ad0: 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79  pr>".** then try
4ae0: 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74   for the one wit
4af0: 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65  h no dependencie
4b00: 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e  s on <expr> - in
4b10: 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77 68 65   other words whe
4b20: 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20  re.** <expr> is 
4b30: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
4b40: 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69  ssion of some ki
4b50: 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e  nd.  Only return
4b60: 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74   entries of.** t
4b70: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
4b80: 59 22 20 77 68 65 72 65 20 59 20 69 73 20 61 20  Y" where Y is a 
4b90: 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65  column in anothe
4ba0: 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65  r table if no te
4bb0: 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f  rms of.** the fo
4bc0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73  rm "X <op> <cons
4bd0: 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20  t-expr>" exist. 
4be0: 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69    If no terms wi
4bf0: 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48  th a constant RH
4c00: 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20  S.** exist, try 
4c10: 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d  to return a term
4c20: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75   that does not u
4c30: 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a  se WO_EQUIV..*/.
4c40: 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72 6d  static WhereTerm
4c50: 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68   *findTerm(.  Wh
4c60: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
4c70: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
4c80: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65   clause to be se
4c90: 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20  arched */.  int 
4ca0: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
4cb0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
4cc0: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69  er of LHS */.  i
4cd0: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
4ce0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
4cf0: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
4d00: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
4d10: 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d  dy,     /* RHS m
4d20: 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20  ust not overlap 
4d30: 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a  with this mask *
4d40: 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20  /.  u32 op,     
4d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
4d60: 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65  k of WO_xx value
4d70: 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65  s describing ope
4d80: 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78  rator */.  Index
4d90: 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
4da0: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
4db0: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
4dc0: 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e   index, if not N
4dd0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ULL */.){.  Wher
4de0: 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d  eTerm *pResult =
4df0: 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   0;.  WhereTerm 
4e00: 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20  *p;.  WhereScan 
4e10: 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65  scan;..  p = whe
4e20: 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
4e30: 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f  , pWC, iCur, iCo
4e40: 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b  lumn, op, pIdx);
4e50: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
4e60: 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
4e70: 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64  qRight & notRead
4e80: 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  y)==0 ){.      i
4e90: 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69 67 68  f( p->prereqRigh
4ea0: 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70 65  t==0 && (p->eOpe
4eb0: 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20  rator&WO_EQ)!=0 
4ec0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
4ed0: 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n p;.      }.   
4ee0: 20 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d     if( pResult==
4ef0: 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b  0 ) pResult = p;
4f00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77  .    }.    p = w
4f10: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63  hereScanNext(&sc
4f20: 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  an);.  }.  retur
4f30: 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a  n pResult;.}../*
4f40: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
4f50: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
4f60: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72  d exprAnalyze(Sr
4f70: 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61  cList*, WhereCla
4f80: 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  use*, int);../*.
4f90: 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c  ** Call exprAnal
4fa0: 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  yze on all terms
4fb0: 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
4fc0: 73 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  se.  .*/.static 
4fd0: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
4fe0: 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  All(.  SrcList *
4ff0: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
5000: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
5010: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
5020: 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 20 20  use *pWC        
5030: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
5040: 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79  ause to be analy
5050: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  zed */.){.  int 
5060: 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  i;.  for(i=pWC->
5070: 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  nTerm-1; i>=0; i
5080: 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61  --){.    exprAna
5090: 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70  lyze(pTabList, p
50a0: 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  WC, i);.  }.}..#
50b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
50c0: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
50d0: 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  TION./*.** Check
50e0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67   to see if the g
50f0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
5100: 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f  is a LIKE or GLO
5110: 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a  B operator that.
5120: 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69  ** can be optimi
5130: 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61  zed using inequa
5140: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
5150: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
5160: 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e  f it is.** so an
5170: 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  d false if not..
5180: 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66  **.** In order f
5190: 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  or the operator 
51a0: 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c  to be optimizibl
51b0: 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74 20  e, the RHS must 
51c0: 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c  be a string.** l
51d0: 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73  iteral that does
51e0: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
51f0: 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f  a wildcard.  .*/
5200: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69  .static int isLi
5210: 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73  keOrGlob(.  Pars
5220: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
5230: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
5240: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
5250: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
5260: 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
5270: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
5280: 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  ion */.  Expr **
5290: 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f  ppPrefix,  /* Po
52a0: 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49  inter to TK_STRI
52b0: 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  NG expression wi
52c0: 74 68 20 70 61 74 74 65 72 6e 20 70 72 65 66 69  th pattern prefi
52d0: 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43  x */.  int *pisC
52e0: 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65  omplete, /* True
52f0: 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c   if the only wil
5300: 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74 68  dcard is % in th
5310: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
5320: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61   */.  int *pnoCa
5330: 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  se      /* True 
5340: 69 66 20 75 70 70 65 72 63 61 73 65 20 69 73 20  if uppercase is 
5350: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f  equivalent to lo
5360: 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20  wercase */.){.  
5370: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
5380: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  0;         /* St
5390: 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c  ring on RHS of L
53a0: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
53b0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
53c0: 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20  *pLeft;      /* 
53d0: 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73  Right and left s
53e0: 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72  ize of LIKE oper
53f0: 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ator */.  ExprLi
5400: 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  st *pList;      
5410: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
5420: 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20  operands to the 
5430: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
5440: 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20  .  int c;       
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5460: 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20 69   One character i
5470: 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63  n z[] */.  int c
5480: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
5490: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
54a0: 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20  of non-wildcard 
54b0: 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72  prefix character
54c0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33  s */.  char wc[3
54d0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
54e0: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68    /* Wildcard ch
54f0: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71  aracters */.  sq
5500: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
5510: 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
5520: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
5530: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
5540: 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20  ue *pVal = 0;.  
5550: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
5560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
5570: 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a  code of pRight *
5580: 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  /..  if( !sqlite
5590: 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28  3IsLikeFunction(
55a0: 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61  db, pExpr, pnoCa
55b0: 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72  se, wc) ){.    r
55c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66  eturn 0;.  }.#if
55d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49  def SQLITE_EBCDI
55e0: 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65  C.  if( *pnoCase
55f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
5600: 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45  dif.  pList = pE
5610: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
5620: 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61  pLeft = pList->a
5630: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [1].pExpr;.  if(
5640: 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43   pLeft->op!=TK_C
5650: 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c  OLUMN .   || sql
5660: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
5670: 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f  (pLeft)!=SQLITE_
5680: 41 46 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20  AFF_TEXT .   || 
5690: 49 73 56 69 72 74 75 61 6c 28 70 4c 65 66 74 2d  IsVirtual(pLeft-
56a0: 3e 70 54 61 62 29 0a 20 20 29 7b 0a 20 20 20 20  >pTab).  ){.    
56b0: 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d  /* IMP: R-02065-
56c0: 34 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68  49465 The left-h
56d0: 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
56e0: 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65  LIKE or GLOB ope
56f0: 72 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a  rator must.    *
5700: 2a 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  * be the name of
5710: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
5720: 6d 6e 20 77 69 74 68 20 54 45 58 54 20 61 66 66  mn with TEXT aff
5730: 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65  inity. */.    re
5740: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73  turn 0;.  }.  as
5750: 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f  sert( pLeft->iCo
5760: 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a  lumn!=(-1) ); /*
5770: 20 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76   Because IPK nev
5780: 65 72 20 68 61 73 20 41 46 46 5f 54 45 58 54 20  er has AFF_TEXT 
5790: 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 70  */..  pRight = p
57a0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
57b0: 3b 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d  ;.  op = pRight-
57c0: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
57d0: 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20  K_REGISTER ){.  
57e0: 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f    op = pRight->o
57f0: 70 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70  p2;.  }.  if( op
5800: 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b  ==TK_VARIABLE ){
5810: 0a 20 20 20 20 56 64 62 65 20 2a 70 52 65 70 72  .    Vdbe *pRepr
5820: 65 70 61 72 65 20 3d 20 70 50 61 72 73 65 2d 3e  epare = pParse->
5830: 70 52 65 70 72 65 70 61 72 65 3b 0a 20 20 20 20  pReprepare;.    
5840: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69 67 68  int iCol = pRigh
5850: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
5860: 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  pVal = sqlite3Vd
5870: 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28  beGetBoundValue(
5880: 70 52 65 70 72 65 70 61 72 65 2c 20 69 43 6f 6c  pReprepare, iCol
5890: 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  , SQLITE_AFF_NON
58a0: 45 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c  E);.    if( pVal
58b0: 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   && sqlite3_valu
58c0: 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53 51  e_type(pVal)==SQ
58d0: 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20  LITE_TEXT ){.   
58e0: 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29 73     z = (char *)s
58f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
5900: 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  t(pVal);.    }. 
5910: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
5920: 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d  tVarmask(pParse-
5930: 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b 0a 20  >pVdbe, iCol);. 
5940: 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
5950: 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42  t->op==TK_VARIAB
5960: 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70  LE || pRight->op
5970: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  ==TK_REGISTER );
5980: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
5990: 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20  =TK_STRING ){.  
59a0: 20 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e    z = pRight->u.
59b0: 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66  zToken;.  }.  if
59c0: 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d  ( z ){.    cnt =
59d0: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   0;.    while( (
59e0: 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20  c=z[cnt])!=0 && 
59f0: 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77  c!=wc[0] && c!=w
5a00: 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d  c[1] && c!=wc[2]
5a10: 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b   ){.      cnt++;
5a20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
5a30: 6e 74 21 3d 30 20 26 26 20 32 35 35 21 3d 28 75  nt!=0 && 255!=(u
5a40: 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20  8)z[cnt-1] ){.  
5a50: 20 20 20 20 45 78 70 72 20 2a 70 50 72 65 66 69      Expr *pPrefi
5a60: 78 3b 0a 20 20 20 20 20 20 2a 70 69 73 43 6f 6d  x;.      *pisCom
5a70: 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d  plete = c==wc[0]
5a80: 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b   && z[cnt+1]==0;
5a90: 0a 20 20 20 20 20 20 70 50 72 65 66 69 78 20 3d  .      pPrefix =
5aa0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
5ab0: 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a   TK_STRING, z);.
5ac0: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 66 69        if( pPrefi
5ad0: 78 20 29 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a  x ) pPrefix->u.z
5ae0: 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a  Token[cnt] = 0;.
5af0: 20 20 20 20 20 20 2a 70 70 50 72 65 66 69 78 20        *ppPrefix 
5b00: 3d 20 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20  = pPrefix;.     
5b10: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49   if( op==TK_VARI
5b20: 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ABLE ){.        
5b30: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
5b40: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20 20 20  ->pVdbe;.       
5b50: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
5b60: 61 72 6d 61 73 6b 28 76 2c 20 70 52 69 67 68 74  armask(v, pRight
5b70: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
5b80: 20 20 20 20 69 66 28 20 2a 70 69 73 43 6f 6d 70      if( *pisComp
5b90: 6c 65 74 65 20 26 26 20 70 52 69 67 68 74 2d 3e  lete && pRight->
5ba0: 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20  u.zToken[1] ){. 
5bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
5bc0: 68 65 20 72 68 73 20 6f 66 20 74 68 65 20 4c 49  he rhs of the LI
5bd0: 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  KE expression is
5be0: 20 61 20 76 61 72 69 61 62 6c 65 2c 20 61 6e 64   a variable, and
5bf0: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20   the current.   
5c00: 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
5c10: 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  of the variable 
5c20: 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73 20 6e  means there is n
5c30: 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f 6b 65  o need to invoke
5c40: 20 74 68 65 20 4c 49 4b 45 0a 20 20 20 20 20 20   the LIKE.      
5c50: 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c      ** function,
5c60: 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61 72 69   then no OP_Vari
5c70: 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 61 64 64  able will be add
5c80: 65 64 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61  ed to the progra
5c90: 6d 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  m..          ** 
5ca0: 54 68 69 73 20 63 61 75 73 65 73 20 70 72 6f 62  This causes prob
5cb0: 6c 65 6d 73 20 66 6f 72 20 74 68 65 20 73 71 6c  lems for the sql
5cc0: 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
5cd0: 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20 20 20  ter_name().     
5ce0: 20 20 20 20 20 2a 2a 20 41 50 49 2e 20 54 6f 20       ** API. To 
5cf0: 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68 65 6d 2c  workaround them,
5d00: 20 61 64 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f   add a dummy OP_
5d10: 56 61 72 69 61 62 6c 65 20 68 65 72 65 2e 0a 20  Variable here.. 
5d20: 20 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20           */ .   
5d30: 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
5d40: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
5d50: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
5d60: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
5d70: 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
5d80: 65 2c 20 70 52 69 67 68 74 2c 20 72 31 29 3b 0a  e, pRight, r1);.
5d90: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5da0: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
5db0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
5dc0: 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 30 29  entAddr(v)-1, 0)
5dd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
5de0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5df0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
5e00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5e10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5e20: 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20    z = 0;.    }. 
5e30: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c   }..  sqlite3Val
5e40: 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20  ueFree(pVal);.  
5e50: 72 65 74 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d  return (z!=0);.}
5e60: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5e70: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
5e80: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69  MIZATION */...#i
5e90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5ea0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
5eb0: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
5ec0: 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65  e if the given e
5ed0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
5ee0: 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20  the form.**.**  
5ef0: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41         column MA
5f00: 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49  TCH expr.**.** I
5f10: 66 20 69 74 20 69 73 20 74 68 65 6e 20 72 65 74  f it is then ret
5f20: 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 6e 6f  urn TRUE.  If no
5f30: 74 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e  t, return FALSE.
5f40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
5f50: 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a  sMatchOfColumn(.
5f60: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
5f70: 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20     /* Test this 
5f80: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
5f90: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
5fa0: 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  st;..  if( pExpr
5fb0: 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op!=TK_FUNCTIO
5fc0: 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
5fd0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
5fe0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70  ite3StrICmp(pExp
5ff0: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74  r->u.zToken,"mat
6000: 63 68 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ch")!=0 ){.    r
6010: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
6020: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
6030: 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69  pList;.  if( pLi
6040: 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a  st->nExpr!=2 ){.
6050: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6060: 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61  }.  if( pList->a
6070: 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d  [1].pExpr->op !=
6080: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20   TK_COLUMN ){.  
6090: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
60a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
60b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
60c0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
60d0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68   */../*.** If th
60e0: 65 20 70 42 61 73 65 20 65 78 70 72 65 73 73 69  e pBase expressi
60f0: 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e  on originated in
6100: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
6110: 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20   clause of.** a 
6120: 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73  join, then trans
6130: 66 65 72 20 74 68 65 20 61 70 70 72 6f 70 72 69  fer the appropri
6140: 61 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65  ate markings ove
6150: 72 20 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f  r to derived..*/
6160: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 61  .static void tra
6170: 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67  nsferJoinMarking
6180: 73 28 45 78 70 72 20 2a 70 44 65 72 69 76 65 64  s(Expr *pDerived
6190: 2c 20 45 78 70 72 20 2a 70 42 61 73 65 29 7b 0a  , Expr *pBase){.
61a0: 20 20 69 66 28 20 70 44 65 72 69 76 65 64 20 29    if( pDerived )
61b0: 7b 0a 20 20 20 20 70 44 65 72 69 76 65 64 2d 3e  {.    pDerived->
61c0: 66 6c 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e  flags |= pBase->
61d0: 66 6c 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a  flags & EP_FromJ
61e0: 6f 69 6e 3b 0a 20 20 20 20 70 44 65 72 69 76 65  oin;.    pDerive
61f0: 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  d->iRightJoinTab
6200: 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69 52 69 67  le = pBase->iRig
6210: 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d  htJoinTable;.  }
6220: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
6230: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  (SQLITE_OMIT_OR_
6240: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26  OPTIMIZATION) &&
6250: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6260: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
6270: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20  /*.** Analyze a 
6280: 74 65 72 6d 20 74 68 61 74 20 63 6f 6e 73 69 73  term that consis
6290: 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ts of two or mor
62a0: 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a  e OR-connected.*
62b0: 2a 20 73 75 62 74 65 72 6d 73 2e 20 20 53 6f 20  * subterms.  So 
62c0: 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  in:.**.**     ..
62d0: 2e 20 57 48 45 52 45 20 20 28 61 3d 35 29 20 41  . WHERE  (a=5) A
62e0: 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f  ND (b=7 OR c=9 O
62f0: 52 20 64 3d 31 33 29 20 41 4e 44 20 28 64 3d 31  R d=13) AND (d=1
6300: 33 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  3).**           
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5e                 ^
6320: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
6330: 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ^^^.**.** This r
6340: 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20  outine analyzes 
6350: 74 65 72 6d 73 20 73 75 63 68 20 61 73 20 74 68  terms such as th
6360: 65 20 6d 69 64 64 6c 65 20 74 65 72 6d 20 69 6e  e middle term in
6370: 20 74 68 65 20 61 62 6f 76 65 20 65 78 61 6d 70   the above examp
6380: 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72  le..** A WhereOr
6390: 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63  Term object is c
63a0: 6f 6d 70 75 74 65 64 20 61 6e 64 20 61 74 74 61  omputed and atta
63b0: 63 68 65 64 20 74 6f 20 74 68 65 20 74 65 72 6d  ched to the term
63c0: 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73   under.** analys
63d0: 69 73 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  is, regardless o
63e0: 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66  f the outcome of
63f0: 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 20 20   the analysis.  
6400: 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  Hence:.**.**    
6410: 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61   WhereTerm.wtFla
6420: 67 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52  gs   |=  TERM_OR
6430: 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72  INFO.**     Wher
6440: 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20  eTerm.u.pOrInfo 
6450: 20 3d 20 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   =  a dynamicall
6460: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
6470: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a  eOrTerm object.*
6480: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 62 65  *.** The term be
6490: 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73  ing analyzed mus
64a0: 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f  t have two or mo
64b0: 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74  re of OR-connect
64c0: 65 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20  ed subterms..** 
64d0: 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65 72 6d  A single subterm
64e0: 20 6d 69 67 68 74 20 62 65 20 61 20 73 65 74 20   might be a set 
64f0: 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64  of AND-connected
6500: 20 73 75 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a   sub-subterms..*
6510: 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 74 65  * Examples of te
6520: 72 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c 79 73  rms under analys
6530: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41  is:.**.**     (A
6540: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
6550: 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20  OR t1.x=t2.z OR 
6560: 74 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d  t1.y=15 OR t1.z=
6570: 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42  t3.a+5.**     (B
6580: 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52  )     x=expr1 OR
6590: 20 65 78 70 72 32 3d 78 20 4f 52 20 78 3d 65 78   expr2=x OR x=ex
65a0: 70 72 33 0a 2a 2a 20 20 20 20 20 28 43 29 20 20  pr3.**     (C)  
65b0: 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20     t1.x=t2.y OR 
65c0: 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74  (t1.x=t2.z AND t
65d0: 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28  1.y=15).**     (
65e0: 44 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f  D)     x=expr1 O
65f0: 52 20 28 79 3e 31 31 20 41 4e 44 20 79 3c 32 32  R (y>11 AND y<22
6600: 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65   AND z LIKE '*he
6610: 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45  llo*').**     (E
6620: 29 20 20 20 20 20 28 70 2e 61 3d 31 20 41 4e 44  )     (p.a=1 AND
6630: 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33   q.b=2 AND r.c=3
6640: 29 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e 44 20  ) OR (p.x=4 AND 
6650: 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29  q.y=5 AND r.z=6)
6660: 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a  .**.** CASE 1:.*
6670: 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74  *.** If all subt
6680: 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20  erms are of the 
6690: 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f  form T.C=expr fo
66a0: 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f  r some single co
66b0: 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64 0a 2a 2a  lumn of C and.**
66c0: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
66d0: 54 20 28 61 73 20 73 68 6f 77 6e 20 69 6e 20 65  T (as shown in e
66e0: 78 61 6d 70 6c 65 20 42 20 61 62 6f 76 65 29 20  xample B above) 
66f0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
6700: 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72  w virtual.** ter
6710: 6d 20 74 68 61 74 20 69 73 20 61 6e 20 65 71 75  m that is an equ
6720: 69 76 61 6c 65 6e 74 20 49 4e 20 65 78 70 72 65  ivalent IN expre
6730: 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72  ssion.  In other
6740: 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 74   words, if the t
6750: 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61  erm.** being ana
6760: 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  lyzed is:.**.** 
6770: 20 20 20 20 20 78 20 3d 20 65 78 70 72 31 20 20       x = expr1  
6780: 4f 52 20 20 65 78 70 72 32 20 3d 20 78 20 20 4f  OR  expr2 = x  O
6790: 52 20 20 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a  R  x = expr3.**.
67a0: 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  ** then create a
67b0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
67c0: 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  m like this:.**.
67d0: 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 65 78  **      x IN (ex
67e0: 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29  pr1,expr2,expr3)
67f0: 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a  .**.** CASE 2:.*
6800: 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74  *.** If all subt
6810: 65 72 6d 73 20 61 72 65 20 69 6e 64 65 78 61 62  erms are indexab
6820: 6c 65 20 62 79 20 61 20 73 69 6e 67 6c 65 20 74  le by a single t
6830: 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 73 65 74  able T, then set
6840: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65  .**.**     Where
6850: 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20  Term.eOperator  
6860: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 20 57              =  W
6870: 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57 68 65 72  O_OR.**     Wher
6880: 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d  eTerm.u.pOrInfo-
6890: 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c 3d 20 20  >indexable  |=  
68a0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
68b0: 72 20 66 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a  r for table T.**
68c0: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73  .** A subterm is
68d0: 20 22 69 6e 64 65 78 61 62 6c 65 22 20 69 66 20   "indexable" if 
68e0: 69 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  it is of the for
68f0: 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c  m.** "T.C <op> <
6900: 65 78 70 72 3e 22 20 77 68 65 72 65 20 43 20 69  expr>" where C i
6910: 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  s any column of 
6920: 74 61 62 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20  table T and .** 
6930: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22  <op> is one of "
6940: 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22  =", "<", "<=", "
6950: 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55  >", ">=", "IS NU
6960: 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a  LL", or "IN"..**
6970: 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 61 6c   A subterm is al
6980: 73 6f 20 69 6e 64 65 78 61 62 6c 65 20 69 66 20  so indexable if 
6990: 69 74 20 69 73 20 61 6e 20 41 4e 44 20 6f 66 20  it is an AND of 
69a0: 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73  two or more.** s
69b0: 75 62 73 75 62 74 65 72 6d 73 20 61 74 20 6c 65  ubsubterms at le
69c0: 61 73 74 20 6f 6e 65 20 6f 66 20 77 68 69 63 68  ast one of which
69d0: 20 69 73 20 69 6e 64 65 78 61 62 6c 65 2e 20 20   is indexable.  
69e0: 49 6e 64 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a  Indexable AND .*
69f0: 2a 20 73 75 62 74 65 72 6d 73 20 68 61 76 65 20  * subterms have 
6a00: 74 68 65 69 72 20 65 4f 70 65 72 61 74 6f 72 20  their eOperator 
6a10: 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e  set to WO_AND an
6a20: 64 20 74 68 65 79 20 68 61 76 65 0a 2a 2a 20 75  d they have.** u
6a30: 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f  .pAndInfo set to
6a40: 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61   a dynamically a
6a50: 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 41 6e  llocated WhereAn
6a60: 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a  dTerm object..**
6a70: 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72  .** From another
6a80: 20 70 6f 69 6e 74 20 6f 66 20 76 69 65 77 2c 20   point of view, 
6a90: 22 69 6e 64 65 78 61 62 6c 65 22 20 6d 65 61 6e  "indexable" mean
6aa0: 73 20 74 68 61 74 20 74 68 65 20 73 75 62 74 65  s that the subte
6ab0: 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65  rm could.** pote
6ac0: 6e 74 69 61 6c 6c 79 20 62 65 20 75 73 65 64 20  ntially be used 
6ad0: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 69 66  with an index if
6ae0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
6af0: 69 6e 64 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a  index exists..**
6b00: 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64   This analysis d
6b10: 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72  oes not consider
6b20: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
6b30: 74 68 65 20 69 6e 64 65 78 20 65 78 69 73 74 73  the index exists
6b40: 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20 64 65 63  ; that.** is dec
6b50: 69 64 65 64 20 65 6c 73 65 77 68 65 72 65 2e 20  ided elsewhere. 
6b60: 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73 20 6f   This analysis o
6b70: 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65  nly looks at whe
6b80: 74 68 65 72 20 73 75 62 74 65 72 6d 73 0a 2a 2a  ther subterms.**
6b90: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
6ba0: 20 69 6e 64 65 78 69 6e 67 20 65 78 69 73 74 2e   indexing exist.
6bb0: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70  .**.** All examp
6bc0: 6c 65 73 20 41 20 74 68 72 6f 75 67 68 20 45 20  les A through E 
6bd0: 61 62 6f 76 65 20 73 61 74 69 73 66 79 20 63 61  above satisfy ca
6be0: 73 65 20 32 2e 20 20 42 75 74 20 69 66 20 61 20  se 2.  But if a 
6bf0: 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61  term.** also sta
6c00: 74 69 73 66 69 65 73 20 63 61 73 65 20 31 20 28  tisfies case 1 (
6c10: 73 75 63 68 20 61 73 20 42 29 20 77 65 20 6b 6e  such as B) we kn
6c20: 6f 77 20 74 68 61 74 20 74 68 65 20 6f 70 74 69  ow that the opti
6c30: 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c  mizer will.** al
6c40: 77 61 79 73 20 70 72 65 66 65 72 20 63 61 73 65  ways prefer case
6c50: 20 31 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63   1, so in that c
6c60: 61 73 65 20 77 65 20 70 72 65 74 65 6e 64 20 74  ase we pretend t
6c70: 68 61 74 20 63 61 73 65 20 32 20 69 73 20 6e 6f  hat case 2 is no
6c80: 74 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 2e 0a  t.** satisfied..
6c90: 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 62  **.** It might b
6ca0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  e the case that 
6cb0: 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20  multiple tables 
6cc0: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2e 20 20  are indexable.  
6cd0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20  For example,.** 
6ce0: 28 45 29 20 61 62 6f 76 65 20 69 73 20 69 6e 64  (E) above is ind
6cf0: 65 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73  exable on tables
6d00: 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a   P, Q, and R..**
6d10: 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61 74 20 73  .** Terms that s
6d20: 61 74 69 73 66 79 20 63 61 73 65 20 32 20 61 72  atisfy case 2 ar
6d30: 65 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  e candidates for
6d40: 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e 67   lookup by using
6d50: 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e 64  .** separate ind
6d60: 69 63 65 73 20 74 6f 20 66 69 6e 64 20 72 6f 77  ices to find row
6d70: 69 64 73 20 66 6f 72 20 65 61 63 68 20 73 75 62  ids for each sub
6d80: 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69  term and composi
6d90: 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20  ng.** the union 
6da0: 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73 20 75 73  of all rowids us
6db0: 69 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a  ing a RowSet obj
6dc0: 65 63 74 2e 20 20 54 68 69 73 20 69 73 20 73 69  ect.  This is si
6dd0: 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74  milar.** to "bit
6de0: 6d 61 70 20 69 6e 64 69 63 65 73 22 20 69 6e 20  map indices" in 
6df0: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 65  other database e
6e00: 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54  ngines..**.** OT
6e10: 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49  HERWISE:.**.** I
6e20: 66 20 6e 65 69 74 68 65 72 20 63 61 73 65 20 31  f neither case 1
6e30: 20 6e 6f 72 20 63 61 73 65 20 32 20 61 70 70 6c   nor case 2 appl
6e40: 79 2c 20 74 68 65 6e 20 6c 65 61 76 65 20 74 68  y, then leave th
6e50: 65 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20  e eOperator set 
6e60: 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69  to.** zero.  Thi
6e70: 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 75 73  s term is not us
6e80: 65 66 75 6c 20 66 6f 72 20 73 65 61 72 63 68 2e  eful for search.
6e90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6ea0: 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72  exprAnalyzeOrTer
6eb0: 6d 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  m(.  SrcList *pS
6ec0: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  rc,            /
6ed0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
6ee0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
6ef0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
6f00: 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   /* the complete
6f10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
6f20: 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20  .  int idxTerm  
6f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6f40: 49 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52 2d  Index of the OR-
6f50: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
6f60: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  zed */.){.  Wher
6f70: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
6f80: 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 20 20 20  pWC->pWInfo;    
6f90: 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61      /* WHERE cla
6fa0: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63  use processing c
6fb0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73  ontext */.  Pars
6fc0: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
6fd0: 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20  fo->pParse;     
6fe0: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
6ff0: 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
7000: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
7010: 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  >db;            
7020: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
7030: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57  onnection */.  W
7040: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20  hereTerm *pTerm 
7050: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
7060: 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65  m];    /* The te
7070: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
7080: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  d */.  Expr *pEx
7090: 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
70a0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
70b0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
70c0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a   of the term */.
70d0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
7100: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
7110: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72  WhereClause *pOr
7120: 57 63 3b 20 20 20 20 20 20 20 2f 2a 20 42 72 65  Wc;       /* Bre
7130: 61 6b 75 70 20 6f 66 20 70 54 65 72 6d 20 69 6e  akup of pTerm in
7140: 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20  to subterms */. 
7150: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
7160: 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41 20  erm;       /* A 
7170: 53 75 62 2d 74 65 72 6d 20 77 69 74 68 69 6e 20  Sub-term within 
7180: 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57  the pOrWc */.  W
7190: 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49  hereOrInfo *pOrI
71a0: 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64 69  nfo;     /* Addi
71b0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
71c0: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
71d0: 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69  th pTerm */.  Bi
71e0: 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20  tmask chngToIN; 
71f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
7200: 73 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74  s that might sat
7210: 69 73 66 79 20 63 61 73 65 20 31 20 2a 2f 0a 20  isfy case 1 */. 
7220: 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62   Bitmask indexab
7230: 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61  le;        /* Ta
7240: 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  bles that are in
7250: 64 65 78 61 62 6c 65 2c 20 73 61 74 69 73 66 79  dexable, satisfy
7260: 69 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20  ing case 2 */.. 
7270: 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74   /*.  ** Break t
7280: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74  he OR clause int
7290: 6f 20 69 74 73 20 73 65 70 61 72 61 74 65 20 73  o its separate s
72a0: 75 62 74 65 72 6d 73 2e 20 20 54 68 65 20 73 75  ubterms.  The su
72b0: 62 74 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20  bterms are.  ** 
72c0: 73 74 6f 72 65 64 20 69 6e 20 61 20 57 68 65 72  stored in a Wher
72d0: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
72e0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74  e containing wit
72f0: 68 69 6e 20 74 68 65 20 57 68 65 72 65 4f 72 49  hin the WhereOrI
7300: 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20  nfo.  ** object 
7310: 74 68 61 74 20 69 73 20 61 74 74 61 63 68 65 64  that is attached
7320: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
7330: 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d 2e   OR clause term.
7340: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
7350: 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
7360: 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c  & (TERM_DYNAMIC|
7370: 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d  TERM_ORINFO|TERM
7380: 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b  _ANDINFO))==0 );
7390: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
73a0: 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20  ->op==TK_OR );. 
73b0: 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66   pTerm->u.pOrInf
73c0: 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71  o = pOrInfo = sq
73d0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
73e0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f  o(db, sizeof(*pO
73f0: 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20 70  rInfo));.  if( p
7400: 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75  OrInfo==0 ) retu
7410: 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46  rn;.  pTerm->wtF
7420: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49  lags |= TERM_ORI
7430: 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26  NFO;.  pOrWc = &
7440: 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77  pOrInfo->wc;.  w
7450: 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70  hereClauseInit(p
7460: 4f 72 57 63 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  OrWc, pWInfo);. 
7470: 20 77 68 65 72 65 53 70 6c 69 74 28 70 4f 72 57   whereSplit(pOrW
7480: 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29  c, pExpr, TK_OR)
7490: 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  ;.  exprAnalyzeA
74a0: 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57 63 29 3b  ll(pSrc, pOrWc);
74b0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
74c0: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
74d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 57  ;.  assert( pOrW
74e0: 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a  c->nTerm>=2 );..
74f0: 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74    /*.  ** Comput
7500: 65 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62  e the set of tab
7510: 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73  les that might s
7520: 61 74 69 73 66 79 20 63 61 73 65 73 20 31 20 6f  atisfy cases 1 o
7530: 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65  r 2..  */.  inde
7540: 78 61 62 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73  xable = ~(Bitmas
7550: 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20  k)0;.  chngToIN 
7560: 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
7570: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
7580: 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70  erm-1, pOrTerm=p
7590: 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26  OrWc->a; i>=0 &&
75a0: 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c   indexable; i--,
75b0: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
75c0: 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65   if( (pOrTerm->e
75d0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49  Operator & WO_SI
75e0: 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NGLE)==0 ){.    
75f0: 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a    WhereAndInfo *
7600: 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAndInfo;.      
7610: 61 73 73 65 72 74 28 20 28 70 4f 72 54 65 72 6d  assert( (pOrTerm
7620: 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
7630: 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f  M_ANDINFO|TERM_O
7640: 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20  RINFO))==0 );.  
7650: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30      chngToIN = 0
7660: 3b 0a 20 20 20 20 20 20 70 41 6e 64 49 6e 66 6f  ;.      pAndInfo
7670: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7680: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
7690: 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b 0a 20 20  (*pAndInfo));.  
76a0: 20 20 20 20 69 66 28 20 70 41 6e 64 49 6e 66 6f      if( pAndInfo
76b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72   ){.        Wher
76c0: 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43 3b  eClause *pAndWC;
76d0: 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  .        WhereTe
76e0: 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b 0a 20 20  rm *pAndTerm;.  
76f0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
7700: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d       Bitmask b =
7710: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54   0;.        pOrT
7720: 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 20  erm->u.pAndInfo 
7730: 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20  = pAndInfo;.    
7740: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
7750: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 41 4e 44  lags |= TERM_AND
7760: 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20 20 70 4f  INFO;.        pO
7770: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
7780: 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20 20 20 20   = WO_AND;.     
7790: 20 20 20 70 41 6e 64 57 43 20 3d 20 26 70 41 6e     pAndWC = &pAn
77a0: 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  dInfo->wc;.     
77b0: 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e     whereClauseIn
77c0: 69 74 28 70 41 6e 64 57 43 2c 20 70 57 43 2d 3e  it(pAndWC, pWC->
77d0: 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
77e0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 41 6e 64   whereSplit(pAnd
77f0: 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  WC, pOrTerm->pEx
7800: 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20  pr, TK_AND);.   
7810: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
7820: 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64 57 43  All(pSrc, pAndWC
7830: 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57  );.        pAndW
7840: 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b  C->pOuter = pWC;
7850: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
7860: 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e( db->mallocFai
7870: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69  led );.        i
7880: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
7890: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
78a0: 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e 64 54    for(j=0, pAndT
78b0: 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b 20 6a  erm=pAndWC->a; j
78c0: 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d 3b 20  <pAndWC->nTerm; 
78d0: 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b 2b 29  j++, pAndTerm++)
78e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
78f0: 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d 2d 3e  sert( pAndTerm->
7900: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20  pExpr );.       
7910: 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77 65 64       if( allowed
7920: 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78  Op(pAndTerm->pEx
7930: 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20 20 20  pr->op) ){.     
7940: 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65           b |= ge
7950: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
7960: 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64 54 65 72  MaskSet, pAndTer
7970: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a  m->leftCursor);.
7980: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7990: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
79a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 64 65    }.        inde
79b0: 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20  xable &= b;.    
79c0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
79d0: 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61  ( pOrTerm->wtFla
79e0: 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44  gs & TERM_COPIED
79f0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69   ){.      /* Ski
7a00: 70 20 74 68 69 73 20 74 65 72 6d 20 66 6f 72 20  p this term for 
7a10: 6e 6f 77 2e 20 20 57 65 20 72 65 76 69 73 69 74  now.  We revisit
7a20: 20 69 74 20 77 68 65 6e 20 77 65 20 70 72 6f 63   it when we proc
7a30: 65 73 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ess the.      **
7a40: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 54   corresponding T
7a50: 45 52 4d 5f 56 49 52 54 55 41 4c 20 74 65 72 6d  ERM_VIRTUAL term
7a60: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
7a70: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 3b 0a       Bitmask b;.
7a80: 20 20 20 20 20 20 62 20 3d 20 67 65 74 4d 61 73        b = getMas
7a90: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
7aa0: 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  Set, pOrTerm->le
7ab0: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
7ac0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
7ad0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
7ae0: 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  TUAL ){.        
7af0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65  WhereTerm *pOthe
7b00: 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f  r = &pOrWc->a[pO
7b10: 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  rTerm->iParent];
7b20: 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65  .        b |= ge
7b30: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
7b40: 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68 65 72 2d  MaskSet, pOther-
7b50: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
7b60: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 64 65      }.      inde
7b70: 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20  xable &= b;.    
7b80: 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
7b90: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
7ba0: 51 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Q)==0 ){.       
7bb0: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20   chngToIN = 0;. 
7bc0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7bd0: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26 3d 20      chngToIN &= 
7be0: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
7bf0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
7c00: 52 65 63 6f 72 64 20 74 68 65 20 73 65 74 20 6f  Record the set o
7c10: 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 73 61  f tables that sa
7c20: 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 54  tisfy case 2.  T
7c30: 68 65 20 73 65 74 20 6d 69 67 68 74 20 62 65 0a  he set might be.
7c40: 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20 2a 2f    ** empty..  */
7c50: 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  .  pOrInfo->inde
7c60: 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61 62 6c  xable = indexabl
7c70: 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65  e;.  pTerm->eOpe
7c80: 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61 62 6c  rator = indexabl
7c90: 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f 4f 52  e==0 ? 0 : WO_OR
7ca0: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 68 6e  ;..  /*.  ** chn
7cb0: 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20 73 65  gToIN holds a se
7cc0: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
7cd0: 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73 66 79   *might* satisfy
7ce0: 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a 20 20   case 1.  But.  
7cf0: 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 64 6f  ** we have to do
7d00: 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
7d10: 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65 65   checking to see
7d20: 20 69 66 20 63 61 73 65 20 31 20 72 65 61 6c 6c   if case 1 reall
7d30: 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69 73 66  y.  ** is satisf
7d40: 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63  ied..  **.  ** c
7d50: 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68 6f 6c  hngToIN will hol
7d60: 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c 20 6f  d either 0, 1, o
7d70: 72 20 32 20 62 69 74 73 2e 20 20 54 68 65 20 30  r 2 bits.  The 0
7d80: 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e 73 0a  -bit case means.
7d90: 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72 65 20    ** that there 
7da0: 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69 74  is no possibilit
7db0: 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e  y of transformin
7dc0: 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  g the OR clause 
7dd0: 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e 20  into an.  ** IN 
7de0: 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75 73 65  operator because
7df0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 65 72   one or more ter
7e00: 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61  ms in the OR cla
7e10: 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20 2a 2a  use contain.  **
7e20: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
7e30: 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20 63 6f   than == on a co
7e40: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69 6e 67  lumn in the sing
7e50: 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 31  le table.  The 1
7e60: 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65 20 6d  -bit.  ** case m
7e70: 65 61 6e 73 20 74 68 61 74 20 65 76 65 72 79 20  eans that every 
7e80: 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20 63  term of the OR c
7e90: 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68 65 20  lause is of the 
7ea0: 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62 6c 65  form.  ** "table
7eb0: 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20 66 6f  .column=expr" fo
7ec0: 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 74 61  r some single ta
7ed0: 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20 62 69  ble.  The one bi
7ee0: 74 20 74 68 61 74 20 69 73 20 73 65 74 0a 20 20  t that is set.  
7ef0: 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73 70 6f  ** will correspo
7f00: 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  nd to the common
7f10: 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74 69 6c   table.  We stil
7f20: 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  l need to check 
7f30: 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  to make.  ** sur
7f40: 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d  e the same colum
7f50: 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61 6c 6c  n is used on all
7f60: 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32 2d 62   terms.  The 2-b
7f70: 69 74 20 63 61 73 65 20 69 73 20 77 68 65 6e 0a  it case is when.
7f80: 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74 65 72    ** the all ter
7f90: 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f  ms are of the fo
7fa0: 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c 75 6d  rm "table1.colum
7fb0: 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 22  n=table2.column"
7fc0: 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67 68 74  .  It.  ** might
7fd0: 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
7fe0: 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65 72 61  form an IN opera
7ff0: 74 6f 72 20 77 69 74 68 20 65 69 74 68 65 72 20  tor with either 
8000: 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20 20  table1.column.  
8010: 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63 6f 6c  ** or table2.col
8020: 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53 20 69  umn as the LHS i
8030: 66 20 65 69 74 68 65 72 20 69 73 20 63 6f 6d 6d  f either is comm
8040: 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  on to every term
8050: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f 52 20   of.  ** the OR 
8060: 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
8070: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65 72 6d  * Note that term
8080: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74  s of the form "t
8090: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61 62  able.column1=tab
80a0: 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74 68 65  le.column2" (the
80b0: 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65  .  ** same table
80c0: 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73 20 6f   on both sizes o
80d0: 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e 6f 74  f the ==) cannot
80e0: 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 20   be optimized.. 
80f0: 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67 54 6f   */.  if( chngTo
8100: 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b  IN ){.    int ok
8110: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 20  ToChngToIN = 0; 
8120: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
8130: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f  he conversion to
8140: 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a   IN is valid */.
8150: 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 20      int iColumn 
8160: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  = -1;         /*
8170: 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 6e   Column index on
8180: 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65 72 61   lhs of IN opera
8190: 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  tor */.    int i
81a0: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20 20 20  Cursor = -1;    
81b0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63 75       /* Table cu
81c0: 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61  rsor common to a
81d0: 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  ll terms */.    
81e0: 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20 20 20  int j = 0;      
81f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
8200: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
8210: 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
8220: 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  a table and colu
8230: 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72 73 20  mn that appears 
8240: 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74  on one side or t
8250: 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  he.    ** other 
8260: 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72 61 74  of the == operat
8270: 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75 62 74  or in every subt
8280: 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62 6c 65  erm.  That table
8290: 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   and column.    
82a0: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72  ** will be recor
82b0: 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72 20 61  ded in iCursor a
82c0: 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54 68 65  nd iColumn.  The
82d0: 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  re might not be 
82e0: 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20  any.    ** such 
82f0: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
8300: 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e 67 54  .  Set okToChngT
8310: 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72 6f 70  oIN if an approp
8320: 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20 20 20  riate table.    
8330: 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73  ** and column is
8340: 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61 76 65   found but leave
8350: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 66 61   okToChngToIN fa
8360: 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  lse if not found
8370: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
8380: 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21 6f 6b  (j=0; j<2 && !ok
8390: 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29  ToChngToIN; j++)
83a0: 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72 6d 20  {.      pOrTerm 
83b0: 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20 20 20  = pOrWc->a;.    
83c0: 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e    for(i=pOrWc->n
83d0: 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Term-1; i>=0; i-
83e0: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
83f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
8400: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
8410: 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
8420: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
8430: 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f  Flags &= ~TERM_O
8440: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  R_OK;.        if
8450: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
8460: 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29  ursor==iCursor )
8470: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
8480: 68 69 73 20 69 73 20 74 68 65 20 32 2d 62 69 74  his is the 2-bit
8490: 20 63 61 73 65 20 61 6e 64 20 77 65 20 61 72 65   case and we are
84a0: 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69   on the second i
84b0: 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20  teration and.   
84c0: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
84d0: 74 20 74 65 72 6d 20 69 73 20 66 72 6f 6d 20 74  t term is from t
84e0: 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
84f0: 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74 68 69  on.  So skip thi
8500: 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  s term. */.     
8510: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d       assert( j==
8520: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  1 );.          c
8530: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
8540: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
8550: 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d 61  chngToIN & getMa
8560: 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
8570: 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c  kSet, pOrTerm->l
8580: 65 66 74 43 75 72 73 6f 72 29 29 3d 3d 30 20 29  eftCursor))==0 )
8590: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
85a0: 68 69 73 20 74 65 72 6d 20 6d 75 73 74 20 62 65  his term must be
85b0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 74 31 2e   of the form t1.
85c0: 61 3d 3d 74 32 2e 62 20 77 68 65 72 65 20 74 32  a==t2.b where t2
85d0: 20 69 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20   is in the.     
85e0: 20 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e       ** chngToIN
85f0: 20 73 65 74 20 62 75 74 20 74 31 20 69 73 20 6e   set but t1 is n
8600: 6f 74 2e 20 20 54 68 69 73 20 74 65 72 6d 20 77  ot.  This term w
8610: 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20 70 72  ill be either pr
8620: 65 63 65 65 64 65 64 0a 20 20 20 20 20 20 20 20  eceeded.        
8630: 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64 20    ** or follwed 
8640: 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20 63  by an inverted c
8650: 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61 29  opy (t2.b==t1.a)
8660: 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74 65 72  .  Skip this ter
8670: 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  m .          ** 
8680: 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76 65  and use its inve
8690: 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  rsion. */.      
86a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f      testcase( pO
86b0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
86c0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b 0a   TERM_COPIED );.
86d0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
86e0: 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  se( pOrTerm->wtF
86f0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
8700: 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  UAL );.         
8710: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
8720: 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
8730: 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56 49  M_COPIED|TERM_VI
8740: 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20 20  RTUAL) );.      
8750: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
8760: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8770: 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72  iColumn = pOrTer
8780: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
8790: 0a 20 20 20 20 20 20 20 20 69 43 75 72 73 6f 72  .        iCursor
87a0: 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74   = pOrTerm->left
87b0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20  Cursor;.        
87c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
87d0: 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a       if( i<0 ){.
87e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 61          /* No ca
87f0: 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63 6f  ndidate table+co
8800: 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e 20  lumn was found. 
8810: 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f   This can only o
8820: 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ccur.        ** 
8830: 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74  on the second it
8840: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  eration */.     
8850: 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20     assert( j==1 
8860: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
8870: 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28  t( IsPowerOfTwo(
8880: 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a 20 20 20  chngToIN) );.   
8890: 20 20 20 20 20 61 73 73 65 72 74 28 20 63 68 6e       assert( chn
88a0: 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b 28 26  gToIN==getMask(&
88b0: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
88c0: 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  , iCursor) );.  
88d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
88e0: 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
88f0: 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20 20  ase( j==1 );..  
8900: 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 66      /* We have f
8910: 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61 74 65  ound a candidate
8920: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
8930: 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  n.  Check to see
8940: 20 69 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   if that.      *
8950: 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  * table and colu
8960: 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  mn is common to 
8970: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
8980: 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f 0a 20  e OR clause */. 
8990: 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49       okToChngToI
89a0: 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  N = 1;.      for
89b0: 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54 6f 43  (; i>=0 && okToC
89c0: 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70 4f  hngToIN; i--, pO
89d0: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
89e0: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
89f0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
8a00: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
8a10: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
8a20: 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f 72  tCursor!=iCursor
8a30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
8a40: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
8a50: 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  = ~TERM_OR_OK;. 
8a60: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
8a70: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
8a80: 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
8a90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 54  ){.          okT
8aa0: 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20  oChngToIN = 0;. 
8ab0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
8ac0: 20 20 20 20 20 20 20 20 69 6e 74 20 61 66 66 4c          int affL
8ad0: 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a 20  eft, affRight;. 
8ae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
8af0: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
8b00: 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c  de is also a col
8b10: 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61 66  umn, then the af
8b20: 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20 20  finities.       
8b30: 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69     ** of both ri
8b40: 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 64  ght and left sid
8b50: 65 73 20 6d 75 73 74 20 62 65 20 73 75 63 68 20  es must be such 
8b60: 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20 20  that no type.   
8b70: 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72         ** conver
8b80: 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72  sions are requir
8b90: 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  ed on the right.
8ba0: 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39 29    (Ticket #2249)
8bb0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
8bc0: 20 20 20 20 20 20 20 20 61 66 66 52 69 67 68 74          affRight
8bd0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
8be0: 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e  finity(pOrTerm->
8bf0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
8c00: 20 20 20 20 20 20 20 20 20 20 61 66 66 4c 65 66            affLef
8c10: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
8c20: 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d  ffinity(pOrTerm-
8c30: 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  >pExpr->pLeft);.
8c40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 66            if( af
8c50: 66 52 69 67 68 74 21 3d 30 20 26 26 20 61 66 66  fRight!=0 && aff
8c60: 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20 29  Right!=affLeft )
8c70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6b  {.            ok
8c80: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a  ToChngToIN = 0;.
8c90: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
8ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72  .            pOr
8cb0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
8cc0: 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20   TERM_OR_OK;.   
8cd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8ce0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
8cf0: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
8d00: 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67   point, okToChng
8d10: 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66 20  ToIN is true if 
8d20: 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20 73  original pTerm s
8d30: 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a 20  atisfies.    ** 
8d40: 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61 74  case 1.  In that
8d50: 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63 74   case, construct
8d60: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74   a new virtual t
8d70: 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20 20  erm that is .   
8d80: 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65 72   ** pTerm conver
8d90: 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f  ted into an IN o
8da0: 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a  perator..    */.
8db0: 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67      if( okToChng
8dc0: 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  ToIN ){.      Ex
8dd0: 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20  pr *pDup;       
8de0: 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73 69       /* A transi
8df0: 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65 78  ent duplicate ex
8e00: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
8e10: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
8e20: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  t = 0;   /* The 
8e30: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
8e40: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
8e50: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b  Expr *pLeft = 0;
8e60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48         /* The LH
8e70: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
8e80: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  ator */.      Ex
8e90: 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  pr *pNew;       
8ea0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
8eb0: 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f 72  lete IN operator
8ec0: 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 69   */..      for(i
8ed0: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c  =pOrWc->nTerm-1,
8ee0: 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e   pOrTerm=pOrWc->
8ef0: 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  a; i>=0; i--, pO
8f00: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
8f10: 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
8f20: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
8f30: 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69  R_OK)==0 ) conti
8f40: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  nue;.        ass
8f50: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
8f60: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
8f70: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
8f80: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  t( pOrTerm->left
8f90: 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20  Cursor==iCursor 
8fa0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
8fb0: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65  t( pOrTerm->u.le
8fc0: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
8fd0: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75  n );.        pDu
8fe0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
8ff0: 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e  up(db, pOrTerm->
9000: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30  pExpr->pRight, 0
9010: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  );.        pList
9020: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
9030: 73 74 41 70 70 65 6e 64 28 70 57 49 6e 66 6f 2d  stAppend(pWInfo-
9040: 3e 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  >pParse, pList, 
9050: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 70  pDup);.        p
9060: 4c 65 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  Left = pOrTerm->
9070: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
9080: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
9090: 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a  rt( pLeft!=0 );.
90a0: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
90b0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
90c0: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
90d0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50   pNew = sqlite3P
90e0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
90f0: 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b  IN, pDup, 0, 0);
9100: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20  .      if( pNew 
9110: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
9120: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 74  dxNew;.        t
9130: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
9140: 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70 72 29  ngs(pNew, pExpr)
9150: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
9160: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
9170: 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53  ty(pNew, EP_xIsS
9180: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
9190: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
91a0: 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  = pList;.       
91b0: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
91c0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
91d0: 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52 54   pNew, TERM_VIRT
91e0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
91f0: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
9200: 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29  ase( idxNew==0 )
9210: 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e  ;.        exprAn
9220: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
9230: 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20   idxNew);.      
9240: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
9250: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
9260: 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
9270: 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  w].iParent = idx
9280: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54  Term;.        pT
9290: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
92a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
92b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
92c0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
92d0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pList);.      }.
92e0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
92f0: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50  erator = WO_NOOP
9300: 3b 20 20 2f 2a 20 63 61 73 65 20 31 20 74 72 75  ;  /* case 1 tru
9310: 6d 70 73 20 63 61 73 65 20 32 20 2a 2f 0a 20 20  mps case 2 */.  
9320: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
9330: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
9340: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
9350: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
9360: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a  _SUBQUERY */../*
9370: 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f  .** The input to
9380: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
9390: 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74   an WhereTerm st
93a0: 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c  ructure with onl
93b0: 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22  y the.** "pExpr"
93c0: 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e   field filled in
93d0: 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  .  The job of th
93e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
93f0: 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20   analyze the.** 
9400: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  subexpression an
9410: 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74  d populate all t
9420: 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  he other fields 
9430: 6f 66 20 74 68 65 20 57 68 65 72 65 54 65 72 6d  of the WhereTerm
9440: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
9450: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
9460: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
9470: 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f   form "<expr> <o
9480: 70 3e 20 58 22 20 69 74 20 67 65 74 73 20 63 6f  p> X" it gets co
9490: 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  mmuted.** to the
94a0: 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f   standard form o
94b0: 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  f "X <op> <expr>
94c0: 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  "..**.** If the 
94d0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
94e0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
94f0: 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74 68 20  > Y" where both 
9500: 58 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63  X and Y are.** c
9510: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65  olumns, then the
9520: 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65 73   original expres
9530: 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65  sion is unchange
9540: 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74  d and a new virt
9550: 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74  ual.** term of t
9560: 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20  he form "Y <op> 
9570: 58 22 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  X" is added to t
9580: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
9590: 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  and.** analyzed 
95a0: 73 65 70 61 72 61 74 65 6c 79 2e 20 20 54 68 65  separately.  The
95b0: 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 69   original term i
95c0: 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45  s marked with TE
95d0: 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64  RM_COPIED.** and
95e0: 20 74 68 65 20 6e 65 77 20 74 65 72 6d 20 69 73   the new term is
95f0: 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45 52   marked with TER
9600: 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65 63 61 75  M_DYNAMIC (becau
9610: 73 65 20 69 74 27 73 20 70 45 78 70 72 0a 2a 2a  se it's pExpr.**
9620: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65   needs to be fre
9630: 65 64 20 77 69 74 68 20 74 68 65 20 57 68 65 72  ed with the Wher
9640: 65 43 6c 61 75 73 65 29 20 61 6e 64 20 54 45 52  eClause) and TER
9650: 4d 5f 56 49 52 54 55 41 4c 20 28 62 65 63 61 75  M_VIRTUAL (becau
9660: 73 65 20 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f  se it.** is a co
9670: 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f 66 20 61  mmuted copy of a
9680: 20 70 72 69 6f 72 20 74 65 72 6d 2e 29 20 20 54   prior term.)  T
9690: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d  he original term
96a0: 20 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a   has nChild=1.**
96b0: 20 61 6e 64 20 74 68 65 20 63 6f 70 79 20 68 61   and the copy ha
96c0: 73 20 69 64 78 50 61 72 65 6e 74 20 73 65 74 20  s idxParent set 
96d0: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
96e0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  the original ter
96f0: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
9700: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20  d exprAnalyze(. 
9710: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
9720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
9730: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
9740: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
9750: 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pWC,         /* 
9760: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
9770: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72   */.  int idxTer
9780: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
9790: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
97a0: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
97b0: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  zed */.){.  Wher
97c0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
97d0: 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 2f 2a 20  pWC->pWInfo; /* 
97e0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
97f0: 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  cessing context 
9800: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
9810: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
9820: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72        /* The ter
9830: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
9840: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
9850: 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20  et *pMaskSet;   
9860: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66         /* Set of
9870: 20 74 61 62 6c 65 20 69 6e 64 65 78 20 6d 61 73   table index mas
9880: 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  ks */.  Expr *pE
9890: 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
98a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
98b0: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
98c0: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42   analyzed */.  B
98d0: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66  itmask prereqLef
98e0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
98f0: 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73  /* Prerequesites
9900: 20 6f 66 20 74 68 65 20 70 45 78 70 72 2d 3e 70   of the pExpr->p
9910: 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73  Left */.  Bitmas
9920: 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20  k prereqAll;    
9930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
9940: 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 70  erequesites of p
9950: 45 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73  Expr */.  Bitmas
9960: 6b 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 30  k extraRight = 0
9970: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ;          /* Ex
9980: 74 72 61 20 64 65 70 65 6e 64 65 6e 63 69 65 73  tra dependencies
9990: 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f   on LEFT JOIN */
99a0: 0a 20 20 45 78 70 72 20 2a 70 53 74 72 31 20 3d  .  Expr *pStr1 =
99b0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
99c0: 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49      /* RHS of LI
99d0: 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  KE/GLOB operator
99e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70   */.  int isComp
99f0: 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20  lete = 0;       
9a00: 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66         /* RHS of
9a10: 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20   LIKE/GLOB ends 
9a20: 77 69 74 68 20 77 69 6c 64 63 61 72 64 20 2a 2f  with wildcard */
9a30: 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20  .  int noCase = 
9a40: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
9a50: 20 20 20 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42      /* LIKE/GLOB
9a60: 20 64 69 73 74 69 6e 67 75 69 73 68 65 73 20 63   distinguishes c
9a70: 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  ase */.  int op;
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
9aa0: 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e  -level operator.
9ab0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20    pExpr->op */. 
9ac0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
9ad0: 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
9ae0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
9af0: 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
9b00: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9b10: 64 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61  db;        /* Da
9b20: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
9b30: 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e  n */..  if( db->
9b40: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
9b50: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
9b60: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
9b70: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d  a[idxTerm];.  pM
9b80: 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f  askSet = &pWInfo
9b90: 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 70 45  ->sMaskSet;.  pE
9ba0: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
9bb0: 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  pr;.  assert( pE
9bc0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 53 20 26  xpr->op!=TK_AS &
9bd0: 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  & pExpr->op!=TK_
9be0: 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 70 72 65  COLLATE );.  pre
9bf0: 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54 61  reqLeft = exprTa
9c00: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
9c10: 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
9c20: 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  ;.  op = pExpr->
9c30: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
9c40: 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _IN ){.    asser
9c50: 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t( pExpr->pRight
9c60: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 45  ==0 );.    if( E
9c70: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9c80: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
9c90: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 70 54 65  ct) ){.      pTe
9ca0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
9cb0: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
9cc0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
9cd0: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
9ce0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
9cf0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72       pTerm->prer
9d00: 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 4c 69  eqRight = exprLi
9d10: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
9d20: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e  skSet, pExpr->x.
9d30: 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
9d40: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
9d50: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70  _ISNULL ){.    p
9d60: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
9d70: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
9d80: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
9d90: 71 52 69 67 68 74 20 3d 20 65 78 70 72 54 61 62  qRight = exprTab
9da0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
9db0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
9dc0: 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65 71 41 6c  ;.  }.  prereqAl
9dd0: 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  l = exprTableUsa
9de0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
9df0: 70 72 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  pr);.  if( ExprH
9e00: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
9e10: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
9e20: 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 78 20  {.    Bitmask x 
9e30: 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
9e40: 65 74 2c 20 70 45 78 70 72 2d 3e 69 52 69 67 68  et, pExpr->iRigh
9e50: 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20  tJoinTable);.   
9e60: 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b   prereqAll |= x;
9e70: 0a 20 20 20 20 65 78 74 72 61 52 69 67 68 74 20  .    extraRight 
9e80: 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c  = x-1;  /* ON cl
9e90: 61 75 73 65 20 74 65 72 6d 73 20 6d 61 79 20 6e  ause terms may n
9ea0: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
9eb0: 61 6e 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  an index.       
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65  ** on left table
9ee0: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e   of a LEFT JOIN.
9ef0: 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 20 2a    Ticket #3015 *
9f00: 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70  /.  }.  pTerm->p
9f10: 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65  rereqAll = prere
9f20: 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c  qAll;.  pTerm->l
9f30: 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  eftCursor = -1;.
9f40: 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74    pTerm->iParent
9f50: 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e   = -1;.  pTerm->
9f60: 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20  eOperator = 0;. 
9f70: 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f   if( allowedOp(o
9f80: 70 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  p) ){.    Expr *
9f90: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
9fa0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
9fb0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
9fc0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
9fd0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
9fe0: 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e 70  Collate(pExpr->p
9ff0: 52 69 67 68 74 29 3b 0a 20 20 20 20 75 31 36 20  Right);.    u16 
a000: 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65 72 6d 2d  opMask = (pTerm-
a010: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
a020: 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 3f 20  rereqLeft)==0 ? 
a030: 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45 51 55 49  WO_ALL : WO_EQUI
a040: 56 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  V;.    if( pLeft
a050: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
a060: 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ){.      pTerm->
a070: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
a080: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
a090: 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43    pTerm->u.leftC
a0a0: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
a0b0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54  Column;.      pT
a0c0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
a0d0: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f 70   operatorMask(op
a0e0: 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20  ) & opMask;.    
a0f0: 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  }.    if( pRight
a100: 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d   && pRight->op==
a110: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
a120: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
a130: 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ew;.      Expr *
a140: 70 44 75 70 3b 0a 20 20 20 20 20 20 75 31 36 20  pDup;.      u16 
a150: 65 45 78 74 72 61 4f 70 20 3d 20 30 3b 20 20 20  eExtraOp = 0;   
a160: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 69       /* Extra bi
a170: 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e 65 4f 70  ts for pNew->eOp
a180: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
a190: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
a1a0: 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20  ursor>=0 ){.    
a1b0: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
a1c0: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
a1d0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
a1e0: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
a1f0: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
a200: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
a210: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
a220: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44 75  prDelete(db, pDu
a230: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
a240: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  turn;.        }.
a250: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d          idxNew =
a260: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
a270: 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20 54 45  rt(pWC, pDup, TE
a280: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
a290: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
a2a0: 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d 30 20    if( idxNew==0 
a2b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
a2c0: 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61    pNew = &pWC->a
a2d0: 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20  [idxNew];.      
a2e0: 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20    pNew->iParent 
a2f0: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
a300: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
a310: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
a320: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
a330: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ld = 1;.        
a340: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
a350: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
a360: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
a370: 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20 20 20 20  ->op==TK_EQ.    
a380: 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73       && !ExprHas
a390: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
a3a0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
a3b0: 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a        && Optimiz
a3c0: 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
a3d0: 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 69 74 69   SQLITE_Transiti
a3e0: 76 65 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ve).        ){. 
a3f0: 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e           pTerm->
a400: 65 4f 70 65 72 61 74 6f 72 20 7c 3d 20 57 4f 5f  eOperator |= WO_
a410: 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20 20  EQUIV;.         
a420: 20 65 45 78 74 72 61 4f 70 20 3d 20 57 4f 5f 45   eExtraOp = WO_E
a430: 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20 7d 0a  QUIV;.        }.
a440: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a450: 20 20 20 20 20 70 44 75 70 20 3d 20 70 45 78 70       pDup = pExp
a460: 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  r;.        pNew 
a470: 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
a480: 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75  .      exprCommu
a490: 74 65 28 70 50 61 72 73 65 2c 20 70 44 75 70 29  te(pParse, pDup)
a4a0: 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20  ;.      pLeft = 
a4b0: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
a4c0: 6f 6c 6c 61 74 65 28 70 44 75 70 2d 3e 70 4c 65  ollate(pDup->pLe
a4d0: 66 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ft);.      pNew-
a4e0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
a4f0: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
a500: 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66 74 43     pNew->u.leftC
a510: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
a520: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 74 65  Column;.      te
a530: 73 74 63 61 73 65 28 20 28 70 72 65 72 65 71 4c  stcase( (prereqL
a540: 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74  eft | extraRight
a550: 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66 74 20  ) != prereqLeft 
a560: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  );.      pNew->p
a570: 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
a580: 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52  reqLeft | extraR
a590: 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  ight;.      pNew
a5a0: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
a5b0: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70  ereqAll;.      p
a5c0: 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  New->eOperator =
a5d0: 20 28 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70   (operatorMask(p
a5e0: 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45 78 74 72  Dup->op) + eExtr
a5f0: 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20  aOp) & opMask;. 
a600: 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65     }.  }..#ifnde
a610: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45  f SQLITE_OMIT_BE
a620: 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49  TWEEN_OPTIMIZATI
a630: 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74 65 72  ON.  /* If a ter
a640: 6d 20 69 73 20 74 68 65 20 42 45 54 57 45 45 4e  m is the BETWEEN
a650: 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65 61 74   operator, creat
a660: 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74 75 61  e two new virtua
a670: 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61  l terms.  ** tha
a680: 74 20 64 65 66 69 6e 65 20 74 68 65 20 72 61 6e  t define the ran
a690: 67 65 20 74 68 61 74 20 74 68 65 20 42 45 54 57  ge that the BETW
a6a0: 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 20  EEN implements. 
a6b0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20   For example:.  
a6c0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 61 20 42  **.  **      a B
a6d0: 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63 0a 20  ETWEEN b AND c. 
a6e0: 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76   **.  ** is conv
a6f0: 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a  erted into:.  **
a700: 0a 20 20 2a 2a 20 20 20 20 20 20 28 61 20 42 45  .  **      (a BE
a710: 54 57 45 45 4e 20 62 20 41 4e 44 20 63 29 20 41  TWEEN b AND c) A
a720: 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44 20 28 61  ND (a>=b) AND (a
a730: 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  <=c).  **.  ** T
a740: 68 65 20 74 77 6f 20 6e 65 77 20 74 65 72 6d 73  he two new terms
a750: 20 61 72 65 20 61 64 64 65 64 20 6f 6e 74 6f 20   are added onto 
a760: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
a770: 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63  hereClause objec
a780: 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 65 77 20  t..  ** The new 
a790: 74 65 72 6d 73 20 61 72 65 20 22 64 79 6e 61 6d  terms are "dynam
a7a0: 69 63 22 20 61 6e 64 20 61 72 65 20 63 68 69 6c  ic" and are chil
a7b0: 64 72 65 6e 20 6f 66 20 74 68 65 20 6f 72 69 67  dren of the orig
a7c0: 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a 20 20 2a  inal BETWEEN.  *
a7d0: 2a 20 74 65 72 6d 2e 20 20 54 68 61 74 20 6d 65  * term.  That me
a7e0: 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 20  ans that if the 
a7f0: 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20  BETWEEN term is 
a800: 63 6f 64 65 64 2c 20 74 68 65 20 63 68 69 6c 64  coded, the child
a810: 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20 73 6b 69  ren are.  ** ski
a820: 70 70 65 64 2e 20 20 4f 72 2c 20 69 66 20 74 68  pped.  Or, if th
a830: 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 73  e children are s
a840: 61 74 69 73 66 69 65 64 20 62 79 20 61 6e 20 69  atisfied by an i
a850: 6e 64 65 78 2c 20 74 68 65 20 6f 72 69 67 69 6e  ndex, the origin
a860: 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45 45 4e 20  al.  ** BETWEEN 
a870: 74 65 72 6d 20 69 73 20 73 6b 69 70 70 65 64 2e  term is skipped.
a880: 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28  .  */.  else if(
a890: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42   pExpr->op==TK_B
a8a0: 45 54 57 45 45 4e 20 26 26 20 70 57 43 2d 3e 6f  ETWEEN && pWC->o
a8b0: 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p==TK_AND ){.   
a8c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
a8d0: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
a8e0: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
a8f0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
a900: 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45  8 ops[] = {TK_GE
a910: 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73  , TK_LE};.    as
a920: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
a930: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
a940: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b  ist->nExpr==2 );
a950: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
a960: 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  2; i++){.      E
a970: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
a980: 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b       int idxNew;
a990: 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20  .      pNewExpr 
a9a0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
a9b0: 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a  Parse, ops[i], .
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
a9e0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
a9f0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29  pExpr->pLeft, 0)
aa00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
aa20: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
aa30: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
aa40: 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20  xpr, 0), 0);.   
aa50: 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d     transferJoinM
aa60: 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78 70 72  arkings(pNewExpr
aa70: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
aa80: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
aa90: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
aaa0: 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56  pNewExpr, TERM_V
aab0: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
aac0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MIC);.      test
aad0: 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20  case( idxNew==0 
aae0: 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61  );.      exprAna
aaf0: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
ab00: 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 70  idxNew);.      p
ab10: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
ab20: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70  dxTerm];.      p
ab30: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50  WC->a[idxNew].iP
ab40: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
ab50: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d  .    }.    pTerm
ab60: 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20  ->nChild = 2;.  
ab70: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
ab80: 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f  TE_OMIT_BETWEEN_
ab90: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
aba0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
abb0: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
abc0: 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64  IMIZATION) && !d
abd0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
abe0: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20 20 2f  IT_SUBQUERY).  /
abf0: 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d  * Analyze a term
ac00: 20 74 68 61 74 20 69 73 20 63 6f 6d 70 6f 73 65   that is compose
ac10: 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  d of two or more
ac20: 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63   subterms connec
ac30: 74 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e 20 4f  ted by.  ** an O
ac40: 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f  R operator..  */
ac50: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70  .  else if( pExp
ac60: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a  r->op==TK_OR ){.
ac70: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 43 2d      assert( pWC-
ac80: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20  >op==TK_AND );. 
ac90: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72     exprAnalyzeOr
aca0: 54 65 72 6d 28 70 53 72 63 2c 20 70 57 43 2c 20  Term(pSrc, pWC, 
acb0: 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 70 54  idxTerm);.    pT
acc0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
acd0: 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64  xTerm];.  }.#end
ace0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
acf0: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
ad00: 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  N */..#ifndef SQ
ad10: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
ad20: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a  PTIMIZATION.  /*
ad30: 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 73   Add constraints
ad40: 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20 73   to reduce the s
ad50: 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e 20 61  earch space on a
ad60: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20   LIKE or GLOB.  
ad70: 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  ** operator..  *
ad80: 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61  *.  ** A like pa
ad90: 74 74 65 72 6e 20 6f 66 20 74 68 65 20 66 6f 72  ttern of the for
ada0: 6d 20 22 78 20 4c 49 4b 45 20 27 61 62 63 25 27  m "x LIKE 'abc%'
adb0: 22 20 69 73 20 63 68 61 6e 67 65 64 20 69 6e 74  " is changed int
adc0: 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  o constraints.  
add0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
ade0: 20 78 3e 3d 27 61 62 63 27 20 41 4e 44 20 78 3c   x>='abc' AND x<
adf0: 27 61 62 64 27 20 41 4e 44 20 78 20 4c 49 4b 45  'abd' AND x LIKE
ae00: 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a 20 20 2a   'abc%'.  **.  *
ae10: 2a 20 54 68 65 20 6c 61 73 74 20 63 68 61 72 61  * The last chara
ae20: 63 74 65 72 20 6f 66 20 74 68 65 20 70 72 65 66  cter of the pref
ae30: 69 78 20 22 61 62 63 22 20 69 73 20 69 6e 63 72  ix "abc" is incr
ae40: 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20  emented to form 
ae50: 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61  the.  ** termina
ae60: 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22  tion condition "
ae70: 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  abd"..  */.  if(
ae80: 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44   pWC->op==TK_AND
ae90: 20 0a 20 20 20 26 26 20 69 73 4c 69 6b 65 4f 72   .   && isLikeOr
aea0: 47 6c 6f 62 28 70 50 61 72 73 65 2c 20 70 45 78  Glob(pParse, pEx
aeb0: 70 72 2c 20 26 70 53 74 72 31 2c 20 26 69 73 43  pr, &pStr1, &isC
aec0: 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65  omplete, &noCase
aed0: 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20  ).  ){.    Expr 
aee0: 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a  *pLeft;       /*
aef0: 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f   LHS of LIKE/GLO
af00: 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  B operator */.  
af10: 20 20 45 78 70 72 20 2a 70 53 74 72 32 3b 20 20    Expr *pStr2;  
af20: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
af30: 70 53 74 72 31 20 2d 20 52 48 53 20 6f 66 20 4c  pStr1 - RHS of L
af40: 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f  IKE/GLOB operato
af50: 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70  r */.    Expr *p
af60: 4e 65 77 45 78 70 72 31 3b 0a 20 20 20 20 45 78  NewExpr1;.    Ex
af70: 70 72 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20  pr *pNewExpr2;. 
af80: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a     int idxNew1;.
af90: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 32 3b      int idxNew2;
afa0: 0a 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6c  .    Token sColl
afb0: 53 65 71 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d  SeqName;  /* Nam
afc0: 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e 67 20 73  e of collating s
afd0: 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20  equence */..    
afe0: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78  pLeft = pExpr->x
aff0: 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
b000: 70 72 3b 0a 20 20 20 20 70 53 74 72 32 20 3d 20  pr;.    pStr2 = 
b010: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
b020: 62 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20  b, pStr1, 0);.  
b030: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
b040: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
b050: 20 75 38 20 63 2c 20 2a 70 43 3b 20 20 20 20 20   u8 c, *pC;     
b060: 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 72 61 63    /* Last charac
b070: 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20 66  ter before the f
b080: 69 72 73 74 20 77 69 6c 64 63 61 72 64 20 2a 2f  irst wildcard */
b090: 0a 20 20 20 20 20 20 70 43 20 3d 20 28 75 38 2a  .      pC = (u8*
b0a0: 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65  )&pStr2->u.zToke
b0b0: 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  n[sqlite3Strlen3
b0c0: 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65  0(pStr2->u.zToke
b0d0: 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d  n)-1];.      c =
b0e0: 20 2a 70 43 3b 0a 20 20 20 20 20 20 69 66 28 20   *pC;.      if( 
b0f0: 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20  noCase ){.      
b100: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69    /* The point i
b110: 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  s to increment t
b120: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
b130: 72 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  r before the fir
b140: 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  st.        ** wi
b150: 6c 64 63 61 72 64 2e 20 20 42 75 74 20 69 66 20  ldcard.  But if 
b160: 77 65 20 69 6e 63 72 65 6d 65 6e 74 20 27 40 27  we increment '@'
b170: 2c 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  , that will push
b180: 20 69 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20   it into the.   
b190: 20 20 20 20 20 2a 2a 20 61 6c 70 68 61 62 65 74       ** alphabet
b1a0: 69 63 20 72 61 6e 67 65 20 77 68 65 72 65 20 63  ic range where c
b1b0: 61 73 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20  ase conversions 
b1c0: 77 69 6c 6c 20 6d 65 73 73 20 75 70 20 74 68 65  will mess up the
b1d0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 65   .        ** ine
b1e0: 71 75 61 6c 69 74 79 2e 20 20 54 6f 20 61 76 6f  quality.  To avo
b1f0: 69 64 20 74 68 69 73 2c 20 6d 61 6b 65 20 73 75  id this, make su
b200: 72 65 20 74 6f 20 61 6c 73 6f 20 72 75 6e 20 74  re to also run t
b210: 68 65 20 66 75 6c 6c 0a 20 20 20 20 20 20 20 20  he full.        
b220: 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c 6c 20 63  ** LIKE on all c
b230: 61 6e 64 69 64 61 74 65 20 65 78 70 72 65 73 73  andidate express
b240: 69 6f 6e 73 20 62 79 20 63 6c 65 61 72 69 6e 67  ions by clearing
b250: 20 74 68 65 20 69 73 43 6f 6d 70 6c 65 74 65 20   the isComplete 
b260: 66 6c 61 67 0a 20 20 20 20 20 20 20 20 2a 2f 0a  flag.        */.
b270: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
b280: 41 27 2d 31 20 29 20 69 73 43 6f 6d 70 6c 65 74  A'-1 ) isComplet
b290: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  e = 0;.        c
b2a0: 20 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72 54   = sqlite3UpperT
b2b0: 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20  oLower[c];.     
b2c0: 20 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d 20 63   }.      *pC = c
b2d0: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   + 1;.    }.    
b2e0: 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e 7a 20 3d  sCollSeqName.z =
b2f0: 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f 43 41 53   noCase ? "NOCAS
b300: 45 22 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20  E" : "BINARY";. 
b310: 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e     sCollSeqName.
b320: 6e 20 3d 20 36 3b 0a 20 20 20 20 70 4e 65 77 45  n = 6;.    pNewE
b330: 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78  xpr1 = sqlite3Ex
b340: 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c  prDup(db, pLeft,
b350: 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70   0);.    pNewExp
b360: 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  r1 = sqlite3PExp
b370: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 45 2c  r(pParse, TK_GE,
b380: 20 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c   .           sql
b390: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
b3a0: 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 70  teToken(pParse,p
b3b0: 4e 65 77 45 78 70 72 31 2c 26 73 43 6f 6c 6c 53  NewExpr1,&sCollS
b3c0: 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  eqName),.       
b3d0: 20 20 20 20 70 53 74 72 31 2c 20 30 29 3b 0a 20      pStr1, 0);. 
b3e0: 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d     transferJoinM
b3f0: 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78 70 72  arkings(pNewExpr
b400: 31 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69  1, pExpr);.    i
b410: 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c  dxNew1 = whereCl
b420: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
b430: 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52 4d 5f  pNewExpr1, TERM_
b440: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
b450: 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63  AMIC);.    testc
b460: 61 73 65 28 20 69 64 78 4e 65 77 31 3d 3d 30 20  ase( idxNew1==0 
b470: 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  );.    exprAnaly
b480: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
b490: 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e 65 77  xNew1);.    pNew
b4a0: 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33 45  Expr2 = sqlite3E
b4b0: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
b4c0: 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78  , 0);.    pNewEx
b4d0: 70 72 32 20 3d 20 73 71 6c 69 74 65 33 50 45 78  pr2 = sqlite3PEx
b4e0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54  pr(pParse, TK_LT
b4f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
b500: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
b510: 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 70  teToken(pParse,p
b520: 4e 65 77 45 78 70 72 32 2c 26 73 43 6f 6c 6c 53  NewExpr2,&sCollS
b530: 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  eqName),.       
b540: 20 20 20 20 70 53 74 72 32 2c 20 30 29 3b 0a 20      pStr2, 0);. 
b550: 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d     transferJoinM
b560: 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78 70 72  arkings(pNewExpr
b570: 32 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69  2, pExpr);.    i
b580: 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c  dxNew2 = whereCl
b590: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
b5a0: 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f  pNewExpr2, TERM_
b5b0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
b5c0: 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63  AMIC);.    testc
b5d0: 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30 20  ase( idxNew2==0 
b5e0: 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  );.    exprAnaly
b5f0: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
b600: 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72  xNew2);.    pTer
b610: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
b620: 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73  erm];.    if( is
b630: 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20  Complete ){.    
b640: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31    pWC->a[idxNew1
b650: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
b660: 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e  erm;.      pWC->
b670: 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65  a[idxNew2].iPare
b680: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
b690: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
b6a0: 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 2;.    }.  }
b6b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b6c0: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
b6d0: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
b6e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b6f0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
b700: 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43  /* Add a WO_MATC
b710: 48 20 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d  H auxiliary term
b720: 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69   to the constrai
b730: 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a 20 20  nt set if the.  
b740: 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72 65  ** current expre
b750: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
b760: 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41  form:  column MA
b770: 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54  TCH expr..  ** T
b780: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
b790: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 78  is used by the x
b7a0: 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
b7b0: 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61  s of.  ** virtua
b7c0: 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e  l tables.  The n
b7d0: 61 74 69 76 65 20 71 75 65 72 79 20 6f 70 74 69  ative query opti
b7e0: 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61  mizer does not a
b7f0: 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64  ttempt.  ** to d
b800: 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20  o anything with 
b810: 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e  MATCH functions.
b820: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61  .  */.  if( isMa
b830: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70  tchOfColumn(pExp
b840: 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  r) ){.    int id
b850: 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a  xNew;.    Expr *
b860: 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a  pRight, *pLeft;.
b870: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
b880: 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74  NewTerm;.    Bit
b890: 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d  mask prereqColum
b8a0: 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a  n, prereqExpr;..
b8b0: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78      pRight = pEx
b8c0: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
b8d0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 65  ].pExpr;.    pLe
b8e0: 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ft = pExpr->x.pL
b8f0: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
b900: 0a 20 20 20 20 70 72 65 72 65 71 45 78 70 72 20  .    prereqExpr 
b910: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
b920: 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68  (pMaskSet, pRigh
b930: 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43 6f  t);.    prereqCo
b940: 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c 65  lumn = exprTable
b950: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
b960: 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20  pLeft);.    if( 
b970: 28 70 72 65 72 65 71 45 78 70 72 20 26 20 70 72  (prereqExpr & pr
b980: 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29  ereqColumn)==0 )
b990: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
b9a0: 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  ewExpr;.      pN
b9b0: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
b9c0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
b9d0: 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20 20  _MATCH, .       
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65         0, sqlite
ba00: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 52 69  3ExprDup(db, pRi
ba10: 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20  ght, 0), 0);.   
ba20: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
ba30: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
ba40: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
ba50: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
ba60: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74  YNAMIC);.      t
ba70: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
ba80: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
ba90: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
baa0: 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e  dxNew];.      pN
bab0: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  ewTerm->prereqRi
bac0: 67 68 74 20 3d 20 70 72 65 72 65 71 45 78 70 72  ght = prereqExpr
bad0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
bae0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
baf0: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
bb00: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e      pNewTerm->u.
bb10: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
bb20: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
bb30: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70     pNewTerm->eOp
bb40: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43  erator = WO_MATC
bb50: 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  H;.      pNewTer
bb60: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  m->iParent = idx
bb70: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72  Term;.      pTer
bb80: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
bb90: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  erm];.      pTer
bba0: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
bbb0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
bbc0: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49  ags |= TERM_COPI
bbd0: 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  ED;.      pNewTe
bbe0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
bbf0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
bc00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
bc10: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
bc20: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
bc30: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
bc40: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
bc50: 5f 53 54 41 54 34 0a 20 20 2f 2a 20 57 68 65 6e  _STAT4.  /* When
bc60: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69   sqlite_stat3 hi
bc70: 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20  stogram data is 
bc80: 61 76 61 69 6c 61 62 6c 65 20 61 6e 20 6f 70 65  available an ope
bc90: 72 61 74 6f 72 20 6f 66 20 74 68 65 0a 20 20 2a  rator of the.  *
bca0: 2a 20 66 6f 72 6d 20 22 78 20 49 53 20 4e 4f 54  * form "x IS NOT
bcb0: 20 4e 55 4c 4c 22 20 63 61 6e 20 73 6f 6d 65 74   NULL" can somet
bcc0: 69 6d 65 73 20 62 65 20 65 76 61 6c 75 61 74 65  imes be evaluate
bcd0: 64 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  d more efficient
bce0: 6c 79 0a 20 20 2a 2a 20 61 73 20 22 78 3e 4e 55  ly.  ** as "x>NU
bcf0: 4c 4c 22 20 69 66 20 78 20 69 73 20 6e 6f 74 20  LL" if x is not 
bd00: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
bd10: 52 59 20 4b 45 59 2e 20 20 53 6f 20 63 6f 6e 73  RY KEY.  So cons
bd20: 74 72 75 63 74 20 61 0a 20 20 2a 2a 20 76 69 72  truct a.  ** vir
bd30: 74 75 61 6c 20 74 65 72 6d 20 6f 66 20 74 68 61  tual term of tha
bd40: 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  t form..  **.  *
bd50: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
bd60: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6d 75 73  virtual term mus
bd70: 74 20 62 65 20 74 61 67 67 65 64 20 77 69 74 68  t be tagged with
bd80: 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20 20 54 68   TERM_VNULL.  Th
bd90: 69 73 0a 20 20 2a 2a 20 54 45 52 4d 5f 56 4e 55  is.  ** TERM_VNU
bda0: 4c 4c 20 74 61 67 20 77 69 6c 6c 20 73 75 70 70  LL tag will supp
bdb0: 72 65 73 73 20 74 68 65 20 6e 6f 74 2d 6e 75 6c  ress the not-nul
bdc0: 6c 20 63 68 65 63 6b 20 61 74 20 74 68 65 20 62  l check at the b
bdd0: 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66  eginning.  ** of
bde0: 20 74 68 65 20 6c 6f 6f 70 2e 20 20 57 69 74 68   the loop.  With
bdf0: 6f 75 74 20 74 68 65 20 54 45 52 4d 5f 56 4e 55  out the TERM_VNU
be00: 4c 4c 20 66 6c 61 67 2c 20 74 68 65 20 6e 6f 74  LL flag, the not
be10: 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 0a 20  -null check at. 
be20: 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66   ** the start of
be30: 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 70   the loop will p
be40: 72 65 76 65 6e 74 20 61 6e 79 20 72 65 73 75 6c  revent any resul
be50: 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65  ts from being re
be60: 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  turned..  */.  i
be70: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
be80: 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 70  _NOTNULL.   && p
be90: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  Expr->pLeft->op=
bea0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26  =TK_COLUMN.   &&
beb0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
bec0: 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 26 26 20  Column>=0.   && 
bed0: 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
bee0: 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53  led(db, SQLITE_S
bef0: 74 61 74 33 29 0a 20 20 29 7b 0a 20 20 20 20 45  tat3).  ){.    E
bf00: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
bf10: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
bf20: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
bf30: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
bf40: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
bf50: 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20 70 4e 65  ewTerm;..    pNe
bf60: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  wExpr = sqlite3P
bf70: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
bf80: 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  GT,.            
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
bfb0: 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20  b, pLeft, 0),.  
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfd0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
bfe0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
bff0: 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29  K_NULL, 0, 0, 0)
c000: 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64 78 4e 65  , 0);..    idxNe
c010: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
c020: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
c030: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 20 20 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c     TERM_VIRTUAL|
c060: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52  TERM_DYNAMIC|TER
c070: 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66  M_VNULL);.    if
c080: 28 20 69 64 78 4e 65 77 20 29 7b 0a 20 20 20 20  ( idxNew ){.    
c090: 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57    pNewTerm = &pW
c0a0: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
c0b0: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72      pNewTerm->pr
c0c0: 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20  ereqRight = 0;. 
c0d0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c       pNewTerm->l
c0e0: 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
c0f0: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
c100: 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66   pNewTerm->u.lef
c110: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
c120: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
c130: 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61  pNewTerm->eOpera
c140: 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a 20 20 20  tor = WO_GT;.   
c150: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61     pNewTerm->iPa
c160: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
c170: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
c180: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
c190: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
c1a0: 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ild = 1;.      p
c1b0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
c1c0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20   TERM_COPIED;.  
c1d0: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72      pNewTerm->pr
c1e0: 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d  ereqAll = pTerm-
c1f0: 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20  >prereqAll;.    
c200: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
c210: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
c220: 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
c230: 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e  .  /* Prevent ON
c240: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66   clause terms of
c250: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f   a LEFT JOIN fro
c260: 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20  m being used to 
c270: 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e  drive.  ** an in
c280: 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73 20 74  dex for tables t
c290: 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68  o the left of th
c2a0: 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70  e join..  */.  p
c2b0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
c2c0: 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68 74 3b  t |= extraRight;
c2d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
c2e0: 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73  unction searches
c2f0: 20 70 4c 69 73 74 20 66 6f 72 20 61 20 65 6e 74   pList for a ent
c300: 72 79 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  ry that matches 
c310: 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
c320: 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65 78 20 70  mn.** of index p
c330: 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  Idx..**.** If su
c340: 63 68 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ch an expression
c350: 20 69 73 20 66 6f 75 6e 64 2c 20 69 74 73 20 69   is found, its i
c360: 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61  ndex in pList->a
c370: 5b 5d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  [] is returned. 
c380: 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73  If.** no express
c390: 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31  ion is found, -1
c3a0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
c3b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
c3c0: 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50 61 72 73  IndexCol(.  Pars
c3d0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
c3f0: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
c400: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
c410: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
c420: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
c430: 6c 69 73 74 20 74 6f 20 73 65 61 72 63 68 20 2a  list to search *
c440: 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 2c 20 20  /.  int iBase,  
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f      /* Cursor fo
c470: 72 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74  r table associat
c480: 65 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a  ed with pIdx */.
c490: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4b0: 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61    /* Index to ma
c4c0: 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f  tch column of */
c4d0: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20  .  int iCol     
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20     /* Column of 
c500: 69 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 2a  index to match *
c510: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
c520: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
c530: 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  l = pIdx->azColl
c540: 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69  [iCol];..  for(i
c550: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
c560: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
c570: 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45  pr *p = sqlite3E
c580: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
c590: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
c5a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  );.    if( p->op
c5b0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
c5c0: 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   && p->iColumn==
c5d0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
c5e0: 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20 70 2d 3e  Col].     && p->
c5f0: 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 0a 20 20  iTable==iBase.  
c600: 20 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53    ){.      CollS
c610: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
c620: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
c630: 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b  Parse, pList->a[
c640: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
c650: 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 6f 6c   if( ALWAYS(pCol
c660: 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  l) && 0==sqlite3
c670: 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
c680: 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  Name, zColl) ){.
c690: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69          return i
c6a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c6b0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31    }..  return -1
c6c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
c6d0: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  n true if the DI
c6e0: 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f  STINCT expressio
c6f0: 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  n-list passed as
c700: 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
c710: 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64  ent.** is redund
c720: 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53  ant..**.** A DIS
c730: 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20 72 65  TINCT list is re
c740: 64 75 6e 64 61 6e 74 20 69 66 20 74 68 65 20 64  dundant if the d
c750: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73  atabase contains
c760: 20 73 6f 6d 65 20 73 75 62 73 65 74 20 6f 66 0a   some subset of.
c770: 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  ** columns that 
c780: 61 72 65 20 75 6e 69 71 75 65 20 61 6e 64 20 6e  are unique and n
c790: 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  on-null..*/.stat
c7a0: 69 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63  ic int isDistinc
c7b0: 74 52 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61  tRedundant(.  Pa
c7c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
c7d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
c7e0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
c7f0: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
c800: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t,        /* The
c810: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
c820: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
c830: 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  WC,         /* T
c840: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
c850: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
c860: 44 69 73 74 69 6e 63 74 20 20 20 20 20 20 20 2f  Distinct       /
c870: 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
c880: 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
c890: 65 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b  e DISTINCT */.){
c8a0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
c8b0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
c8c0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 0a 20 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a   .  int iBase;..
c8f0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
c900: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74   more than one t
c910: 61 62 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c 65  able or sub-sele
c920: 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ct in the FROM c
c930: 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68  lause of.  ** th
c940: 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69  is query, then i
c950: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f  t will not be po
c960: 73 73 69 62 6c 65 20 74 6f 20 73 68 6f 77 20 74  ssible to show t
c970: 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54  hat the DISTINCT
c980: 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73   .  ** clause is
c990: 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20   redundant. */. 
c9a0: 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
c9b0: 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
c9c0: 30 3b 0a 20 20 69 42 61 73 65 20 3d 20 70 54 61  0;.  iBase = pTa
c9d0: 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72  bList->a[0].iCur
c9e0: 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20 70 54  sor;.  pTab = pT
c9f0: 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61  abList->a[0].pTa
ca00: 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20  b;..  /* If any 
ca10: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
ca20: 6e 73 20 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c  ns is an IPK col
ca30: 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42 61  umn on table iBa
ca40: 73 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  se, then return 
ca50: 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65  .  ** true. Note
ca60: 3a 20 54 68 65 20 28 70 2d 3e 69 54 61 62 6c 65  : The (p->iTable
ca70: 3d 3d 69 42 61 73 65 29 20 70 61 72 74 20 6f 66  ==iBase) part of
ca80: 20 74 68 69 73 20 74 65 73 74 20 6d 61 79 20 62   this test may b
ca90: 65 20 66 61 6c 73 65 20 69 66 20 74 68 65 0a 20  e false if the. 
caa0: 20 2a 2a 20 63 75 72 72 65 6e 74 20 53 45 4c 45   ** current SELE
cab0: 43 54 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74  CT is a correlat
cac0: 65 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20  ed sub-query..  
cad0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
cae0: 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72  pDistinct->nExpr
caf0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
cb00: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70   *p = sqlite3Exp
cb10: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 69  rSkipCollate(pDi
cb20: 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78  stinct->a[i].pEx
cb30: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  pr);.    if( p->
cb40: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
cb50: 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73   p->iTable==iBas
cb60: 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c  e && p->iColumn<
cb70: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
cb80: 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72  }..  /* Loop thr
cb90: 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73  ough all indices
cba0: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63   on the table, c
cbb0: 68 65 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20  hecking each to 
cbc0: 73 65 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a  see if it makes.
cbd0: 20 20 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43    ** the DISTINC
cbe0: 54 20 71 75 61 6c 69 66 69 65 72 20 72 65 64 75  T qualifier redu
cbf0: 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73  ndant. It does s
cc00: 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  o if:.  **.  ** 
cc10: 20 20 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69    1. The index i
cc20: 73 20 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c  s itself UNIQUE,
cc30: 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   and.  **.  **  
cc40: 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63   2. All of the c
cc50: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
cc60: 64 65 78 20 61 72 65 20 65 69 74 68 65 72 20 70  dex are either p
cc70: 61 72 74 20 6f 66 20 74 68 65 20 70 44 69 73 74  art of the pDist
cc80: 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c  inct.  **      l
cc90: 69 73 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65  ist, or else the
cca0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
ccb0: 6e 74 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66  ntains a term of
ccc0: 20 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58   the form "col=X
ccd0: 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65  ",.  **      whe
cce0: 72 65 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61  re X is a consta
ccf0: 6e 74 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f  nt value. The co
cd00: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
cd10: 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20  s of the.  **   
cd20: 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e     comparison an
cd30: 64 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78  d select-list ex
cd40: 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d  pressions must m
cd50: 61 74 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68  atch those of th
cd60: 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20  e index..  **.  
cd70: 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74  **   3. All of t
cd80: 68 6f 73 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d  hose index colum
cd90: 6e 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ns for which the
cda0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f   WHERE clause do
cdb0: 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20  es not.  **     
cdc0: 20 63 6f 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d   contain a "col=
cdd0: 58 22 20 74 65 72 6d 20 61 72 65 20 73 75 62 6a  X" term are subj
cde0: 65 63 74 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c  ect to a NOT NUL
cdf0: 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20  L constraint..  
ce00: 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54  */.  for(pIdx=pT
ce10: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
ce20: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
ce30: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 64  xt){.    if( pId
ce40: 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e  x->onError==OE_N
ce50: 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  one ) continue;.
ce60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
ce70: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b  Idx->nKeyCol; i+
ce80: 2b 29 7b 0a 20 20 20 20 20 20 69 31 36 20 69 43  +){.      i16 iC
ce90: 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ol = pIdx->aiCol
cea0: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  umn[i];.      if
ceb0: 28 20 30 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57  ( 0==findTerm(pW
cec0: 43 2c 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20  C, iBase, iCol, 
ced0: 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f  ~(Bitmask)0, WO_
cee0: 45 51 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20  EQ, pIdx) ){.   
cef0: 20 20 20 20 20 69 6e 74 20 69 49 64 78 43 6f 6c       int iIdxCol
cf00: 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28   = findIndexCol(
cf10: 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63  pParse, pDistinc
cf20: 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c 20  t, iBase, pIdx, 
cf30: 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
cf40: 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61  iIdxCol<0 || pTa
cf50: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f  b->aCol[iCol].no
cf60: 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  tNull==0 ){.    
cf70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cf80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
cf90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
cfa0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b  pIdx->nKeyCol ){
cfb0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
cfc0: 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74 68 61  ndex implies tha
cfd0: 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71  t the DISTINCT q
cfe0: 75 61 6c 69 66 69 65 72 20 69 73 20 72 65 64 75  ualifier is redu
cff0: 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  ndant. */.      
d000: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
d010: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b    }..  return 0;
d020: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  .}.../*.** Estim
d030: 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69 74 68  ate the logarith
d040: 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76  m of the input v
d050: 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32 2e 0a  alue to base 2..
d060: 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
d070: 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73 74 20 4e   estLog(LogEst N
d080: 29 7b 0a 20 20 4c 6f 67 45 73 74 20 78 20 3d 20  ){.  LogEst x = 
d090: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 4e 29  sqlite3LogEst(N)
d0a0: 3b 0a 20 20 72 65 74 75 72 6e 20 78 3e 33 33 20  ;.  return x>33 
d0b0: 3f 20 78 20 2d 20 33 33 20 3a 20 30 3b 0a 7d 0a  ? x - 33 : 0;.}.
d0c0: 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69  ./*.** Two routi
d0d0: 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67  nes for printing
d0e0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
d0f0: 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  an sqlite3_index
d100: 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75  _info.** structu
d110: 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65  re.  Used for te
d120: 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
d130: 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65  ing only.  If ne
d140: 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f  ither.** SQLITE_
d150: 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44  TEST or SQLITE_D
d160: 45 42 55 47 20 61 72 65 20 64 65 66 69 6e 65 64  EBUG are defined
d170: 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75  , then these rou
d180: 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d  tines.** are no-
d190: 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ops..*/.#if !def
d1a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
d1b0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26  _VIRTUALTABLE) &
d1c0: 26 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54  & defined(WHERET
d1d0: 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74  RACE_ENABLED).st
d1e0: 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f  atic void TRACE_
d1f0: 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74  IDX_INPUTS(sqlit
d200: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
d210: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
d220: 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54  ( !sqlite3WhereT
d230: 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  race ) return;. 
d240: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
d250: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
d260: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
d270: 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73  ugPrintf("  cons
d280: 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d  traint[%d]: col=
d290: 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d  %d termid=%d op=
d2a0: 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22  %d usabled=%d\n"
d2b0: 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
d2c0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
d2d0: 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  t[i].iColumn,.  
d2e0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
d2f0: 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73  int[i].iTermOffs
d300: 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  et,.       p->aC
d310: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c  onstraint[i].op,
d320: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
d330: 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65  traint[i].usable
d340: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
d350: 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b  ; i<p->nOrderBy;
d360: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
d370: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
d380: 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f   orderby[%d]: co
d390: 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c  l=%d desc=%d\n",
d3a0: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
d3b0: 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d    p->aOrderBy[i]
d3c0: 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  .iColumn,.      
d3d0: 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e   p->aOrderBy[i].
d3e0: 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  desc);.  }.}.sta
d3f0: 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49  tic void TRACE_I
d400: 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74  DX_OUTPUTS(sqlit
d410: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
d420: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
d430: 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54  ( !sqlite3WhereT
d440: 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  race ) return;. 
d450: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
d460: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
d470: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
d480: 75 67 50 72 69 6e 74 66 28 22 20 20 75 73 61 67  ugPrintf("  usag
d490: 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25  e[%d]: argvIdx=%
d4a0: 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20  d omit=%d\n",.  
d4b0: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
d4c0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
d4d0: 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c  ge[i].argvIndex,
d4e0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
d4f0: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f  traintUsage[i].o
d500: 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  mit);.  }.  sqli
d510: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
d520: 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20    idxNum=%d\n", 
d530: 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71  p->idxNum);.  sq
d540: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
d550: 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22  ("  idxStr=%s\n"
d560: 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  , p->idxStr);.  
d570: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
d580: 74 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e  tf("  orderByCon
d590: 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e  sumed=%d\n", p->
d5a0: 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29  orderByConsumed)
d5b0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
d5c0: 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61  Printf("  estima
d5d0: 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70  tedCost=%g\n", p
d5e0: 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29  ->estimatedCost)
d5f0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
d600: 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61  Printf("  estima
d610: 74 65 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c  tedRows=%lld\n",
d620: 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77   p->estimatedRow
d630: 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66  s);.}.#else.#def
d640: 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  ine TRACE_IDX_IN
d650: 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20  PUTS(A).#define 
d660: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
d670: 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  S(A).#endif..#if
d680: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d690: 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
d6a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
d6b0: 55 45 20 69 66 20 74 68 65 20 57 48 45 52 45 20  UE if the WHERE 
d6c0: 63 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65 72  clause term pTer
d6d0: 6d 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77  m is of a form w
d6e0: 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64  here it.** could
d6f0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e   be used with an
d700: 20 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73   index to access
d710: 20 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20   pSrc, assuming 
d720: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  an appropriate.*
d730: 2a 20 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e  * index existed.
d740: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
d750: 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
d760: 28 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  (.  WhereTerm *p
d770: 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
d780: 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75     /* WHERE clau
d790: 73 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b  se term to check
d7a0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
d7b0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
d7c0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65       /* Table we
d7d0: 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61   are trying to a
d7e0: 63 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61  ccess */.  Bitma
d7f0: 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20  sk notReady     
d800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
d810: 6c 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f  les in outer loo
d820: 70 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  ps of the join *
d830: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b  /.){.  char aff;
d840: 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65  .  if( pTerm->le
d850: 66 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e  ftCursor!=pSrc->
d860: 69 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e  iCursor ) return
d870: 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d   0;.  if( (pTerm
d880: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
d890: 5f 45 51 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  _EQ)==0 ) return
d8a0: 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d   0;.  if( (pTerm
d8b0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
d8c0: 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 72  notReady)!=0 ) r
d8d0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
d8e0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
d8f0: 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b  mn<0 ) return 0;
d900: 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70  .  aff = pSrc->p
d910: 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d  Tab->aCol[pTerm-
d920: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61  >u.leftColumn].a
d930: 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21  ffinity;.  if( !
d940: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
d950: 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45  nityOk(pTerm->pE
d960: 78 70 72 2c 20 61 66 66 29 20 29 20 72 65 74 75  xpr, aff) ) retu
d970: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31  rn 0;.  return 1
d980: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
d990: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d9a0: 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
d9b0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
d9c0: 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63  code to construc
d9d0: 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  t the Index obje
d9e0: 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61  ct for an automa
d9f0: 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64  tic index.** and
da00: 20 74 6f 20 73 65 74 20 75 70 20 74 68 65 20 57   to set up the W
da10: 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74  hereLevel object
da20: 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20   pLevel so that 
da30: 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
da40: 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20  or.** makes use 
da50: 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  of the automatic
da60: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
da70: 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74  c void construct
da80: 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a  AutomaticIndex(.
da90: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dab0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
dac0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
dad0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
dae0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
daf0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
db00: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
db10: 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68  em *pSrc,  /* Th
db20: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
db30: 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65  rm to get the ne
db40: 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69  xt index */.  Bi
db50: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
db60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
db70: 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61  k of cursors tha
db80: 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61  t are not availa
db90: 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  ble */.  WhereLe
dba0: 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20  vel *pLevel     
dbb0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
dbc0: 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a  w index here */.
dbd0: 29 7b 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c  ){.  int nKeyCol
dbe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dbf0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
dc00: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e  lumns in the con
dc10: 73 74 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a  structed index *
dc20: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
dc30: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
dc40: 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d  /* A single term
dc50: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
dc60: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  ause */.  WhereT
dc70: 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20  erm *pWCEnd;    
dc80: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
dc90: 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49 6e  pWC->a[] */.  In
dca0: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
dcb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
dcc0: 65 63 74 20 64 65 73 63 72 69 62 69 6e 67 20 74  ect describing t
dcd0: 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  he transient ind
dce0: 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ex */.  Vdbe *v;
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd00: 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20      /* Prepared 
dd10: 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  statement under 
dd20: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
dd30: 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74 3b 20    int addrInit; 
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dd50: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
dd60: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62  initialization b
dd70: 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20  ypass jump */.  
dd80: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20  Table *pTable;  
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
dda0: 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69  he table being i
ddb0: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
ddc0: 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20  addrTop;        
ddd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
dde0: 66 20 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c  f the index fill
ddf0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72   loop */.  int r
de00: 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20  egRecord;       
de10: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
de20: 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e  er holding an in
de30: 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  dex record */.  
de40: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
de50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
de60: 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f  olumn counter */
de70: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
de90: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
dea0: 2f 0a 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c  /.  int mxBitCol
deb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dec0: 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d  /* Maximum colum
ded0: 6e 20 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73  n in pSrc->colUs
dee0: 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20  ed */.  CollSeq 
def0: 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pColl;         
df00: 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
df10: 20 73 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20   sequence to on 
df20: 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68  a column */.  Wh
df30: 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20  ereLoop *pLoop; 
df40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
df50: 20 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a   Loop object */.
df60: 20 20 63 68 61 72 20 2a 7a 4e 6f 74 55 73 65 64    char *zNotUsed
df70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
df80: 20 45 78 74 72 61 20 73 70 61 63 65 20 6f 6e 20   Extra space on 
df90: 74 68 65 20 65 6e 64 20 6f 66 20 70 49 64 78 20  the end of pIdx 
dfa0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 64 78  */.  Bitmask idx
dfb0: 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20  Cols;           
dfc0: 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 63 6f   /* Bitmap of co
dfd0: 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f 72 20 69  lumns used for i
dfe0: 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74  ndexing */.  Bit
dff0: 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20  mask extraCols; 
e000: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d           /* Bitm
e010: 61 70 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c  ap of additional
e020: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38   columns */.  u8
e030: 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 30   sentWarning = 0
e040: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
e050: 65 20 69 66 20 61 20 77 61 72 6e 6e 69 6e 67 20  e if a warnning 
e060: 68 61 73 20 62 65 65 6e 20 69 73 73 75 65 64 20  has been issued 
e070: 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  */..  /* Generat
e080: 65 20 63 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f  e code to skip o
e090: 76 65 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e  ver the creation
e0a0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61 74   and initializat
e0b0: 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ion of the.  ** 
e0c0: 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
e0d0: 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65  on 2nd and subse
e0e0: 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 73  quent iterations
e0f0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f   of the loop. */
e100: 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
e110: 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
e120: 76 21 3d 30 20 29 3b 0a 20 20 61 64 64 72 49 6e  v!=0 );.  addrIn
e130: 69 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  it = sqlite3Code
e140: 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 0a 20  Once(pParse);.. 
e150: 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
e160: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
e170: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64  that will be add
e180: 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a  ed to the index.
e190: 20 20 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f    ** and used to
e1a0: 20 6d 61 74 63 68 20 57 48 45 52 45 20 63 6c 61   match WHERE cla
e1b0: 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
e1c0: 2a 2f 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30  */.  nKeyCol = 0
e1d0: 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72  ;.  pTable = pSr
e1e0: 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e  c->pTab;.  pWCEn
e1f0: 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d  d = &pWC->a[pWC-
e200: 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70  >nTerm];.  pLoop
e210: 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
e220: 70 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30  p;.  idxCols = 0
e230: 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
e240: 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
e250: 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
e260: 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
e270: 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
e280: 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29  Src, notReady) )
e290: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
e2a0: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
e2b0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69  Column;.      Bi
e2c0: 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43  tmask cMask = iC
e2d0: 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49  ol>=BMS ? MASKBI
e2e0: 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42  T(BMS-1) : MASKB
e2f0: 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  IT(iCol);.      
e300: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
e310: 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  BMS );.      tes
e320: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
e330: 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -1 );.      if( 
e340: 21 73 65 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a  !sentWarning ){.
e350: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e360: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
e370: 4e 47 5f 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20  NG_AUTOINDEX,.  
e380: 20 20 20 20 20 20 20 20 20 20 22 61 75 74 6f 6d            "autom
e390: 61 74 69 63 20 69 6e 64 65 78 20 6f 6e 20 25 73  atic index on %s
e3a0: 28 25 73 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  (%s)", pTable->z
e3b0: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
e3c0: 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69    pTable->aCol[i
e3d0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col].zName);.   
e3e0: 20 20 20 20 20 73 65 6e 74 57 61 72 6e 69 6e 67       sentWarning
e3f0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
e400: 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73      if( (idxCols
e410: 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   & cMask)==0 ){.
e420: 20 20 20 20 20 20 20 20 69 66 28 20 77 68 65 72          if( wher
e430: 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72  eLoopResize(pPar
e440: 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e  se->db, pLoop, n
e450: 4b 65 79 43 6f 6c 2b 31 29 20 29 20 72 65 74 75  KeyCol+1) ) retu
e460: 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  rn;.        pLoo
e470: 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f  p->aLTerm[nKeyCo
e480: 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  l++] = pTerm;.  
e490: 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d        idxCols |=
e4a0: 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a   cMask;.      }.
e4b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
e4c0: 72 74 28 20 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b  rt( nKeyCol>0 );
e4d0: 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
e4e0: 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e  e.nEq = pLoop->n
e4f0: 4c 54 65 72 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b  LTerm = nKeyCol;
e500: 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  .  pLoop->wsFlag
e510: 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
e520: 5f 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f  _EQ | WHERE_IDX_
e530: 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44  ONLY | WHERE_IND
e540: 45 58 45 44 0a 20 20 20 20 20 20 20 20 20 20 20  EXED.           
e550: 20 20 20 20 20 20 20 20 20 20 7c 20 57 48 45 52            | WHER
e560: 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20  E_AUTO_INDEX;.. 
e570: 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
e580: 6d 62 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e  mber of addition
e590: 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  al columns neede
e5a0: 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20  d to create a.  
e5b0: 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  ** covering inde
e5c0: 78 2e 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20  x.  A "covering 
e5d0: 69 6e 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64  index" is an ind
e5e0: 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
e5f0: 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e   all.  ** column
e600: 73 20 74 68 61 74 20 61 72 65 20 6e 65 65 64 65  s that are neede
e610: 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 20  d by the query. 
e620: 20 57 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67   With a covering
e630: 20 69 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a   index, the.  **
e640: 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20   original table 
e650: 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
e660: 65 20 61 63 63 65 73 73 65 64 2e 20 20 41 75 74  e accessed.  Aut
e670: 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d  omatic indices m
e680: 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f  ust.  ** be a co
e690: 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63  vering index bec
e6a0: 61 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 77  ause the index w
e6b0: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74  ill not be updat
e6c0: 65 64 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f  ed if the.  ** o
e6d0: 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68  riginal table ch
e6e0: 61 6e 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e  anges and the in
e6f0: 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61  dex and table ca
e700: 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65  nnot both be use
e710: 64 0a 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67  d.  ** if they g
e720: 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20  o out of sync.. 
e730: 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20   */.  extraCols 
e740: 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  = pSrc->colUsed 
e750: 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20 4d 41  & (~idxCols | MA
e760: 53 4b 42 49 54 28 42 4d 53 2d 31 29 29 3b 0a 20  SKBIT(BMS-1));. 
e770: 20 6d 78 42 69 74 43 6f 6c 20 3d 20 28 70 54 61   mxBitCol = (pTa
e780: 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20 42 4d 53  ble->nCol >= BMS
e790: 2d 31 29 20 3f 20 42 4d 53 2d 31 20 3a 20 70 54  -1) ? BMS-1 : pT
e7a0: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20 74 65  able->nCol;.  te
e7b0: 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e  stcase( pTable->
e7c0: 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  nCol==BMS-1 );. 
e7d0: 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c   testcase( pTabl
e7e0: 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29  e->nCol==BMS-2 )
e7f0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d  ;.  for(i=0; i<m
e800: 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  xBitCol; i++){. 
e810: 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73     if( extraCols
e820: 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29 20   & MASKBIT(i) ) 
e830: 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20  nKeyCol++;.  }. 
e840: 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
e850: 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53  ed & MASKBIT(BMS
e860: 2d 31 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43  -1) ){.    nKeyC
e870: 6f 6c 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43  ol += pTable->nC
e880: 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20  ol - BMS + 1;.  
e890: 7d 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  }.  pLoop->wsFla
e8a0: 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
e8b0: 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f 49 44  MN_EQ | WHERE_ID
e8c0: 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 2f 2a 20 43 6f  X_ONLY;..  /* Co
e8d0: 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65  nstruct the Inde
e8e0: 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65 73 63  x object to desc
e8f0: 72 69 62 65 20 74 68 69 73 20 69 6e 64 65 78 20  ribe this index 
e900: 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69  */.  pIdx = sqli
e910: 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78  te3AllocateIndex
e920: 4f 62 6a 65 63 74 28 70 50 61 72 73 65 2d 3e 64  Object(pParse->d
e930: 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31 2c 20 30 2c  b, nKeyCol+1, 0,
e940: 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69   &zNotUsed);.  i
e950: 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74  f( pIdx==0 ) ret
e960: 75 72 6e 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e  urn;.  pLoop->u.
e970: 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
e980: 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61  Idx;.  pIdx->zNa
e990: 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78  me = "auto-index
e9a0: 22 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c  ";.  pIdx->pTabl
e9b0: 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20  e = pTable;.  n 
e9c0: 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d  = 0;.  idxCols =
e9d0: 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   0;.  for(pTerm=
e9e0: 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
e9f0: 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
ea00: 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
ea10: 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
ea20: 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
ea30: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
ea40: 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
ea50: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
ea60: 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
ea70: 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b  iCol>=BMS ? MASK
ea80: 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53  BIT(BMS-1) : MAS
ea90: 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20  KBIT(iCol);.    
eaa0: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
eab0: 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
eac0: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
ead0: 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66  =BMS );.      if
eae0: 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61  ( (idxCols & cMa
eaf0: 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
eb00: 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
eb10: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
eb20: 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d     idxCols |= cM
eb30: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64  ask;.        pId
eb40: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
eb50: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
eb60: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43  lumn;.        pC
eb70: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  oll = sqlite3Bin
eb80: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
eb90: 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  q(pParse, pX->pL
eba0: 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
ebb0: 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
ebc0: 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41  azColl[n] = ALWA
ebd0: 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c  YS(pColl) ? pCol
ebe0: 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41  l->zName : "BINA
ebf0: 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b  RY";.        n++
ec00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ec10: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75    }.  assert( (u
ec20: 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62  32)n==pLoop->u.b
ec30: 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f  tree.nEq );..  /
ec40: 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c  * Add additional
ec50: 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20   columns needed 
ec60: 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f  to make the auto
ec70: 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f  matic index into
ec80: 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67  .  ** a covering
ec90: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28   index */.  for(
eca0: 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b  i=0; i<mxBitCol;
ecb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65   i++){.    if( e
ecc0: 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42  xtraCols & MASKB
ecd0: 49 54 28 69 29 20 29 7b 0a 20 20 20 20 20 20 70  IT(i) ){.      p
ece0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
ecf0: 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78   = i;.      pIdx
ed00: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42  ->azColl[n] = "B
ed10: 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b  INARY";.      n+
ed20: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  +;.    }.  }.  i
ed30: 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  f( pSrc->colUsed
ed40: 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   & MASKBIT(BMS-1
ed50: 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42  ) ){.    for(i=B
ed60: 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  MS-1; i<pTable->
ed70: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
ed80: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
ed90: 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70  [n] = i;.      p
eda0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
edb0: 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20   "BINARY";.     
edc0: 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n++;.    }.  }.
edd0: 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 4b 65    assert( n==nKe
ede0: 79 43 6f 6c 20 29 3b 0a 20 20 70 49 64 78 2d 3e  yCol );.  pIdx->
edf0: 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 2d 31  aiColumn[n] = -1
ee00: 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  ;.  pIdx->azColl
ee10: 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  [n] = "BINARY";.
ee20: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
ee30: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
ee40: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4c   */.  assert( pL
ee50: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30  evel->iIdxCur>=0
ee60: 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 49   );.  pLevel->iI
ee70: 64 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  dxCur = pParse->
ee80: 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  nTab++;.  sqlite
ee90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
eea0: 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c  P_OpenAutoindex,
eeb0: 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
eec0: 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 3b 0a 20 20  , nKeyCol+1);.  
eed0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
eee0: 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
eef0: 70 49 64 78 29 3b 0a 20 20 56 64 62 65 43 6f 6d  pIdx);.  VdbeCom
ef00: 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72 20 25 73  ment((v, "for %s
ef10: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
ef20: 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74  ));..  /* Fill t
ef30: 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
ef40: 65 78 20 77 69 74 68 20 63 6f 6e 74 65 6e 74 20  ex with content 
ef50: 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73  */.  addrTop = s
ef60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
ef70: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
ef80: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b  Level->iTabCur);
ef90: 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  .  regRecord = s
efa0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
efb0: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
efc0: 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
efd0: 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 64 78  Key(pParse, pIdx
efe0: 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
eff0: 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 30 2c  r, regRecord, 0,
f000: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
f010: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
f020: 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c  dxInsert, pLevel
f030: 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65  ->iIdxCur, regRe
f040: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
f050: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
f060: 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
f070: 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  SULT);.  sqlite3
f080: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f090: 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69  _Next, pLevel->i
f0a0: 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b  TabCur, addrTop+
f0b0: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
f0c0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c  eChangeP5(v, SQL
f0d0: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41  ITE_STMTSTATUS_A
f0e0: 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c  UTOINDEX);.  sql
f0f0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
f100: 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20  (v, addrTop);.  
f110: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
f120: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
f130: 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f  gRecord);.  .  /
f140: 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
f150: 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
f160: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a  itialization */.
f170: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
f180: 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 69  pHere(v, addrIni
f190: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  t);.}.#endif /* 
f1a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
f1b0: 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
f1c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f1d0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
f1e0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
f1f0: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20  and populate an 
f200: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
f210: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74  fo structure. It
f220: 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
f230: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
f240: 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
f250: 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
f260: 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  he structure.** 
f270: 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70  by passing the p
f280: 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
f290: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
f2a0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65   to sqlite3_free
f2b0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ()..*/.static sq
f2c0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
f2d0: 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49   *allocateIndexI
f2e0: 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nfo(.  Parse *pP
f2f0: 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c 61  arse,.  WhereCla
f300: 75 73 65 20 2a 70 57 43 2c 0a 20 20 73 74 72 75  use *pWC,.  stru
f310: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
f320: 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69 73  *pSrc,.  ExprLis
f330: 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20  t *pOrderBy.){. 
f340: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
f350: 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63 74   nTerm;.  struct
f360: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
f370: 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
f380: 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
f390: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
f3a0: 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79  rby *pIdxOrderBy
f3b0: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
f3c0: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
f3d0: 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67  int_usage *pUsag
f3e0: 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  e;.  WhereTerm *
f3f0: 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72  pTerm;.  int nOr
f400: 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65 33  derBy;.  sqlite3
f410: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
f420: 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75  xInfo;..  /* Cou
f430: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
f440: 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20   possible WHERE 
f450: 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
f460: 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20 2a  ts referring.  *
f470: 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74 75 61  * to this virtua
f480: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72  l table */.  for
f490: 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72  (i=nTerm=0, pTer
f4a0: 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
f4b0: 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
f4c0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  rm++){.    if( p
f4d0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
f4e0: 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f   != pSrc->iCurso
f4f0: 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
f500: 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
f510: 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f  rOfTwo(pTerm->eO
f520: 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51  perator & ~WO_EQ
f530: 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74  UIV) );.    test
f540: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
f550: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
f560: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
f570: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f580: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
f590: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
f5a0: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
f5b0: 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75  SNULL) ) continu
f5c0: 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
f5d0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
f5e0: 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  _VNULL ) continu
f5f0: 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a  e;.    nTerm++;.
f600: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
f610: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
f620: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63   contains only c
f630: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75  olumns in the cu
f640: 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74  rrent .  ** virt
f650: 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61  ual table then a
f660: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
f670: 72 20 74 68 65 20 61 4f 72 64 65 72 42 79 20 70  r the aOrderBy p
f680: 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  art of.  ** the 
f690: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
f6a0: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  fo structure..  
f6b0: 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  */.  nOrderBy = 
f6c0: 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  0;.  if( pOrderB
f6d0: 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  y ){.    int n =
f6e0: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
f6f0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
f700: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
f710: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
f720: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
f730: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
f740: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
f750: 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  MN || pExpr->iTa
f760: 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73  ble!=pSrc->iCurs
f770: 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  or ) break;.    
f780: 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b  }.    if( i==n){
f790: 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20  .      nOrderBy 
f7a0: 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = n;.    }.  }..
f7b0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
f7c0: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
f7d0: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  info structure. 
f7e0: 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d   */.  pIdxInfo =
f7f0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
f800: 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
f810: 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66   sizeof(*pIdxInf
f820: 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o).             
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
f840: 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e  (sizeof(*pIdxCon
f850: 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73  s) + sizeof(*pUs
f860: 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20  age))*nTerm.    
f870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f880: 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
f890: 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f  *pIdxOrderBy)*nO
f8a0: 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20  rderBy );.  if( 
f8b0: 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pIdxInfo==0 ){. 
f8c0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
f8d0: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20  sg(pParse, "out 
f8e0: 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20  of memory");.   
f8f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
f900: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
f910: 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  the structure.  
f920: 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  The sqlite3_inde
f930: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
f940: 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d   contains.  ** m
f950: 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74 20  any fields that 
f960: 61 72 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f  are declared "co
f970: 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20  nst" to prevent 
f980: 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a  xBestIndex from.
f990: 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68    ** changing th
f9a0: 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  em.  We have to 
f9b0: 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61  do some funky ca
f9c0: 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74  sting in order t
f9d0: 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  o.  ** initializ
f9e0: 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a  e those fields..
f9f0: 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20    */.  pIdxCons 
fa00: 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
fa10: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
fa20: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d  nt*)&pIdxInfo[1]
fa30: 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79 20  ;.  pIdxOrderBy 
fa40: 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
fa50: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a  3_index_orderby*
fa60: 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d  )&pIdxCons[nTerm
fa70: 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73  ];.  pUsage = (s
fa80: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
fa90: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
faa0: 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72  sage*)&pIdxOrder
fab0: 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20  By[nOrderBy];.  
fac0: 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  *(int*)&pIdxInfo
fad0: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  ->nConstraint = 
fae0: 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29  nTerm;.  *(int*)
faf0: 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65  &pIdxInfo->nOrde
fb00: 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a  rBy = nOrderBy;.
fb10: 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
fb20: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
fb30: 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
fb40: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70  >aConstraint = p
fb50: 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72  IdxCons;.  *(str
fb60: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
fb70: 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64  x_orderby**)&pId
fb80: 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20  xInfo->aOrderBy 
fb90: 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20  = pIdxOrderBy;. 
fba0: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
fbb0: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
fbc0: 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78  nt_usage**)&pIdx
fbd0: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
fbe0: 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20  tUsage =.       
fbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 70 55 73 61              pUsa
fc30: 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  ge;..  for(i=j=0
fc40: 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
fc50: 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
fc60: 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
fc70: 20 75 38 20 6f 70 3b 0a 20 20 20 20 69 66 28 20   u8 op;.    if( 
fc80: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
fc90: 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  r != pSrc->iCurs
fca0: 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  or ) continue;. 
fcb0: 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77     assert( IsPow
fcc0: 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65  erOfTwo(pTerm->e
fcd0: 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45  Operator & ~WO_E
fce0: 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73  QUIV) );.    tes
fcf0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
fd00: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
fd10: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
fd20: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
fd30: 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
fd40: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
fd50: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
fd60: 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e  ISNULL) ) contin
fd70: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
fd80: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
fd90: 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
fda0: 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  ue;.    pIdxCons
fdb0: 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54  [j].iColumn = pT
fdc0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
fdd0: 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  n;.    pIdxCons[
fde0: 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d  j].iTermOffset =
fdf0: 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75 38   i;.    op = (u8
fe00: 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  )pTerm->eOperato
fe10: 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20  r & WO_ALL;.    
fe20: 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20  if( op==WO_IN ) 
fe30: 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20  op = WO_EQ;.    
fe40: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
fe50: 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20   op;.    /* The 
fe60: 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e  direct assignmen
fe70: 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
fe80: 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62  s line is possib
fe90: 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a  le only because.
fea0: 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61      ** the WO_ a
feb0: 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  nd SQLITE_INDEX_
fec0: 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65  CONSTRAINT_ code
fed0: 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  s are identical.
fee0: 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c    The.    ** fol
fef0: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76  lowing asserts v
ff00: 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e  erify this fact.
ff10: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
ff20: 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_EQ==SQLITE_IN
ff30: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
ff40: 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Q );.    assert(
ff50: 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_LT==SQLITE_I
ff60: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
ff70: 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LT );.    assert
ff80: 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_LE==SQLITE_
ff90: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
ffa0: 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LE );.    asser
ffb0: 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45  t( WO_GT==SQLITE
ffc0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
ffd0: 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65  T_GT );.    asse
ffe0: 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54  rt( WO_GE==SQLIT
fff0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
10000 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73  NT_GE );.    ass
10010 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53  ert( WO_MATCH==S
10020 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
10030 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a  TRAINT_MATCH );.
10040 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
10050 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
10060 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c  WO_IN|WO_EQ|WO_L
10070 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
10080 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b  _GE|WO_MATCH) );
10090 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
100a0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
100b0 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  rBy; i++){.    E
100c0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
100d0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
100e0 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72  r;.    pIdxOrder
100f0 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20  By[i].iColumn = 
10100 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
10110 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
10120 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72  i].desc = pOrder
10130 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
10140 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  er;.  }..  retur
10150 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f  n pIdxInfo;.}../
10160 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f  *.** The table o
10170 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20  bject reference 
10180 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
10190 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
101a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
101b0 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74  * must represent
101c0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
101d0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
101e0 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73  invokes the xBes
101f0 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68  tIndex().** meth
10200 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  od of the virtua
10210 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  l table with the
10220 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
10230 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  nfo object that.
10240 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74  ** comes in as t
10250 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20  he 3rd argument 
10260 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
10270 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
10280 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72  ror occurs, pPar
10290 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  se is populated 
102a0 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65  with an error me
102b0 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e  ssage and a.** n
102c0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73  on-zero value is
102d0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
102e0 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72  wise, 0 is retur
102f0 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70  ned and the outp
10300 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  ut.** part of th
10310 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
10320 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
10330 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64  s left populated
10340 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20  ..**.** Whether 
10350 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20  or not an error 
10360 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20  is returned, it 
10370 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
10380 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20  ility of the.** 
10390 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
103a0 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78  ally free p->idx
103b0 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f  Str if p->needTo
103c0 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69 63  FreeIdxStr indic
103d0 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69  ates.** that thi
103e0 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  s is required..*
103f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61  /.static int vta
10400 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73 65  bBestIndex(Parse
10410 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
10420 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69  *pTab, sqlite3_i
10430 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
10440 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
10450 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65  Vtab = sqlite3Ge
10460 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  tVTable(pParse->
10470 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62  db, pTab)->pVtab
10480 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
10490 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44   rc;..  TRACE_ID
104a0 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72  X_INPUTS(p);.  r
104b0 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  c = pVtab->pModu
104c0 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70  le->xBestIndex(p
104d0 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43  Vtab, p);.  TRAC
104e0 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29  E_IDX_OUTPUTS(p)
104f0 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  ;..  if( rc!=SQL
10500 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
10510 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
10520 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  EM ){.      pPar
10530 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
10540 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  iled = 1;.    }e
10550 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e  lse if( !pVtab->
10560 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
10570 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10580 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73  (pParse, "%s", s
10590 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
105a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
105b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
105c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
105d0 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  , pVtab->zErrMsg
105e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
105f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
10600 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  b->zErrMsg);.  p
10610 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
10620 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0;..  for(i=0; i
10630 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
10640 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   i++){.    if( !
10650 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
10660 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61  ].usable && p->a
10670 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
10680 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29  i].argvIndex>0 )
10690 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
106a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
106b0 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c  .          "tabl
106c0 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78  e %s: xBestIndex
106d0 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76   returned an inv
106e0 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62  alid plan", pTab
106f0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
10700 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50    }..  return pP
10710 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65  arse->nErr;.}.#e
10720 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
10730 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
10740 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 0a  TUALTABLE) */...
10750 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10760 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
10770 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT4./*.** Estima
10780 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  te the location 
10790 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  of a particular 
107a0 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65  key among all ke
107b0 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65  ys in an.** inde
107c0 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65  x.  Store the re
107d0 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61  sults in aStat a
107e0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
107f0 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20      aStat[0]    
10800 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66    Est. number of
10810 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20   rows less than 
10820 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74  pVal.**    aStat
10830 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75  [1]      Est. nu
10840 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75  mber of rows equ
10850 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a  al to pVal.**.**
10860 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
10870 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f  K on success..*/
10880 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
10890 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61  reKeyStats(.  Pa
108a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
108b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
108c0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
108d0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
108e0 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
108f0 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f    /* Index to co
10900 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66  nsider domain of
10910 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
10920 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20  cord *pRec,     
10930 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76    /* Vector of v
10940 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65  alues to conside
10950 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64  r */.  int round
10960 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Up,             
10970 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69     /* Round up i
10980 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64  f true.  Round d
10990 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a  own if false */.
109a0 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74    tRowcnt *aStat
109b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
109c0 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74   OUT: stats writ
109d0 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
109e0 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53   IndexSample *aS
109f0 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53  ample = pIdx->aS
10a00 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f  ample;.  int iCo
10a10 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
10a20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
10a30 20 72 65 71 75 69 72 65 64 20 73 74 61 74 73 20   required stats 
10a40 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a  in anEq[] etc. *
10a50 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30  /.  int iMin = 0
10a60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10a70 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70  /* Smallest samp
10a80 6c 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65  le not yet teste
10a90 64 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  d */.  int i = p
10aa0 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 20 20  Idx->nSample;   
10ab0 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73     /* Smallest s
10ac0 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61  ample larger tha
10ad0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52  n or equal to pR
10ae0 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73  ec */.  int iTes
10af0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
10b00 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70      /* Next samp
10b10 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20  le to test */.  
10b20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20  int res;        
10b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10b40 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
10b50 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  son operation */
10b60 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10b70 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f  _DEBUG.  UNUSED_
10b80 50 41 52 41 4d 45 54 45 52 28 20 70 50 61 72 73  PARAMETER( pPars
10b90 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  e );.#endif.  as
10ba0 73 65 72 74 28 20 70 52 65 63 21 3d 30 20 7c 7c  sert( pRec!=0 ||
10bb0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
10bc0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
10bd0 66 28 20 70 52 65 63 3d 3d 30 20 29 20 72 65 74  f( pRec==0 ) ret
10be0 75 72 6e 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 52  urn;.  iCol = pR
10bf0 65 63 2d 3e 6e 46 69 65 6c 64 20 2d 20 31 3b 0a  ec->nField - 1;.
10c00 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
10c10 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61  nSample>0 );.  a
10c20 73 73 65 72 74 28 20 70 52 65 63 2d 3e 6e 46 69  ssert( pRec->nFi
10c30 65 6c 64 3e 30 20 26 26 20 69 43 6f 6c 3c 70 49  eld>0 && iCol<pI
10c40 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29  dx->nSampleCol )
10c50 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 54 65 73  ;.  do{.    iTes
10c60 74 20 3d 20 28 69 4d 69 6e 2b 69 29 2f 32 3b 0a  t = (iMin+i)/2;.
10c70 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
10c80 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
10c90 72 65 28 61 53 61 6d 70 6c 65 5b 69 54 65 73 74  re(aSample[iTest
10ca0 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 54 65  ].n, aSample[iTe
10cb0 73 74 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20  st].p, pRec);.  
10cc0 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
10cd0 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73       iMin = iTes
10ce0 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  t+1;.    }else{.
10cf0 20 20 20 20 20 20 69 20 3d 20 69 54 65 73 74 3b        i = iTest;
10d00 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
10d10 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 20 29   res && iMin<i )
10d20 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
10d30 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
10d40 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
10d50 20 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63   statements chec
10d60 6b 20 74 68 61 74 20 74 68 65 20 62 69 6e 61 72  k that the binar
10d70 79 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20  y search code.  
10d80 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74  ** above found t
10d90 68 65 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e  he right answer.
10da0 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
10db0 65 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74  es no purpose ot
10dc0 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f  her.  ** than to
10dd0 20 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65   invoke the asse
10de0 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72  rts.  */.  if( r
10df0 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  es==0 ){.    /* 
10e00 49 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74  If (res==0) is t
10e10 72 75 65 2c 20 74 68 65 6e 20 73 61 6d 70 6c 65  rue, then sample
10e20 20 24 69 20 6d 75 73 74 20 62 65 20 65 71 75 61   $i must be equa
10e30 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 20  l to pRec */.   
10e40 20 61 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d   assert( i<pIdx-
10e50 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20  >nSample );.    
10e60 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
10e70 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
10e80 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  are(aSample[i].n
10e90 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20  , aSample[i].p, 
10ea0 70 52 65 63 29 0a 20 20 20 20 20 20 20 20 20 7c  pRec).         |
10eb0 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
10ec0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
10ed0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74  }else{.    /* Ot
10ee0 68 65 72 77 69 73 65 2c 20 70 52 65 63 20 6d 75  herwise, pRec mu
10ef0 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  st be smaller th
10f00 61 6e 20 73 61 6d 70 6c 65 20 24 69 20 61 6e 64  an sample $i and
10f10 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20 20 20   larger than.   
10f20 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24 69 2d 31   ** sample ($i-1
10f30 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ).  */.    asser
10f40 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  t( i==pIdx->nSam
10f50 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ple .         ||
10f60 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
10f70 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
10f80 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  e[i].n, aSample[
10f90 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20 20  i].p, pRec)>0.  
10fa0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
10fb0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
10fc0 65 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ed );.    assert
10fd0 28 20 69 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ( i==0.         
10fe0 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  || sqlite3VdbeRe
10ff0 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
11000 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d  ple[i-1].n, aSam
11010 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63  ple[i-1].p, pRec
11020 29 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  )<0.         || 
11030 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
11040 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7d 0a  ocFailed );.  }.
11050 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20  #endif /* ifdef 
11060 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
11070 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
11080 69 6e 74 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 20  int, aSample[i] 
11090 69 73 20 74 68 65 20 66 69 72 73 74 20 73 61 6d  is the first sam
110a0 70 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ple that is grea
110b0 74 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 6f 72  ter than.  ** or
110c0 20 65 71 75 61 6c 20 74 6f 20 70 56 61 6c 2e 20   equal to pVal. 
110d0 20 4f 72 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e   Or if i==pIdx->
110e0 6e 53 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 6c  nSample, then al
110f0 6c 20 73 61 6d 70 6c 65 73 20 61 72 65 20 6c 65  l samples are le
11100 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 70 56 61  ss.  ** than pVa
11110 6c 2e 20 20 49 66 20 61 53 61 6d 70 6c 65 5b 69  l.  If aSample[i
11120 5d 3d 3d 70 56 61 6c 2c 20 74 68 65 6e 20 72 65  ]==pVal, then re
11130 73 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  s==0..  */.  if(
11140 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 61   res==0 ){.    a
11150 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c  Stat[0] = aSampl
11160 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b  e[i].anLt[iCol];
11170 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
11180 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b  aSample[i].anEq[
11190 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iCol];.  }else{.
111a0 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77      tRowcnt iLow
111b0 65 72 2c 20 69 55 70 70 65 72 2c 20 69 47 61 70  er, iUpper, iGap
111c0 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29  ;.    if( i==0 )
111d0 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d  {.      iLower =
111e0 20 30 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72   0;.      iUpper
111f0 20 3d 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 61 6e   = aSample[0].an
11200 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 65  Lt[iCol];.    }e
11210 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70 70 65  lse{.      iUppe
11220 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61  r = i>=pIdx->nSa
11230 6d 70 6c 65 20 3f 20 70 49 64 78 2d 3e 61 69 52  mple ? pIdx->aiR
11240 6f 77 45 73 74 5b 30 5d 20 3a 20 61 53 61 6d 70  owEst[0] : aSamp
11250 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d  le[i].anLt[iCol]
11260 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d  ;.      iLower =
11270 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 61 6e   aSample[i-1].an
11280 45 71 5b 69 43 6f 6c 5d 20 2b 20 61 53 61 6d 70  Eq[iCol] + aSamp
11290 6c 65 5b 69 2d 31 5d 2e 61 6e 4c 74 5b 69 43 6f  le[i-1].anLt[iCo
112a0 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53  l];.    }.    aS
112b0 74 61 74 5b 31 5d 20 3d 20 28 70 49 64 78 2d 3e  tat[1] = (pIdx->
112c0 6e 4b 65 79 43 6f 6c 3e 69 43 6f 6c 20 3f 20 70  nKeyCol>iCol ? p
112d0 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f 6c  Idx->aAvgEq[iCol
112e0 5d 20 3a 20 31 29 3b 0a 20 20 20 20 69 66 28 20  ] : 1);.    if( 
112f0 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29  iLower>=iUpper )
11300 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 30  {.      iGap = 0
11310 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11320 20 20 20 69 47 61 70 20 3d 20 69 55 70 70 65 72     iGap = iUpper
11330 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d   - iLower;.    }
11340 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70  .    if( roundUp
11350 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d   ){.      iGap =
11360 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20   (iGap*2)/3;.   
11370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
11380 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20  ap = iGap/3;.   
11390 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20   }.    aStat[0] 
113a0 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b  = iLower + iGap;
113b0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
113c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
113d0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
113e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
113f0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
11400 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
11410 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
11420 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65  t will be visite
11430 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67  d.** by scanning
11440 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20   an index for a 
11450 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e  range of values.
11460 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68   The range may h
11470 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20  ave an upper.** 
11480 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62  bound, a lower b
11490 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54  ound, or both. T
114a0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
114b0 74 65 72 6d 73 20 74 68 61 74 20 73 65 74 20 74  terms that set t
114c0 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20  he upper.** and 
114d0 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65  lower bounds are
114e0 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20   represented by 
114f0 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
11500 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  r respectively. 
11510 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
11520 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e  assuming that in
11530 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61  dex p is on t1(a
11540 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  ):.**.**   ... F
11550 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e  ROM t1 WHERE a >
11560 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e   ? AND a < ? ...
11570 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11580 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20         |_____|  
11590 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20   |_____|.**     
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115b0 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a    |         |.**
115c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115d0 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70       pLower    p
115e0 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65  Upper.**.** If e
115f0 69 74 68 65 72 20 6f 66 20 74 68 65 20 75 70 70  ither of the upp
11600 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e  er or lower boun
11610 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  d is not present
11620 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70  , then NULL is p
11630 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63  assed in.** plac
11640 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70  e of the corresp
11650 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d  onding WhereTerm
11660 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
11670 65 20 69 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e  e in (pBuilder->
11680 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
11690 71 29 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  q) is the index 
116a0 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  of the index.** 
116b0 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74  column subject t
116c0 6f 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73  o the range cons
116d0 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69  traint. Or, equi
116e0 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75  valently, the nu
116f0 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 71 75 61 6c  mber of.** equal
11700 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
11710 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65  optimized by the
11720 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20   proposed index 
11730 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c  scan. For exampl
11740 65 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20 69  e,.** assuming i
11750 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28  ndex p is on t1(
11760 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53  a, b), and the S
11770 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  QL query is:.**.
11780 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
11790 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44   WHERE a = ? AND
117a0 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f   b > ? AND b < ?
117b0 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   ....**.** then 
117c0 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20 31 20  nEq is set to 1 
117d0 28 61 73 20 74 68 65 20 72 61 6e 67 65 20 72 65  (as the range re
117e0 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c  stricted column,
117f0 20 62 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e   b, is the secon
11800 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  d .** left-most 
11810 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
11820 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65  dex). Or, if the
11830 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
11840 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
11850 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61  HERE a > ? AND a
11860 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74   < ? ....**.** t
11870 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74  hen nEq is set t
11880 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  o 0..**.** When 
11890 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
118a0 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74 20   called, *pnOut 
118b0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 71  is set to the sq
118c0 6c 69 74 65 33 4c 6f 67 45 73 74 28 29 20 6f 66  lite3LogEst() of
118d0 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
118e0 66 20 72 6f 77 73 20 74 68 61 74 20 74 68 65 20  f rows that the 
118f0 69 6e 64 65 78 20 73 63 61 6e 20 69 73 20 65 78  index scan is ex
11900 70 65 63 74 65 64 20 74 6f 20 76 69 73 69 74 20  pected to visit 
11910 77 69 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73  without .** cons
11920 69 64 65 72 69 6e 67 20 74 68 65 20 72 61 6e 67  idering the rang
11930 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49  e constraints. I
11940 66 20 6e 45 71 20 69 73 20 30 2c 20 74 68 69 73  f nEq is 0, this
11950 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
11960 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68  f .** rows in th
11970 65 20 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e  e index. Assumin
11980 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  g no error occur
11990 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a  s, *pnOut is adj
119a0 75 73 74 65 64 20 28 72 65 64 75 63 65 64 29 0a  usted (reduced).
119b0 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  ** to account fo
119c0 72 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 74  r the range cont
119d0 72 61 69 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e  raints pLower an
119e0 64 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a  d pUpper..** .**
119f0 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20   In the absence 
11a00 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20  of sqlite_stat4 
11a10 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72  ANALYZE data, or
11a20 20 69 66 20 73 75 63 68 20 64 61 74 61 20 63 61   if such data ca
11a30 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c  nnot be.** used,
11a40 20 65 61 63 68 20 72 61 6e 67 65 20 69 6e 65 71   each range ineq
11a50 75 61 6c 69 74 79 20 72 65 64 75 63 65 73 20 74  uality reduces t
11a60 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
11a70 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 34  by a factor of 4
11a80 2e 20 0a 2a 2a 20 48 65 6e 63 65 20 61 20 70 61  . .** Hence a pa
11a90 69 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74  ir of constraint
11aa0 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20  s (x>? AND x<?) 
11ab0 72 65 64 75 63 65 73 20 74 68 65 20 65 78 70 65  reduces the expe
11ac0 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a  cted number of.*
11ad0 2a 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62  * rows visited b
11ae0 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 31 36  y a factor of 16
11af0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11b00 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
11b10 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
11b20 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
11b30 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
11b40 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
11b50 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
11b60 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
11b70 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f    WhereTerm *pLo
11b80 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20  wer,   /* Lower 
11b90 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
11ba0 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20  ge. ex: "x>123" 
11bb0 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
11bc0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55  .  WhereTerm *pU
11bd0 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72  pper,   /* Upper
11be0 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
11bf0 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22  nge. ex: "x<455"
11c00 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
11c10 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
11c20 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69  Loop     /* Modi
11c30 66 79 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64  fy the .nOut and
11c40 20 6d 61 79 62 65 20 2e 72 52 75 6e 20 66 69 65   maybe .rRun fie
11c50 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lds */.){.  int 
11c60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11c70 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f    int nOut = pLo
11c80 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45  op->nOut;.  LogE
11c90 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66  st nNew;..#ifdef
11ca0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
11cb0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
11cc0 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70  Index *p = pLoop
11cd0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
11ce0 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c  ;.  int nEq = pL
11cf0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
11d00 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d  ;..  if( p->nSam
11d10 70 6c 65 3e 30 0a 20 20 20 26 26 20 6e 45 71 3d  ple>0.   && nEq=
11d20 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56  =pBuilder->nRecV
11d30 61 6c 69 64 0a 20 20 20 26 26 20 6e 45 71 3c 70  alid.   && nEq<p
11d40 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20  ->nSampleCol.   
11d50 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
11d60 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64  nabled(pParse->d
11d70 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74 33 29  b, SQLITE_Stat3)
11d80 20 0a 20 20 29 7b 0a 20 20 20 20 55 6e 70 61 63   .  ){.    Unpac
11d90 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20  kedRecord *pRec 
11da0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63  = pBuilder->pRec
11db0 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b  ;.    tRowcnt a[
11dc0 32 5d 3b 0a 20 20 20 20 75 38 20 61 66 66 3b 0a  2];.    u8 aff;.
11dd0 0a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  .    /* Variable
11de0 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62 65 20   iLower will be 
11df0 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d  set to the estim
11e00 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
11e10 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a 20 20  r of rows in .  
11e20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74    ** the index t
11e30 68 61 74 20 61 72 65 20 6c 65 73 73 20 74 68 61  hat are less tha
11e40 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e  n the lower boun
11e50 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71  d of the range q
11e60 75 65 72 79 2e 20 54 68 65 0a 20 20 20 20 2a 2a  uery. The.    **
11e70 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62 65 69   lower bound bei
11e80 6e 67 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61  ng the concatena
11e90 74 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64 20 24  tion of $P and $
11ea0 4c 2c 20 77 68 65 72 65 20 24 50 20 69 73 20 74  L, where $P is t
11eb0 68 65 0a 20 20 20 20 2a 2a 20 6b 65 79 2d 70 72  he.    ** key-pr
11ec0 65 66 69 78 20 66 6f 72 6d 65 64 20 62 79 20 74  efix formed by t
11ed0 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20 6d 61  he nEq values ma
11ee0 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 74 68  tched against th
11ef0 65 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73 74 0a  e nEq left-most.
11f00 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f      ** columns o
11f10 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64  f the index, and
11f20 20 24 4c 20 69 73 20 74 68 65 20 76 61 6c 75 65   $L is the value
11f30 20 69 6e 20 70 4c 6f 77 65 72 2e 0a 20 20 20 20   in pLower..    
11f40 2a 2a 0a 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66  **.    ** Or, if
11f50 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20   pLower is NULL 
11f60 6f 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20  or $L cannot be 
11f70 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69  extracted from i
11f80 74 20 28 62 65 63 61 75 73 65 20 69 74 0a 20 20  t (because it.  
11f90 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 69    ** is not a si
11fa0 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f 72  mple variable or
11fb0 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29 2c   literal value),
11fc0 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
11fd0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   of the.    ** r
11fe0 61 6e 67 65 20 69 73 20 24 50 2e 20 44 75 65 20  ange is $P. Due 
11ff0 74 6f 20 61 20 71 75 69 72 6b 20 69 6e 20 74 68  to a quirk in th
12000 65 20 77 61 79 20 77 68 65 72 65 4b 65 79 53 74  e way whereKeySt
12010 61 74 73 28 29 20 77 6f 72 6b 73 2c 20 65 76 65  ats() works, eve
12020 6e 0a 20 20 20 20 2a 2a 20 69 66 20 24 4c 20 69  n.    ** if $L i
12030 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 77 68 65  s available, whe
12040 72 65 4b 65 79 53 74 61 74 73 28 29 20 69 73 20  reKeyStats() is 
12050 63 61 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68 20  called for both 
12060 28 24 50 29 20 61 6e 64 20 0a 20 20 20 20 2a 2a  ($P) and .    **
12070 20 28 24 50 3a 24 4c 29 20 61 6e 64 20 74 68 65   ($P:$L) and the
12080 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 74   larger of the t
12090 77 6f 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  wo returned valu
120a0 65 73 20 75 73 65 64 2e 0a 20 20 20 20 2a 2a 0a  es used..    **.
120b0 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79      ** Similarly
120c0 2c 20 69 55 70 70 65 72 20 69 73 20 74 6f 20 62  , iUpper is to b
120d0 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74  e set to the est
120e0 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
120f0 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20  ber of rows.    
12100 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ** less than the
12110 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20   upper bound of 
12120 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
12130 20 57 68 65 72 65 20 74 68 65 20 75 70 70 65 72   Where the upper
12140 20 62 6f 75 6e 64 0a 20 20 20 20 2a 2a 20 69 73   bound.    ** is
12150 20 65 69 74 68 65 72 20 28 24 50 29 20 6f 72 20   either ($P) or 
12160 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20  ($P:$U). Again, 
12170 65 76 65 6e 20 69 66 20 24 55 20 69 73 20 61 76  even if $U is av
12180 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76 61  ailable, both va
12190 6c 75 65 73 0a 20 20 20 20 2a 2a 20 6f 66 20 69  lues.    ** of i
121a0 55 70 70 65 72 20 61 72 65 20 72 65 71 75 65 73  Upper are reques
121b0 74 65 64 20 6f 66 20 77 68 65 72 65 4b 65 79 53  ted of whereKeyS
121c0 74 61 74 73 28 29 20 61 6e 64 20 74 68 65 20 73  tats() and the s
121d0 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20 20 20  maller used..   
121e0 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74 20   */.    tRowcnt 
121f0 69 4c 6f 77 65 72 3b 0a 20 20 20 20 74 52 6f 77  iLower;.    tRow
12200 63 6e 74 20 69 55 70 70 65 72 3b 0a 0a 20 20 20  cnt iUpper;..   
12210 20 69 66 28 20 6e 45 71 3d 3d 70 2d 3e 6e 4b 65   if( nEq==p->nKe
12220 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 61 66  yCol ){.      af
12230 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  f = SQLITE_AFF_I
12240 4e 54 45 47 45 52 3b 0a 20 20 20 20 7d 65 6c 73  NTEGER;.    }els
12250 65 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 70  e{.      aff = p
12260 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70  ->pTable->aCol[p
12270 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d  ->aiColumn[nEq]]
12280 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 7d  .affinity;.    }
12290 0a 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  .    /* Determin
122a0 65 20 69 4c 6f 77 65 72 20 61 6e 64 20 69 55 70  e iLower and iUp
122b0 70 65 72 20 75 73 69 6e 67 20 28 24 50 29 20 6f  per using ($P) o
122c0 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  nly. */.    if( 
122d0 6e 45 71 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nEq==0 ){.      
122e0 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20  iLower = 0;.    
122f0 20 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 61 69    iUpper = p->ai
12300 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 7d  RowEst[0];.    }
12310 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  else{.      /* N
12320 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c 20 63  ote: this call c
12330 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69 7a 65  ould be optimize
12340 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65 20 74  d away - since t
12350 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73 20 6d  he same values m
12360 75 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 68 61  ust .      ** ha
12370 76 65 20 62 65 65 6e 20 72 65 71 75 65 73 74 65  ve been requeste
12380 64 20 77 68 65 6e 20 74 65 73 74 69 6e 67 20 6b  d when testing k
12390 65 79 20 24 50 20 69 6e 20 77 68 65 72 65 45 71  ey $P in whereEq
123a0 75 61 6c 53 63 61 6e 45 73 74 28 29 2e 20 20 2a  ualScanEst().  *
123b0 2f 0a 20 20 20 20 20 20 77 68 65 72 65 4b 65 79  /.      whereKey
123c0 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
123d0 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20   pRec, 0, a);.  
123e0 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30      iLower = a[0
123f0 5d 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20  ];.      iUpper 
12400 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20  = a[0] + a[1];. 
12410 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
12420 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76  possible, improv
12430 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72 20  e on the iLower 
12440 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28  estimate using (
12450 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 69  $P:$L). */.    i
12460 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20  f( pLower ){.   
12470 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20     int bOk;     
12480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12490 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65 20  * True if value 
124a0 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
124b0 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20  m pExpr */.     
124c0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
124d0 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Lower->pExpr->pR
124e0 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65  ight;.      asse
124f0 72 74 28 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70  rt( (pLower->eOp
12500 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c  erator & (WO_GT|
12510 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20  WO_GE))!=0 );.  
12520 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12530 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c  Stat4ProbeSetVal
12540 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70  ue(pParse, p, &p
12550 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c  Rec, pExpr, aff,
12560 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20   nEq, &bOk);.   
12570 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12580 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20  E_OK && bOk ){. 
12590 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69         tRowcnt i
125a0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 77 68 65  New;.        whe
125b0 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
125c0 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61  e, p, pRec, 0, a
125d0 29 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 77 20  );.        iNew 
125e0 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65  = a[0] + ((pLowe
125f0 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  r->eOperator & W
12600 4f 5f 47 54 29 20 3f 20 61 5b 31 5d 20 3a 20 30  O_GT) ? a[1] : 0
12610 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
12620 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c 6f  New>iLower ) iLo
12630 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20  wer = iNew;.    
12640 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20      nOut--;.    
12650 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
12660 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  * If possible, i
12670 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 55  mprove on the iU
12680 70 70 65 72 20 65 73 74 69 6d 61 74 65 20 75 73  pper estimate us
12690 69 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a 2f 0a  ing ($P:$U). */.
126a0 20 20 20 20 69 66 28 20 70 55 70 70 65 72 20 29      if( pUpper )
126b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b  {.      int bOk;
126c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126d0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 76      /* True if v
126e0 61 6c 75 65 20 69 73 20 65 78 74 72 61 63 74 65  alue is extracte
126f0 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a  d from pExpr */.
12700 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
12710 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70  r = pUpper->pExp
12720 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
12730 20 61 73 73 65 72 74 28 20 28 70 55 70 70 65 72   assert( (pUpper
12740 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
12750 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20  O_LT|WO_LE))!=0 
12760 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
12770 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
12780 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  etValue(pParse, 
12790 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c  p, &pRec, pExpr,
127a0 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29   aff, nEq, &bOk)
127b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
127c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b  SQLITE_OK && bOk
127d0 20 29 7b 0a 20 20 20 20 20 20 20 20 74 52 6f 77   ){.        tRow
127e0 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  cnt iNew;.      
127f0 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28    whereKeyStats(
12800 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
12810 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20   1, a);.        
12820 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28  iNew = a[0] + ((
12830 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pUpper->eOperato
12840 72 20 26 20 57 4f 5f 4c 45 29 20 3f 20 61 5b 31  r & WO_LE) ? a[1
12850 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ] : 0);.        
12860 69 66 28 20 69 4e 65 77 3c 69 55 70 70 65 72 20  if( iNew<iUpper 
12870 29 20 69 55 70 70 65 72 20 3d 20 69 4e 65 77 3b  ) iUpper = iNew;
12880 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b  .        nOut--;
12890 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
128a0 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52      pBuilder->pR
128b0 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20 20 69  ec = pRec;.    i
128c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
128d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 55   ){.      if( iU
128e0 70 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b 0a 20  pper>iLower ){. 
128f0 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 73 71         nNew = sq
12900 6c 69 74 65 33 4c 6f 67 45 73 74 28 69 55 70 70  lite3LogEst(iUpp
12910 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20  er - iLower);.  
12920 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12930 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20 20 20     nNew = 10;   
12940 20 20 20 20 20 61 73 73 65 72 74 28 20 31 30 3d       assert( 10=
12950 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
12960 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
12970 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74     if( nNew<nOut
12980 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74   ){.        nOut
12990 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d   = nNew;.      }
129a0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  .      pLoop->nO
129b0 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75  ut = (LogEst)nOu
129c0 74 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  t;.      WHERETR
129d0 41 43 45 28 30 78 31 30 2c 20 28 22 72 61 6e 67  ACE(0x10, ("rang
129e0 65 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20  e scan regions: 
129f0 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e  %u..%u  est=%d\n
12a00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
12a10 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32              (u32
12a20 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55  )iLower, (u32)iU
12a30 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20  pper, nOut));.  
12a40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12a50 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
12a60 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
12a70 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29  ARAMETER(pParse)
12a80 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
12a90 45 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b 0a  ETER(pBuilder);.
12aa0 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
12ab0 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65   pLower || pUppe
12ac0 72 20 29 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  r );.  /* TUNING
12ad0 3a 20 20 45 61 63 68 20 69 6e 65 71 75 61 6c 69  :  Each inequali
12ae0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65  ty constraint re
12af0 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68  duces the search
12b00 20 73 70 61 63 65 20 34 2d 66 6f 6c 64 2e 0a 20   space 4-fold.. 
12b10 20 2a 2a 20 41 20 42 45 54 57 45 45 4e 20 6f 70   ** A BETWEEN op
12b20 65 72 61 74 6f 72 2c 20 74 68 65 72 65 66 6f 72  erator, therefor
12b30 65 2c 20 72 65 64 75 63 65 73 20 74 68 65 20 73  e, reduces the s
12b40 65 61 72 63 68 20 73 70 61 63 65 20 31 36 2d 66  earch space 16-f
12b50 6f 6c 64 20 2a 2f 0a 20 20 6e 4e 65 77 20 3d 20  old */.  nNew = 
12b60 6e 4f 75 74 3b 0a 20 20 69 66 28 20 70 4c 6f 77  nOut;.  if( pLow
12b70 65 72 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e 77  er && (pLower->w
12b80 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
12b90 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  ULL)==0 ){.    n
12ba0 4e 65 77 20 2d 3d 20 32 30 3b 20 20 20 20 20 20  New -= 20;      
12bb0 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71    assert( 20==sq
12bc0 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29  lite3LogEst(4) )
12bd0 3b 0a 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20  ;.    nOut--;.  
12be0 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72 20 29  }.  if( pUpper )
12bf0 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20 32 30  {.    nNew -= 20
12c00 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  ;        assert(
12c10 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   20==sqlite3LogE
12c20 73 74 28 34 29 20 29 3b 0a 20 20 20 20 6e 4f 75  st(4) );.    nOu
12c30 74 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  t--;.  }.  if( n
12c40 4e 65 77 3c 31 30 20 29 20 6e 4e 65 77 20 3d 20  New<10 ) nNew = 
12c50 31 30 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 6e  10;.  if( nNew<n
12c60 4f 75 74 20 29 20 6e 4f 75 74 20 3d 20 6e 4e 65  Out ) nOut = nNe
12c70 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  w;.  pLoop->nOut
12c80 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74 3b   = (LogEst)nOut;
12c90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12ca0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
12cb0 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
12cc0 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT4./*.** Estim
12cd0 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
12ce0 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
12cf0 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73   be returned bas
12d00 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61  ed on.** an equa
12d10 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
12d20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65 72  x=VALUE and wher
12d30 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63 63  e that VALUE occ
12d40 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69  urs in.** the hi
12d50 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20 54  stogram data.  T
12d60 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77  his only works w
12d70 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65 66  hen x is the lef
12d80 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e  t-most.** column
12d90 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e 64   of an index and
12da0 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69   sqlite_stat3 hi
12db0 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20  stogram data is 
12dc0 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72  available.** for
12dd0 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57 68   that index.  Wh
12de0 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74  en pExpr==NULL t
12df0 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 6f  hat means the co
12e00 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22  nstraint is.** "
12e10 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65  x IS NULL" inste
12e20 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e  ad of "x=VALUE".
12e30 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
12e40 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63   estimated row c
12e50 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77  ount into *pnRow
12e60 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
12e70 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e  TE_OK. .** If un
12e80 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20  able to make an 
12e90 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20  estimate, leave 
12ea0 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64  *pnRow unchanged
12eb0 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e   and return.** n
12ec0 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  on-zero..**.** T
12ed0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
12ee0 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e  fail if it is un
12ef0 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63  able to load a c
12f00 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
12f10 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f  e.** required fo
12f20 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69  r string compari
12f30 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c  son, or if unabl
12f40 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  e to allocate me
12f50 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54  mory.** for a UT
12f60 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71  F conversion req
12f70 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72  uired for compar
12f80 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72  ison.  The error
12f90 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   is stored.** in
12fa0 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
12fb0 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
12fc0 20 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c 53   int whereEqualS
12fd0 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
12fe0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
12ff0 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
13000 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
13010 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
13020 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
13030 64 65 72 2c 0a 20 20 45 78 70 72 20 2a 70 45 78  der,.  Expr *pEx
13040 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45  pr,         /* E
13050 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56 41  xpression for VA
13060 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41 4c  LUE in the x=VAL
13070 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  UE constraint */
13080 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f  .  tRowcnt *pnRo
13090 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  w       /* Write
130a0 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77   the revised row
130b0 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a   estimate here *
130c0 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  /.){.  Index *p 
130d0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
130e0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
130f0 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 42  ;.  int nEq = pB
13100 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
13110 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55 6e 70  btree.nEq;.  Unp
13120 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65  ackedRecord *pRe
13130 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52  c = pBuilder->pR
13140 65 63 3b 0a 20 20 75 38 20 61 66 66 3b 20 20 20  ec;.  u8 aff;   
13150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13160 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  /* Column affini
13170 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ty */.  int rc; 
13180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13190 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e    /* Subfunction
131a0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
131b0 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20    tRowcnt a[2]; 
131c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
131d0 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20 69  tatistics */.  i
131e0 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65 72  nt bOk;..  asser
131f0 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20 61  t( nEq>=1 );.  a
13200 73 73 65 72 74 28 20 6e 45 71 3c 3d 28 70 2d 3e  ssert( nEq<=(p->
13210 6e 4b 65 79 43 6f 6c 2b 31 29 20 29 3b 0a 20 20  nKeyCol+1) );.  
13220 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70  assert( p->aSamp
13230 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  le!=0 );.  asser
13240 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20  t( p->nSample>0 
13250 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 75  );.  assert( pBu
13260 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
13270 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  <nEq );..  /* If
13280 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20   values are not 
13290 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c  available for al
132a0 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  l fields of the 
132b0 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66  index to the lef
132c0 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f  t.  ** of this o
132d0 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20  ne, no estimate 
132e0 63 61 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74  can be made. Ret
132f0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
13300 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42  UND. */.  if( pB
13310 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
13320 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20  d<(nEq-1) ){.   
13330 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
13340 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20  OTFOUND;.  }..  
13350 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  /* This is an op
13360 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e  timization only.
13370 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
13380 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
13390 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65  tValue().  ** be
133a0 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e  low would return
133b0 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e   the same value.
133c0 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 70    */.  if( nEq>p
133d0 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  ->nKeyCol ){.   
133e0 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20   *pnRow = 1;.   
133f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13400 4b 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 20 3d 20  K;.  }..  aff = 
13410 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  p->pTable->aCol[
13420 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 2d  p->aiColumn[nEq-
13430 31 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  1]].affinity;.  
13440 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
13450 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70  4ProbeSetValue(p
13460 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c  Parse, p, &pRec,
13470 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71   pExpr, aff, nEq
13480 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20 20 70 42 75  -1, &bOk);.  pBu
13490 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52  ilder->pRec = pR
134a0 65 63 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ec;.  if( rc!=SQ
134b0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
134c0 20 72 63 3b 0a 20 20 69 66 28 20 62 4f 6b 3d 3d   rc;.  if( bOk==
134d0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
134e0 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 70 42  E_NOTFOUND;.  pB
134f0 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
13500 64 20 3d 20 6e 45 71 3b 0a 0a 20 20 77 68 65 72  d = nEq;..  wher
13510 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
13520 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29  , p, pRec, 0, a)
13530 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  ;.  WHERETRACE(0
13540 78 31 30 2c 28 22 65 71 75 61 6c 69 74 79 20 73  x10,("equality s
13550 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c  can regions: %d\
13560 6e 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b  n", (int)a[1]));
13570 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d  .  *pnRow = a[1]
13580 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63  ;.  .  return rc
13590 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
135a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
135b0 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23  3_OR_STAT4 */..#
135c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
135d0 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
135e0 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  T4./*.** Estimat
135f0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
13600 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
13610 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64  e returned based
13620 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e   on.** an IN con
13630 73 74 72 61 69 6e 74 20 77 68 65 72 65 20 74 68  straint where th
13640 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
13650 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  e of the IN oper
13660 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73  ator.** is a lis
13670 74 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78  t of values.  Ex
13680 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
13690 20 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28      WHERE x IN (
136a0 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57  1,2,3,4).**.** W
136b0 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74  rite the estimat
136c0 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74  ed row count int
136d0 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74  o *pnRow and ret
136e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a  urn SQLITE_OK. .
136f0 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20  ** If unable to 
13700 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65  make an estimate
13710 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75  , leave *pnRow u
13720 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74  nchanged and ret
13730 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e  urn.** non-zero.
13740 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
13750 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20  ine can fail if 
13760 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20  it is unable to 
13770 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67  load a collating
13780 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71   sequence.** req
13790 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67  uired for string
137a0 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20   comparison, or 
137b0 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  if unable to all
137c0 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  ocate memory.** 
137d0 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72  for a UTF conver
137e0 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f  sion required fo
137f0 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54  r comparison.  T
13800 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72  he error is stor
13810 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61  ed.** in the pPa
13820 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
13830 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
13840 72 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50  reInScanEst(.  P
13850 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
13860 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
13870 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
13880 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
13890 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
138a0 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72  pBuilder,.  Expr
138b0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
138c0 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69   /* The value li
138d0 73 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  st on the RHS of
138e0 20 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33   "x IN (v1,v2,v3
138f0 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77  ,...)" */.  tRow
13900 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20  cnt *pnRow      
13910 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65   /* Write the re
13920 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61  vised row estima
13930 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  te here */.){.  
13940 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c  Index *p = pBuil
13950 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72  der->pNew->u.btr
13960 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  ee.pIndex;.  int
13970 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75   nRecValid = pBu
13980 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
13990 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
139a0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 53  ITE_OK;     /* S
139b0 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
139c0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
139d0 63 6e 74 20 6e 45 73 74 3b 20 20 20 20 20 20 20  cnt nEst;       
139e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
139f0 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e 67   rows for a sing
13a00 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52 6f  le term */.  tRo
13a10 77 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20 30  wcnt nRowEst = 0
13a20 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74 69  ;    /* New esti
13a30 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
13a40 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20  er of rows */.  
13a50 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
13a60 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
13a70 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  counter */..  as
13a80 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
13a90 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  !=0 );.  for(i=0
13aa0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
13ab0 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  && i<pList->nExp
13ac0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73  r; i++){.    nEs
13ad0 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b  t = p->aiRowEst[
13ae0 30 5d 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65  0];.    rc = whe
13af0 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70  reEqualScanEst(p
13b00 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
13b10 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
13b20 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20  pr, &nEst);.    
13b30 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b  nRowEst += nEst;
13b40 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
13b50 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56  RecValid = nRecV
13b60 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  alid;.  }..  if(
13b70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13b80 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73  {.    if( nRowEs
13b90 74 20 3e 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b  t > p->aiRowEst[
13ba0 30 5d 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 70  0] ) nRowEst = p
13bb0 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20  ->aiRowEst[0];. 
13bc0 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77     *pnRow = nRow
13bd0 45 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52  Est;.    WHERETR
13be0 41 43 45 28 30 78 31 30 2c 28 22 49 4e 20 72 6f  ACE(0x10,("IN ro
13bf0 77 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d  w estimate: est=
13c00 25 67 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29  %g\n", nRowEst))
13c10 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
13c20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
13c30 6c 69 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29  lid==nRecValid )
13c40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13c50 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
13c60 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
13c70 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a  R_STAT4 */../*.*
13c80 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d  * Disable a term
13c90 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
13ca0 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64  ause.  Except, d
13cb0 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68  o not disable th
13cc0 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20  e term.** if it 
13cd0 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20  controls a LEFT 
13ce0 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69  OUTER JOIN and i
13cf0 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e  t did not origin
13d00 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a  ate in the ON.**
13d10 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
13d20 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a   of that join..*
13d30 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68  *.** Consider th
13d40 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27  e term t2.z='ok'
13d50 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
13d60 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a  g queries:.**.**
13d70 20 20 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a     (1)  SELECT *
13d80 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
13d90 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
13da0 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f  .x WHERE t2.z='o
13db0 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c  k'.**   (2)  SEL
13dc0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
13dd0 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
13de0 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a  .a=t2.x AND t2.z
13df0 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20  ='ok'.**   (3)  
13e00 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
13e10 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d  , t2 WHERE t1.a=
13e20 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f  t2.x AND t2.z='o
13e30 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e  k'.**.** The t2.
13e40 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c  z='ok' is disabl
13e50 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29  ed in the in (2)
13e60 20 62 65 63 61 75 73 65 20 69 74 20 6f 72 69 67   because it orig
13e70 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65  inates.** in the
13e80 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65   ON clause.  The
13e90 20 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65   term is disable
13ea0 64 20 69 6e 20 28 33 29 20 62 65 63 61 75 73 65  d in (3) because
13eb0 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a   it is not part.
13ec0 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  ** of a LEFT OUT
13ed0 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29  ER JOIN.  In (1)
13ee0 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f  , the term is no
13ef0 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a  t disabled..**.*
13f00 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65  * Disabling a te
13f10 72 6d 20 63 61 75 73 65 73 20 74 68 61 74 20 74  rm causes that t
13f20 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65  erm to not be te
13f30 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65  sted in the inne
13f40 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65  r loop.** of the
13f50 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e   join.  Disablin
13f60 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  g is an optimiza
13f70 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d  tion.  When term
13f80 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a  s are satisfied.
13f90 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77  ** by indices, w
13fa0 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74  e disable them t
13fb0 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64  o prevent redund
13fc0 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68 65  ant tests in the
13fd0 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20   inner.** loop. 
13fe0 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68   We would get th
13ff0 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74  e correct result
14000 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72  s if nothing wer
14010 65 20 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c  e ever disabled,
14020 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69  .** but joins mi
14030 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65  ght run a little
14040 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72   slower.  The tr
14050 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c  ick is to disabl
14060 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20  e as much.** as 
14070 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64  we can without d
14080 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63  isabling too muc
14090 68 2e 20 20 49 66 20 77 65 20 64 69 73 61 62 6c  h.  If we disabl
140a0 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20  ed in (1), we'd 
140b0 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67  get.** the wrong
140c0 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69   answer.  See ti
140d0 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74  cket #813..*/.st
140e0 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c  atic void disabl
140f0 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c  eTerm(WhereLevel
14100 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54   *pLevel, WhereT
14110 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69  erm *pTerm){.  i
14120 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26  f( pTerm.      &
14130 26 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  & (pTerm->wtFlag
14140 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d  s & TERM_CODED)=
14150 3d 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65  =0.      && (pLe
14160 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d  vel->iLeftJoin==
14170 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  0 || ExprHasProp
14180 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
14190 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29  r, EP_FromJoin))
141a0 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65  .      && (pLeve
141b0 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 26 20 70 54  l->notReady & pT
141c0 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 29 3d  erm->prereqAll)=
141d0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 54 65 72  =0.  ){.    pTer
141e0 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
141f0 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66  RM_CODED;.    if
14200 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  ( pTerm->iParent
14210 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65  >=0 ){.      Whe
14220 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d  reTerm *pOther =
14230 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b   &pTerm->pWC->a[
14240 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  pTerm->iParent];
14250 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f  .      if( (--pO
14260 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30  ther->nChild)==0
14270 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61   ){.        disa
14280 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
14290 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d  pOther);.      }
142a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
142b0 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41  .** Code an OP_A
142c0 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 74  ffinity opcode t
142d0 6f 20 61 70 70 6c 79 20 74 68 65 20 63 6f 6c 75  o apply the colu
142e0 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  mn affinity stri
142f0 6e 67 20 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68  ng zAff.** to th
14300 65 20 6e 20 72 65 67 69 73 74 65 72 73 20 73 74  e n registers st
14310 61 72 74 69 6e 67 20 61 74 20 62 61 73 65 2e 20  arting at base. 
14320 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74  .**.** As an opt
14330 69 6d 69 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54  imization, SQLIT
14340 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69  E_AFF_NONE entri
14350 65 73 20 28 77 68 69 63 68 20 61 72 65 20 6e 6f  es (which are no
14360 2d 6f 70 73 29 20 61 74 20 74 68 65 0a 2a 2a 20  -ops) at the.** 
14370 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e  beginning and en
14380 64 20 6f 66 20 7a 41 66 66 20 61 72 65 20 69 67  d of zAff are ig
14390 6e 6f 72 65 64 2e 20 20 49 66 20 61 6c 6c 20 65  nored.  If all e
143a0 6e 74 72 69 65 73 20 69 6e 20 7a 41 66 66 20 61  ntries in zAff a
143b0 72 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  re.** SQLITE_AFF
143c0 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20 6e 6f 20 63  _NONE, then no c
143d0 6f 64 65 20 67 65 74 73 20 67 65 6e 65 72 61 74  ode gets generat
143e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
143f0 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 73  outine makes its
14400 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66   own copy of zAf
14410 66 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61  f so that the ca
14420 6c 6c 65 72 20 69 73 20 66 72 65 65 0a 2a 2a 20  ller is free.** 
14430 74 6f 20 6d 6f 64 69 66 79 20 7a 41 66 66 20 61  to modify zAff a
14440 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
14450 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74  e returns..*/.st
14460 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41 70  atic void codeAp
14470 70 6c 79 41 66 66 69 6e 69 74 79 28 50 61 72 73  plyAffinity(Pars
14480 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 62  e *pParse, int b
14490 61 73 65 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72  ase, int n, char
144a0 20 2a 7a 41 66 66 29 7b 0a 20 20 56 64 62 65 20   *zAff){.  Vdbe 
144b0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
144c0 62 65 3b 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d  be;.  if( zAff==
144d0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
144e0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
144f0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
14500 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
14510 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a  ssert( v!=0 );..
14520 20 20 2f 2a 20 41 64 6a 75 73 74 20 62 61 73 65    /* Adjust base
14530 20 61 6e 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f   and n to skip o
14540 76 65 72 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ver SQLITE_AFF_N
14550 4f 4e 45 20 65 6e 74 72 69 65 73 20 61 74 20 74  ONE entries at t
14560 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a  he beginning.  *
14570 2a 20 61 6e 64 20 65 6e 64 20 6f 66 20 74 68 65  * and end of the
14580 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
14590 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
145a0 6e 3e 30 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d  n>0 && zAff[0]==
145b0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
145c0 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20  ){.    n--;.    
145d0 62 61 73 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66  base++;.    zAff
145e0 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  ++;.  }.  while(
145f0 20 6e 3e 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31   n>1 && zAff[n-1
14600 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ]==SQLITE_AFF_NO
14610 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20  NE ){.    n--;. 
14620 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68   }..  /* Code th
14630 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70  e OP_Affinity op
14640 63 6f 64 65 20 69 66 20 74 68 65 72 65 20 69 73  code if there is
14650 20 61 6e 79 74 68 69 6e 67 20 6c 65 66 74 20 74   anything left t
14660 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e  o do. */.  if( n
14670 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
14680 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14690 50 5f 41 66 66 69 6e 69 74 79 2c 20 62 61 73 65  P_Affinity, base
146a0 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , n);.    sqlite
146b0 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
146c0 20 2d 31 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20   -1, zAff, n);. 
146d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
146e0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
146f0 65 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20  e(pParse, base, 
14700 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  n);.  }.}.../*.*
14710 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
14720 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75  for a single equ
14730 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68  ality term of th
14740 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
14750 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20   An equality.** 
14760 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68  term can be eith
14770 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49  er X=expr or X I
14780 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d  N (...).   pTerm
14790 20 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20   is the term to 
147a0 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a  be .** coded..**
147b0 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20  .** The current 
147c0 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f  value for the co
147d0 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74  nstraint is left
147e0 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
147f0 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63  g..**.** For a c
14800 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65  onstraint of the
14810 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68   form X=expr, th
14820 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
14830 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74  evaluated and it
14840 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c  s.** result is l
14850 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  eft on the stack
14860 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e  .  For constrain
14870 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  ts of the form X
14880 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69   IN (...).** thi
14890 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75  s routine sets u
148a0 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  p a loop that wi
148b0 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  ll iterate over 
148c0 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e  all values of X.
148d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
148e0 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
148f0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
14900 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
14910 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
14920 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
14930 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65  erm,   /* The te
14940 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
14950 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64  clause to be cod
14960 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  ed */.  WhereLev
14970 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 54  el *pLevel, /* T
14980 68 65 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  he level of the 
14990 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61  FROM clause we a
149a0 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
149b0 0a 20 20 69 6e 74 20 69 45 71 2c 20 20 20 20 20  .  int iEq,     
149c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
149d0 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  of the equality 
149e0 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 69 73  term within this
149f0 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20   level */.  int 
14a00 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20  bRev,           
14a10 2f 2a 20 54 72 75 65 20 66 6f 72 20 72 65 76 65  /* True for reve
14a20 72 73 65 2d 6f 72 64 65 72 20 49 4e 20 6f 70 65  rse-order IN ope
14a30 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  rations */.  int
14a40 20 69 54 61 72 67 65 74 20 20 20 20 20 20 20 20   iTarget        
14a50 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6c   /* Attempt to l
14a60 65 61 76 65 20 72 65 73 75 6c 74 73 20 69 6e 20  eave results in 
14a70 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
14a80 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d  .){.  Expr *pX =
14a90 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
14aa0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
14ab0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
14ac0 69 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  iReg;           
14ad0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
14ae0 65 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  er holding resul
14af0 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ts */..  assert(
14b00 20 69 54 61 72 67 65 74 3e 30 20 29 3b 0a 20 20   iTarget>0 );.  
14b10 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45  if( pX->op==TK_E
14b20 51 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20  Q ){.    iReg = 
14b30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
14b40 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 58  arget(pParse, pX
14b50 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65  ->pRight, iTarge
14b60 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
14b70 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  pX->op==TK_ISNUL
14b80 4c 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20  L ){.    iReg = 
14b90 69 54 61 72 67 65 74 3b 0a 20 20 20 20 73 71 6c  iTarget;.    sql
14ba0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14bb0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52  , OP_Null, 0, iR
14bc0 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  eg);.#ifndef SQL
14bd0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
14be0 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  Y.  }else{.    i
14bf0 6e 74 20 65 54 79 70 65 3b 0a 20 20 20 20 69 6e  nt eType;.    in
14c00 74 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72 75  t iTab;.    stru
14c10 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a  ct InLoop *pIn;.
14c20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
14c30 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
14c40 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 69 66 28 20  WLoop;..    if( 
14c50 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
14c60 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
14c70 41 42 4c 45 29 3d 3d 30 0a 20 20 20 20 20 20 26  ABLE)==0.      &
14c80 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  & pLoop->u.btree
14c90 2e 70 49 6e 64 65 78 21 3d 30 0a 20 20 20 20 20  .pIndex!=0.     
14ca0 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72   && pLoop->u.btr
14cb0 65 65 2e 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74  ee.pIndex->aSort
14cc0 4f 72 64 65 72 5b 69 45 71 5d 0a 20 20 20 20 29  Order[iEq].    )
14cd0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
14ce0 28 20 69 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20  ( iEq==0 );.    
14cf0 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76    testcase( bRev
14d00 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d   );.      bRev =
14d10 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20   !bRev;.    }.  
14d20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
14d30 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69  ==TK_IN );.    i
14d40 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20  Reg = iTarget;. 
14d50 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74     eType = sqlit
14d60 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
14d70 61 72 73 65 2c 20 70 58 2c 20 30 29 3b 0a 20 20  arse, pX, 0);.  
14d80 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
14d90 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43  INDEX_INDEX_DESC
14da0 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
14db0 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20  se( bRev );.    
14dc0 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a    bRev = !bRev;.
14dd0 20 20 20 20 7d 0a 20 20 20 20 69 54 61 62 20 3d      }.    iTab =
14de0 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20   pX->iTable;.   
14df0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14e00 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f  p2(v, bRev ? OP_
14e10 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64  Last : OP_Rewind
14e20 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , iTab, 0);.    
14e30 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
14e40 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
14e50 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a  MULTI_OR)==0 );.
14e60 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
14e70 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 4e 5f 41  gs |= WHERE_IN_A
14e80 42 4c 45 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  BLE;.    if( pLe
14e90 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30  vel->u.in.nIn==0
14ea0 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
14eb0 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69  ->addrNxt = sqli
14ec0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14ed0 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  (v);.    }.    p
14ee0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b  Level->u.in.nIn+
14ef0 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75  +;.    pLevel->u
14f00 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20  .in.aInLoop =.  
14f10 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65       sqlite3DbRe
14f20 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72  allocOrFree(pPar
14f30 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e  se->db, pLevel->
14f40 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20  u.in.aInLoop,.  
14f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f60 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
14f70 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  of(pLevel->u.in.
14f80 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76  aInLoop[0])*pLev
14f90 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20  el->u.in.nIn);. 
14fa0 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d     pIn = pLevel-
14fb0 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20  >u.in.aInLoop;. 
14fc0 20 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20     if( pIn ){.  
14fd0 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65      pIn += pLeve
14fe0 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b  l->u.in.nIn - 1;
14ff0 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72  .      pIn->iCur
15000 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69   = iTab;.      i
15010 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
15020 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
15030 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54      pIn->addrInT
15040 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
15050 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
15060 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b  id, iTab, iReg);
15070 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15080 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49        pIn->addrI
15090 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  nTop = sqlite3Vd
150a0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
150b0 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20  olumn, iTab, 0, 
150c0 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iReg);.      }. 
150d0 20 20 20 20 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f       pIn->eEndLo
150e0 6f 70 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  opOp = bRev ? OP
150f0 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b  _Prev : OP_Next;
15100 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15110 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
15120 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20  sNull, iReg);.  
15130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
15140 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20  Level->u.in.nIn 
15150 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 0;.    }.#endi
15160 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54  f.  }.  disableT
15170 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
15180 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65  m);.  return iRe
15190 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  g;.}../*.** Gene
151a0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
151b0 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c  ill evaluate all
151c0 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74   == and IN const
151d0 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a  raints for an.**
151e0 20 69 6e 64 65 78 20 73 63 61 6e 2e 0a 2a 2a 0a   index scan..**.
151f0 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
15200 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74  consider table t
15210 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77  1(a,b,c,d,e,f) w
15220 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62  ith index i1(a,b
15230 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ,c)..** Suppose 
15240 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
15250 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20   is this:  a==5 
15260 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29  AND b IN (1,2,3)
15270 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31   AND c>5 AND c<1
15280 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68  0.** The index h
15290 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68  as as many as th
152a0 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ree equality con
152b0 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e  straints, but in
152c0 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65   this.** example
152d0 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20  , the third "c" 
152e0 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71  value is an ineq
152f0 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79  uality.  So only
15300 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61   two .** constra
15310 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20  ints are coded. 
15320 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
15330 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  ll generate code
15340 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20   to evaluate.** 
15350 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31  a==5 and b IN (1
15360 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72  ,2,3).  The curr
15370 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61  ent values for a
15380 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73   and b will be s
15390 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73  tored.** in cons
153a0 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
153b0 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  s and the index 
153c0 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65 67  of the first reg
153d0 69 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65  ister is returne
153e0 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  d..**.** In the 
153f0 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45  example above nE
15400 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20  q==2.  But this 
15410 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  subroutine works
15420 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a   for any value.*
15430 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69  * of nEq includi
15440 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30  ng 0.  If nEq==0
15450 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
15460 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70  s nearly a no-op
15470 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68  ..** The only th
15480 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61  ing it does is a
15490 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76  llocate the pLev
154a0 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20  el->iMem memory 
154b0 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70  cell and.** comp
154c0 75 74 65 20 74 68 65 20 61 66 66 69 6e 69 74 79  ute the affinity
154d0 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
154e0 68 65 20 6e 45 78 74 72 61 52 65 67 20 70 61 72  he nExtraReg par
154f0 61 6d 65 74 65 72 20 69 73 20 30 20 6f 72 20 31  ameter is 0 or 1
15500 2e 20 20 49 74 20 69 73 20 30 20 69 66 20 61 6c  .  It is 0 if al
15510 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  l WHERE clause c
15520 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 61 72  onstraints.** ar
15530 65 20 3d 3d 20 6f 72 20 49 4e 20 61 6e 64 20 61  e == or IN and a
15540 72 65 20 63 6f 76 65 72 65 64 20 62 79 20 74 68  re covered by th
15550 65 20 6e 45 71 2e 20 20 6e 45 78 74 72 61 52 65  e nEq.  nExtraRe
15560 67 20 69 73 20 31 20 69 66 20 74 68 65 72 65 20  g is 1 if there 
15570 69 73 0a 2a 2a 20 61 6e 20 69 6e 65 71 75 61 6c  is.** an inequal
15580 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  ity constraint (
15590 73 75 63 68 20 61 73 20 74 68 65 20 22 63 3e 3d  such as the "c>=
155a0 35 20 41 4e 44 20 63 3c 31 30 22 20 69 6e 20 74  5 AND c<10" in t
155b0 68 65 20 65 78 61 6d 70 6c 65 29 20 74 68 61 74  he example) that
155c0 0a 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72  .** occurs after
155d0 20 74 68 65 20 6e 45 71 20 71 75 61 6c 69 74 79   the nEq quality
155e0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a   constraints..**
155f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15600 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 72 61 6e   allocates a ran
15610 67 65 20 6f 66 20 6e 45 71 2b 6e 45 78 74 72 61  ge of nEq+nExtra
15620 52 65 67 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  Reg memory cells
15630 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20   and returns.** 
15640 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
15650 20 66 69 72 73 74 20 6d 65 6d 6f 72 79 20 63 65   first memory ce
15660 6c 6c 20 69 6e 20 74 68 61 74 20 72 61 6e 67 65  ll in that range
15670 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a  . The code that.
15680 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  ** calls this ro
15690 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74  utine will use t
156a0 68 61 74 20 6d 65 6d 6f 72 79 20 72 61 6e 67 65  hat memory range
156b0 20 74 6f 20 73 74 6f 72 65 20 6b 65 79 73 20 66   to store keys f
156c0 6f 72 0a 2a 2a 20 73 74 61 72 74 20 61 6e 64 20  or.** start and 
156d0 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64  termination cond
156e0 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f  itions of the lo
156f0 6f 70 2e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65  op..** key value
15700 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49   of the loop.  I
15710 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e  f one or more IN
15720 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61   operators appea
15730 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  r, then.** this 
15740 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65  routine allocate
15750 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  s an additional 
15760 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  nEq memory cells
15770 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   for internal.**
15780 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f   use..**.** Befo
15790 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
157a0 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f 20 70  zAff is set to p
157b0 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
157c0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a   containing a.**
157d0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c   copy of the col
157e0 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72  umn affinity str
157f0 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ing of the index
15800 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
15810 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  .** sqlite3DbMal
15820 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65  loc(). Except, e
15830 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f  ntries in the co
15840 70 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  py of the string
15850 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
15860 69 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ith equality con
15870 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 75 73  straints that us
15880 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20  e NONE affinity 
15890 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51  are set to.** SQ
158a0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54  LITE_AFF_NONE. T
158b0 68 69 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77  his is to deal w
158c0 69 74 68 20 53 51 4c 20 73 75 63 68 20 61 73 20  ith SQL such as 
158d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
158e0 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41  *.**   CREATE TA
158f0 42 4c 45 20 74 31 28 61 20 54 45 58 54 20 50 52  BLE t1(a TEXT PR
15900 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a  IMARY KEY, b);.*
15910 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46  *   SELECT ... F
15920 52 4f 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31  ROM t1 AS t2, t1
15930 20 57 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32   WHERE t1.a = t2
15940 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  .b;.**.** In the
15950 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20   example above, 
15960 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28  the index on t1(
15970 61 29 20 68 61 73 20 54 45 58 54 20 61 66 66 69  a) has TEXT affi
15980 6e 69 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a  nity. But since.
15990 2a 2a 20 74 68 65 20 72 69 67 68 74 20 68 61 6e  ** the right han
159a0 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 65 71  d side of the eq
159b0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
159c0 74 20 28 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e  t (t2.b) has NON
159d0 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e  E affinity,.** n
159e0 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f  o conversion sho
159f0 75 6c 64 20 62 65 20 61 74 74 65 6d 70 74 65 64  uld be attempted
15a00 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20   before using a 
15a10 74 32 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61  t2.b value as pa
15a20 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74  rt of.** a key t
15a30 6f 20 73 65 61 72 63 68 20 74 68 65 20 69 6e 64  o search the ind
15a40 65 78 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69  ex. Hence the fi
15a50 72 73 74 20 62 79 74 65 20 69 6e 20 74 68 65 20  rst byte in the 
15a60 72 65 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74  returned affinit
15a70 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74  y.** string in t
15a80 68 69 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c  his example woul
15a90 64 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49  d be set to SQLI
15aa0 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a  TE_AFF_NONE..*/.
15ab0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41  static int codeA
15ac0 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28  llEqualityTerms(
15ad0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
15ae0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
15af0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
15b00 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
15b10 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20  vel,   /* Which 
15b20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
15b30 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63  he FROM we are c
15b40 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62  oding */.  int b
15b50 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rev,            
15b60 20 2f 2a 20 52 65 76 65 72 73 65 20 74 68 65 20   /* Reverse the 
15b70 6f 72 64 65 72 20 6f 66 20 49 4e 20 6f 70 65 72  order of IN oper
15b80 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  ators */.  int n
15b90 45 78 74 72 61 52 65 67 2c 20 20 20 20 20 20 20  ExtraReg,       
15ba0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
15bb0 74 72 61 20 72 65 67 69 73 74 65 72 73 20 74 6f  tra registers to
15bc0 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63   allocate */.  c
15bd0 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20 20 20  har **pzAff     
15be0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74       /* OUT: Set
15bf0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66 66   to point to aff
15c00 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a  inity string */.
15c10 29 7b 0a 20 20 75 31 36 20 6e 45 71 3b 20 20 20  ){.  u16 nEq;   
15c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c30 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
15c40 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e   of == or IN con
15c50 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65  straints to code
15c60 20 2a 2f 0a 20 20 75 31 36 20 6e 53 6b 69 70 3b   */.  u16 nSkip;
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c80 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15c90 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
15ca0 6e 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20  ns to skip */.  
15cb0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
15cc0 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
15cd0 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f   The vm under co
15ce0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
15cf0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
15d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15d10 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   The index being
15d20 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c   used for this l
15d30 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  oop */.  WhereTe
15d40 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
15d50 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
15d60 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  le constraint te
15d70 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  rm */.  WhereLoo
15d80 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
15d90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
15da0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
15db0 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dd0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
15de0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
15df0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
15e00 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
15e10 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ster */.  int nR
15e20 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
15e30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
15e40 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  r of registers t
15e50 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
15e60 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20  char *zAff;     
15e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15e80 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   Affinity string
15e90 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20   to return */.. 
15ea0 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20   /* This module 
15eb0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f  is only called o
15ec0 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68  n query plans th
15ed0 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e  at use an index.
15ee0 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c   */.  pLoop = pL
15ef0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
15f00 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
15f10 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
15f20 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
15f30 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f   );.  nEq = pLoo
15f40 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
15f50 20 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d    nSkip = pLoop-
15f60 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3b 0a  >u.btree.nSkip;.
15f70 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
15f80 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
15f90 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
15fa0 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  0 );..  /* Figur
15fb0 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d  e out how many m
15fc0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77  emory cells we w
15fd0 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c  ill need then al
15fe0 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a  locate them..  *
15ff0 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50  /.  regBase = pP
16000 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
16010 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e    nReg = pLoop->
16020 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45  u.btree.nEq + nE
16030 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73  xtraReg;.  pPars
16040 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
16050 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74  ..  zAff = sqlit
16060 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73  e3DbStrDup(pPars
16070 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33 49 6e  e->db, sqlite3In
16080 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76  dexAffinityStr(v
16090 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66 28 20  , pIdx));.  if( 
160a0 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70 50 61  !zAff ){.    pPa
160b0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
160c0 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a  ailed = 1;.  }..
160d0 20 20 69 66 28 20 6e 53 6b 69 70 20 29 7b 0a 20    if( nSkip ){. 
160e0 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 3d     int iIdxCur =
160f0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
16100 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16110 65 41 64 64 4f 70 31 28 76 2c 20 28 62 52 65 76  eAddOp1(v, (bRev
16120 3f 4f 50 5f 4c 61 73 74 3a 4f 50 5f 52 65 77 69  ?OP_Last:OP_Rewi
16130 6e 64 29 2c 20 69 49 64 78 43 75 72 29 3b 0a 20  nd), iIdxCur);. 
16140 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
16150 76 2c 20 22 62 65 67 69 6e 20 73 6b 69 70 2d 73  v, "begin skip-s
16160 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 49 64 78  can on %s", pIdx
16170 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 6a  ->zName));.    j
16180 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
16190 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
161a0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  ;.    pLevel->ad
161b0 64 72 53 6b 69 70 20 3d 20 73 71 6c 69 74 65 33  drSkip = sqlite3
161c0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
161d0 20 28 62 52 65 76 3f 4f 50 5f 53 65 65 6b 4c 74   (bRev?OP_SeekLt
161e0 3a 4f 50 5f 53 65 65 6b 47 74 29 2c 0a 20 20 20  :OP_SeekGt),.   
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16200 20 20 20 20 20 20 20 20 20 69 49 64 78 43 75 72           iIdxCur
16210 2c 20 30 2c 20 72 65 67 42 61 73 65 2c 20 6e 53  , 0, regBase, nS
16220 6b 69 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  kip);.    sqlite
16230 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
16240 20 6a 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30   j);.    for(j=0
16250 3b 20 6a 3c 6e 53 6b 69 70 3b 20 6a 2b 2b 29 7b  ; j<nSkip; j++){
16260 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16270 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
16280 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20  olumn, iIdxCur, 
16290 6a 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  j, regBase+j);. 
162a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
162b0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d  x->aiColumn[j]>=
162c0 30 20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  0 );.      VdbeC
162d0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
162e0 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
162f0 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75  Col[pIdx->aiColu
16300 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 29 29 3b 0a  mn[j]].zName));.
16310 20 20 20 20 7d 0a 20 20 7d 20 20 20 20 0a 0a 20      }.  }    .. 
16320 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
16330 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
16340 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  aints.  */.  ass
16350 65 72 74 28 20 7a 41 66 66 3d 3d 30 20 7c 7c 20  ert( zAff==0 || 
16360 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 66 66  (int)strlen(zAff
16370 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28  )>=nEq );.  for(
16380 6a 3d 6e 53 6b 69 70 3b 20 6a 3c 6e 45 71 3b 20  j=nSkip; j<nEq; 
16390 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31  j++){.    int r1
163a0 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c  ;.    pTerm = pL
163b0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a  oop->aLTerm[j];.
163c0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
163d0 6d 21 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54  m!=0 );.    /* T
163e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
163f0 74 63 61 73 65 20 69 73 20 74 72 75 65 20 66 6f  tcase is true fo
16400 72 20 69 6e 64 69 63 65 73 20 77 69 74 68 20 72  r indices with r
16410 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73  edundant columns
16420 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20 43 52  . .    ** Ex: CR
16430 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
16440 20 74 31 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45   t1(a,b,a); SELE
16450 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
16460 52 45 20 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20  RE a=0 AND b=0; 
16470 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  */.    testcase(
16480 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
16490 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d   & TERM_CODED)!=
164a0 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
164b0 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
164c0 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
164d0 20 29 3b 0a 20 20 20 20 72 31 20 3d 20 63 6f 64   );.    r1 = cod
164e0 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
164f0 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65  arse, pTerm, pLe
16500 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 72 65  vel, j, bRev, re
16510 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66  gBase+j);.    if
16520 28 20 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20  ( r1!=regBase+j 
16530 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65  ){.      if( nRe
16540 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  g==1 ){.        
16550 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
16560 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
16570 67 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  gBase);.        
16580 72 65 67 42 61 73 65 20 3d 20 72 31 3b 0a 20 20  regBase = r1;.  
16590 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
165a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
165b0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
165c0 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b 6a 29  , r1, regBase+j)
165d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
165e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
165f0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
16600 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
16610 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
16620 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
16630 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66 28 20  O_IN );.    if( 
16640 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
16650 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57  r & (WO_ISNULL|W
16660 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20  O_IN))==0 ){.   
16670 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
16680 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  = pTerm->pExpr->
16690 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71  pRight;.      sq
166a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e  lite3ExprCodeIsN
166b0 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68  ullJump(v, pRigh
166c0 74 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c  t, regBase+j, pL
166d0 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
166e0 20 20 20 20 20 20 69 66 28 20 7a 41 66 66 20 29        if( zAff )
166f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
16700 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
16710 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 41 66  nity(pRight, zAf
16720 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46  f[j])==SQLITE_AF
16730 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  F_NONE ){.      
16740 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51      zAff[j] = SQ
16750 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
16760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16770 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
16780 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
16790 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 41  hange(pRight, zA
167a0 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20  ff[j]) ){.      
167b0 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51      zAff[j] = SQ
167c0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
167d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
167e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a  .    }.  }.  *pz
167f0 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65  Aff = zAff;.  re
16800 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a  turn regBase;.}.
16810 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16820 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
16830 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
16840 69 73 20 61 20 68 65 6c 70 65 72 20 66 6f 72 20  is a helper for 
16850 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
16860 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20  e() below.**.** 
16870 70 53 74 72 20 68 6f 6c 64 73 20 74 68 65 20 74  pStr holds the t
16880 65 78 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  ext of an expres
16890 73 69 6f 6e 20 74 68 61 74 20 77 65 20 61 72 65  sion that we are
168a0 20 62 75 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65   building up one
168b0 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69   term.** at a ti
168c0 6d 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  me.  This routin
168d0 65 20 61 64 64 73 20 61 20 6e 65 77 20 74 65 72  e adds a new ter
168e0 6d 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  m to the end of 
168f0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  the expression..
16900 2a 2a 20 54 65 72 6d 73 20 61 72 65 20 73 65 70  ** Terms are sep
16910 61 72 61 74 65 64 20 62 79 20 41 4e 44 20 73 6f  arated by AND so
16920 20 61 64 64 20 74 68 65 20 22 41 4e 44 22 20 74   add the "AND" t
16930 65 78 74 20 66 6f 72 20 73 65 63 6f 6e 64 20 61  ext for second a
16940 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  nd subsequent.**
16950 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a   terms only..*/.
16960 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
16970 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 0a 20  ainAppendTerm(. 
16980 20 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72 2c   StrAccum *pStr,
16990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
169a0 54 68 65 20 74 65 78 74 20 65 78 70 72 65 73 73  The text express
169b0 69 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c 74 20  ion being built 
169c0 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20  */.  int iTerm, 
169d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169e0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 69   /* Index of thi
169f0 73 20 74 65 72 6d 2e 20 20 46 69 72 73 74 20 69  s term.  First i
16a00 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73  s zero */.  cons
16a10 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c  t char *zColumn,
16a20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
16a30 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f  of the column */
16a40 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
16a50 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  Op             /
16a60 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
16a70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69  erator */.){.  i
16a80 66 28 20 69 54 65 72 6d 20 29 20 73 71 6c 69 74  f( iTerm ) sqlit
16a90 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
16aa0 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22 2c 20  (pStr, " AND ", 
16ab0 35 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  5);.  sqlite3Str
16ac0 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
16ad0 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31 29 3b 0a  , zColumn, -1);.
16ae0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
16af0 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f  mAppend(pStr, zO
16b00 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  p, 1);.  sqlite3
16b10 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
16b20 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a  Str, "?", 1);.}.
16b30 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
16b40 70 4c 65 76 65 6c 20 64 65 73 63 72 69 62 65 73  pLevel describes
16b50 20 61 20 73 74 72 61 74 65 67 79 20 66 6f 72 20   a strategy for 
16b60 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70  scanning table p
16b70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  Tab. This .** fu
16b80 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
16b90 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
16ba0 72 69 6e 67 20 62 75 66 66 65 72 20 63 6f 6e 74  ring buffer cont
16bb0 61 69 6e 69 6e 67 20 61 20 64 65 73 63 72 69 70  aining a descrip
16bc0 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 73  tion.** of the s
16bd0 75 62 73 65 74 20 6f 66 20 74 61 62 6c 65 20 72  ubset of table r
16be0 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79 20 74  ows scanned by t
16bf0 68 65 20 73 74 72 61 74 65 67 79 20 69 6e 20 74  he strategy in t
16c00 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a  he form of an.**
16c10 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e   SQL expression.
16c20 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72 6f 77 73   Or, if all rows
16c30 20 61 72 65 20 73 63 61 6e 6e 65 64 2c 20 4e 55   are scanned, NU
16c40 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
16c50 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
16c60 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 3a  e, if the query:
16c70 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
16c80 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
16c90 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a  a=1 AND b>2;.**.
16ca0 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64 20 74 68  ** is run and th
16cb0 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ere is an index 
16cc0 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 6e 20  on (a, b), then 
16cd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
16ce0 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e  turns a.** strin
16cf0 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a  g similar to:.**
16d00 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44 20 62  .**   "a=? AND b
16d10 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  >?".**.** The re
16d20 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 20 70  turned pointer p
16d30 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f 72 79 20  oints to memory 
16d40 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
16d50 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e  lite3DbMalloc().
16d60 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65  .** It is the re
16d70 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
16d80 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 66 72  the caller to fr
16d90 65 65 20 74 68 65 20 62 75 66 66 65 72 20 77 68  ee the buffer wh
16da0 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c  en it is.** no l
16db0 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a  onger required..
16dc0 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
16dd0 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
16de0 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
16df0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c  hereLoop *pLoop,
16e00 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20   Table *pTab){. 
16e10 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
16e20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
16e30 70 49 6e 64 65 78 3b 0a 20 20 75 31 36 20 6e 45  pIndex;.  u16 nE
16e40 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
16e50 65 65 2e 6e 45 71 3b 0a 20 20 75 31 36 20 6e 53  ee.nEq;.  u16 nS
16e60 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  kip = pLoop->u.b
16e70 74 72 65 65 2e 6e 53 6b 69 70 3b 0a 20 20 69 6e  tree.nSkip;.  in
16e80 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e  t i, j;.  Column
16e90 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61   *aCol = pTab->a
16ea0 43 6f 6c 3b 0a 20 20 69 31 36 20 2a 61 69 43 6f  Col;.  i16 *aiCo
16eb0 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61  lumn = pIndex->a
16ec0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63  iColumn;.  StrAc
16ed0 63 75 6d 20 74 78 74 3b 0a 0a 20 20 69 66 28 20  cum txt;..  if( 
16ee0 6e 45 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70  nEq==0 && (pLoop
16ef0 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
16f00 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45  RE_BTM_LIMIT|WHE
16f10 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d  RE_TOP_LIMIT))==
16f20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
16f30 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
16f40 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 74 78  StrAccumInit(&tx
16f50 74 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f  t, 0, 0, SQLITE_
16f60 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74  MAX_LENGTH);.  t
16f70 78 74 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 71  xt.db = db;.  sq
16f80 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
16f90 65 6e 64 28 26 74 78 74 2c 20 22 20 28 22 2c 20  end(&txt, " (", 
16fa0 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  2);.  for(i=0; i
16fb0 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nEq; i++){.    
16fc0 63 68 61 72 20 2a 7a 20 3d 20 28 69 3d 3d 70 49  char *z = (i==pI
16fd0 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20  ndex->nKeyCol ) 
16fe0 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c  ? "rowid" : aCol
16ff0 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e  [aiColumn[i]].zN
17000 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d  ame;.    if( i>=
17010 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 65  nSkip ){.      e
17020 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
17030 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20 22 3d 22  (&txt, i, z, "="
17040 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
17050 20 20 20 20 69 66 28 20 69 20 29 20 73 71 6c 69      if( i ) sqli
17060 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
17070 64 28 26 74 78 74 2c 20 22 20 41 4e 44 20 22 2c  d(&txt, " AND ",
17080 20 35 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   5);.      sqlit
17090 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
170a0 28 26 74 78 74 2c 20 22 41 4e 59 28 22 2c 20 34  (&txt, "ANY(", 4
170b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
170c0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
170d0 74 78 74 2c 20 7a 2c 20 2d 31 29 3b 0a 20 20 20  txt, z, -1);.   
170e0 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
170f0 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22  umAppend(&txt, "
17100 29 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  )", 1);.    }.  
17110 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66  }..  j = i;.  if
17120 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
17130 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  &WHERE_BTM_LIMIT
17140 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20   ){.    char *z 
17150 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 4b  = (j==pIndex->nK
17160 65 79 43 6f 6c 20 29 20 3f 20 22 72 6f 77 69 64  eyCol ) ? "rowid
17170 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d  " : aCol[aiColum
17180 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  n[j]].zName;.   
17190 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
171a0 72 6d 28 26 74 78 74 2c 20 69 2b 2b 2c 20 7a 2c  rm(&txt, i++, z,
171b0 20 22 3e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28   ">");.  }.  if(
171c0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26   pLoop->wsFlags&
171d0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
171e0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
171f0 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65   (j==pIndex->nKe
17200 79 43 6f 6c 20 29 20 3f 20 22 72 6f 77 69 64 22  yCol ) ? "rowid"
17210 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e   : aCol[aiColumn
17220 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  [j]].zName;.    
17230 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72  explainAppendTer
17240 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20 22 3c  m(&txt, i, z, "<
17250 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ");.  }.  sqlite
17260 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
17270 26 74 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20  &txt, ")", 1);. 
17280 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
17290 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 74  trAccumFinish(&t
172a0 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  xt);.}../*.** Th
172b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
172c0 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75   no-op unless cu
172d0 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69  rrently processi
172e0 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55  ng an EXPLAIN QU
172f0 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d  ERY PLAN.** comm
17300 61 6e 64 2e 20 49 66 20 74 68 65 20 71 75 65 72  and. If the quer
17310 79 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c 65 64  y being compiled
17320 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 51   is an EXPLAIN Q
17330 55 45 52 59 20 50 4c 41 4e 2c 20 61 20 73 69 6e  UERY PLAN, a sin
17340 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 73  gle.** record is
17350 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6f 75   added to the ou
17360 74 70 75 74 20 74 6f 20 64 65 73 63 72 69 62 65  tput to describe
17370 20 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20   the table scan 
17380 73 74 72 61 74 65 67 79 20 69 6e 20 0a 2a 2a 20  strategy in .** 
17390 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  pLevel..*/.stati
173a0 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e  c void explainOn
173b0 65 53 63 61 6e 28 0a 20 20 50 61 72 73 65 20 2a  eScan(.  Parse *
173c0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
173d0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
173e0 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  e context */.  S
173f0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
17400 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
17410 2a 20 54 61 62 6c 65 20 6c 69 73 74 20 74 68 69  * Table list thi
17420 73 20 6c 6f 6f 70 20 72 65 66 65 72 73 20 74 6f  s loop refers to
17430 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
17440 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20 20 20   *pLevel,       
17450 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 74 6f        /* Scan to
17460 20 77 72 69 74 65 20 4f 50 5f 45 78 70 6c 61 69   write OP_Explai
17470 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a 2f 0a  n opcode for */.
17480 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20    int iLevel,   
17490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174a0 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22    /* Value for "
174b0 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66  level" column of
174c0 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74   output */.  int
174d0 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
174e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
174f0 56 61 6c 75 65 20 66 6f 72 20 22 66 72 6f 6d 22  Value for "from"
17500 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75   column of outpu
17510 74 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  t */.  u16 wctrl
17520 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
17530 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
17540 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
17550 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
17560 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
17570 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
17580 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
17590 32 20 29 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  2 ).#endif.  {. 
175a0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
175b0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
175c0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
175d0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
175e0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
175f0 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
17600 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74  * VM being const
17610 72 75 63 74 65 64 20 2a 2f 0a 20 20 20 20 73 71  ructed */.    sq
17620 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
17630 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44  se->db;     /* D
17640 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
17650 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  /.    char *zMsg
17660 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17670 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61      /* Text to a
17680 64 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74  dd to EQP output
17690 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 20   */.    int iId 
176a0 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  = pParse->iSelec
176b0 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20  tId;  /* Select 
176c0 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75  id (left-most ou
176d0 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a  tput column) */.
176e0 20 20 20 20 69 6e 74 20 69 73 53 65 61 72 63 68      int isSearch
176f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17700 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
17710 53 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66 6f  SEARCH. False fo
17720 72 20 53 43 41 4e 2e 20 2a 2f 0a 20 20 20 20 57  r SCAN. */.    W
17730 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
17740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17750 54 68 65 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  The controlling 
17760 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
17770 20 2a 2f 0a 20 20 20 20 75 33 32 20 66 6c 61 67   */.    u32 flag
17780 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
17790 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
177a0 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68 69  hat describe thi
177b0 73 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 70  s loop */..    p
177c0 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
177d0 57 4c 6f 6f 70 3b 0a 20 20 20 20 66 6c 61 67 73  WLoop;.    flags
177e0 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67   = pLoop->wsFlag
177f0 73 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67  s;.    if( (flag
17800 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  s&WHERE_MULTI_OR
17810 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73  ) || (wctrlFlags
17820 26 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f  &WHERE_ONETABLE_
17830 4f 4e 4c 59 29 20 29 20 72 65 74 75 72 6e 3b 0a  ONLY) ) return;.
17840 0a 20 20 20 20 69 73 53 65 61 72 63 68 20 3d 20  .    isSearch = 
17850 28 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54  (flags&(WHERE_BT
17860 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f  M_LIMIT|WHERE_TO
17870 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20  P_LIMIT))!=0.   
17880 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c           || ((fl
17890 61 67 73 26 57 48 45 52 45 5f 56 49 52 54 55 41  ags&WHERE_VIRTUA
178a0 4c 54 41 42 4c 45 29 3d 3d 30 20 26 26 20 28 70  LTABLE)==0 && (p
178b0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
178c0 71 3e 30 29 29 0a 20 20 20 20 20 20 20 20 20 20  q>0)).          
178d0 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73    || (wctrlFlags
178e0 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  &(WHERE_ORDERBY_
178f0 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42  MIN|WHERE_ORDERB
17900 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a 4d  Y_MAX));..    zM
17910 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
17920 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 69 73  ntf(db, "%s", is
17930 53 65 61 72 63 68 3f 22 53 45 41 52 43 48 22 3a  Search?"SEARCH":
17940 22 53 43 41 4e 22 29 3b 0a 20 20 20 20 69 66 28  "SCAN");.    if(
17950 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
17960 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
17970 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
17980 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53 55  db, zMsg, "%s SU
17990 42 51 55 45 52 59 20 25 64 22 2c 20 7a 4d 73 67  BQUERY %d", zMsg
179a0 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  ,pItem->iSelectI
179b0 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
179c0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
179d0 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
179e0 7a 4d 73 67 2c 20 22 25 73 20 54 41 42 4c 45 20  zMsg, "%s TABLE 
179f0 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d  %s", zMsg, pItem
17a00 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
17a10 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
17a20 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
17a30 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
17a40 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
17a50 20 22 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73   "%s AS %s", zMs
17a60 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  g, pItem->zAlias
17a70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
17a80 20 28 66 6c 61 67 73 20 26 20 28 57 48 45 52 45   (flags & (WHERE
17a90 5f 49 50 4b 7c 57 48 45 52 45 5f 56 49 52 54 55  _IPK|WHERE_VIRTU
17aa0 41 4c 54 41 42 4c 45 29 29 3d 3d 30 0a 20 20 20  ALTABLE))==0.   
17ab0 20 20 26 26 20 41 4c 57 41 59 53 28 70 4c 6f 6f    && ALWAYS(pLoo
17ac0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
17ad0 78 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  x!=0).    ){.   
17ae0 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20     char *zWhere 
17af0 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61  = explainIndexRa
17b00 6e 67 65 28 64 62 2c 20 70 4c 6f 6f 70 2c 20 70  nge(db, pLoop, p
17b10 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
17b20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
17b30 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
17b40 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  sg,.            
17b50 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45     ((flags & WHE
17b60 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 3f  RE_AUTO_INDEX) ?
17b70 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
17b80 20 20 20 20 20 22 25 73 20 55 53 49 4e 47 20 41       "%s USING A
17b90 55 54 4f 4d 41 54 49 43 20 25 73 49 4e 44 45 58  UTOMATIC %sINDEX
17ba0 25 2e 30 73 25 73 22 20 3a 0a 20 20 20 20 20 20  %.0s%s" :.      
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73               "%s
17bc0 20 55 53 49 4e 47 20 25 73 49 4e 44 45 58 20 25   USING %sINDEX %
17bd0 73 25 73 22 29 2c 20 0a 20 20 20 20 20 20 20 20  s%s"), .        
17be0 20 20 20 20 20 20 20 7a 4d 73 67 2c 20 28 28 66         zMsg, ((f
17bf0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
17c00 5f 4f 4e 4c 59 29 20 3f 20 22 43 4f 56 45 52 49  _ONLY) ? "COVERI
17c10 4e 47 20 22 20 3a 20 22 22 29 2c 0a 20 20 20 20  NG " : ""),.    
17c20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
17c30 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
17c40 2d 3e 7a 4e 61 6d 65 2c 20 7a 57 68 65 72 65 29  ->zName, zWhere)
17c50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
17c60 62 46 72 65 65 28 64 62 2c 20 7a 57 68 65 72 65  bFree(db, zWhere
17c70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
17c80 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f   (flags & WHERE_
17c90 49 50 4b 29 21 3d 30 20 26 26 20 28 66 6c 61 67  IPK)!=0 && (flag
17ca0 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52  s & WHERE_CONSTR
17cb0 41 49 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  AINT)!=0 ){.    
17cc0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
17cd0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
17ce0 67 2c 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54  g, "%s USING INT
17cf0 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
17d00 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20  ", zMsg);..     
17d10 20 69 66 28 20 66 6c 61 67 73 26 28 57 48 45 52   if( flags&(WHER
17d20 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
17d30 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a  E_COLUMN_IN) ){.
17d40 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
17d50 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
17d60 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f  b, zMsg, "%s (ro
17d70 77 69 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a  wid=?)", zMsg);.
17d80 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
17d90 28 66 6c 61 67 73 26 57 48 45 52 45 5f 42 4f 54  (flags&WHERE_BOT
17da0 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f  H_LIMIT)==WHERE_
17db0 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  BOTH_LIMIT ){.  
17dc0 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
17dd0 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
17de0 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
17df0 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29  d>? AND rowid<?)
17e00 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
17e10 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26  }else if( flags&
17e20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
17e30 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
17e40 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
17e50 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
17e60 28 72 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67  (rowid>?)", zMsg
17e70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
17e80 66 28 20 41 4c 57 41 59 53 28 66 6c 61 67 73 26  f( ALWAYS(flags&
17e90 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
17ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
17eb0 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
17ec0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
17ed0 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73   (rowid<?)", zMs
17ee0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
17ef0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
17f00 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
17f10 4c 45 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  LE.    else if( 
17f20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  (flags & WHERE_V
17f30 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
17f40 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
17f50 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
17f60 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49  db, zMsg, "%s VI
17f70 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45  RTUAL TABLE INDE
17f80 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a  X %d:%s", zMsg,.
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fa0 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
17fb0 69 64 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75  idxNum, pLoop->u
17fc0 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20  .vtab.idxStr);. 
17fd0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
17fe0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
17ff0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
18000 20 22 25 73 22 2c 20 7a 4d 73 67 29 3b 0a 20 20   "%s", zMsg);.  
18010 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18020 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
18030 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20  n, iId, iLevel, 
18040 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f  iFrom, zMsg, P4_
18050 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
18060 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65  #else.# define e
18070 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c  xplainOneScan(u,
18080 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  v,w,x,y,z).#endi
18090 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
180a0 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a  _EXPLAIN */.../*
180b0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
180c0 65 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  e for the start 
180d0 6f 66 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68  of the iLevel-th
180e0 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45   loop in the WHE
180f0 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70  RE clause.** imp
18100 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63  lementation desc
18110 72 69 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e  ribed by pWInfo.
18120 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
18130 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74  sk codeOneLoopSt
18140 61 72 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  art(.  WhereInfo
18150 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43   *pWInfo,   /* C
18160 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74  omplete informat
18170 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48  ion about the WH
18180 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
18190 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
181a0 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65       /* Which le
181b0 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61  vel of pWInfo->a
181c0 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64  [] should be cod
181d0 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ed */.  Bitmask 
181e0 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20  notReady     /* 
181f0 57 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65  Which tables are
18200 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c   currently avail
18210 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  able */.){.  int
18220 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
18230 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
18240 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  rs */.  int iCur
18250 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18260 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
18270 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
18280 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20  .  int addrNxt; 
18290 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
182a0 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74   to jump to cont
182b0 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
182c0 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20  xt IN case */.  
182d0 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20  int omitTable;  
182e0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
182f0 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78  we use the index
18300 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62   only */.  int b
18310 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rev;            
18320 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65  /* True if we ne
18330 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65  ed to scan in re
18340 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20  verse order */. 
18350 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
18360 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65  vel;  /* The whe
18370 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63  re level to be c
18380 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oded */.  WhereL
18390 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f  oop *pLoop;    /
183a0 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
183b0 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 63 6f 64  object being cod
183c0 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ed */.  WhereCla
183d0 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20  use *pWC;    /* 
183e0 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66  Decomposition of
183f0 20 74 68 65 20 65 6e 74 69 72 65 20 57 48 45 52   the entire WHER
18400 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
18410 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
18420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18430 20 41 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   A WHERE clause 
18440 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20  term */.  Parse 
18450 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
18460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
18470 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
18480 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
18490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184a0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
184b0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  nnection */.  Vd
184c0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
184d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
184e0 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
184f0 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  mt under constru
18500 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75  ctions */.  stru
18510 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
18520 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46  *pTabItem;  /* F
18530 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
18540 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
18550 20 69 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20   int addrBrk;   
18560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18570 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
18580 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
18590 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  e loop */.  int 
185a0 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20  addrCont;       
185b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
185c0 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74  ump here to cont
185d0 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 63  inue with next c
185e0 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  ycle */.  int iR
185f0 6f 77 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20  owidReg = 0;    
18600 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20      /* Rowid is 
18610 73 74 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72  stored in this r
18620 65 67 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20  egister, if not 
18630 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52  zero */.  int iR
18640 65 6c 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20  eleaseReg = 0;  
18650 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69      /* Temp regi
18660 73 74 65 72 20 74 6f 20 66 72 65 65 20 62 65 66  ster to free bef
18670 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f  ore returning */
18680 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ..  pParse = pWI
18690 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76  nfo->pParse;.  v
186a0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
186b0 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66  ;.  pWC = &pWInf
186c0 6f 2d 3e 73 57 43 3b 0a 20 20 64 62 20 3d 20 70  o->sWC;.  db = p
186d0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4c 65  Parse->db;.  pLe
186e0 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
186f0 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f  [iLevel];.  pLoo
18700 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
18710 6f 70 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d  op;.  pTabItem =
18720 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69   &pWInfo->pTabLi
18730 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
18740 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70  rom];.  iCur = p
18750 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
18760 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  ;.  pLevel->notR
18770 65 61 64 79 20 3d 20 6e 6f 74 52 65 61 64 79 20  eady = notReady 
18780 26 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e  & ~getMask(&pWIn
18790 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43  fo->sMaskSet, iC
187a0 75 72 29 3b 0a 20 20 62 52 65 76 20 3d 20 28 70  ur);.  bRev = (p
187b0 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 3e 3e  WInfo->revMask>>
187c0 69 4c 65 76 65 6c 29 26 31 3b 0a 20 20 6f 6d 69  iLevel)&1;.  omi
187d0 74 54 61 62 6c 65 20 3d 20 28 70 4c 6f 6f 70 2d  tTable = (pLoop-
187e0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
187f0 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20  _IDX_ONLY)!=0 . 
18800 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57            && (pW
18810 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
18820 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54   & WHERE_FORCE_T
18830 41 42 4c 45 29 3d 3d 30 3b 0a 20 20 56 64 62 65  ABLE)==0;.  Vdbe
18840 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
18850 22 42 65 67 69 6e 20 57 48 45 52 45 2d 6c 6f 6f  "Begin WHERE-loo
18860 70 25 64 3a 20 25 73 22 2c 69 4c 65 76 65 6c 2c  p%d: %s",iLevel,
18870 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
18880 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 43  zName));..  /* C
18890 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72  reate labels for
188a0 20 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64   the "break" and
188b0 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74   "continue" inst
188c0 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f  ructions.  ** fo
188d0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  r the current lo
188e0 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64 64  op.  Jump to add
188f0 72 42 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75  rBrk to break ou
18900 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a  t of a loop..  *
18910 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74  * Jump to cont t
18920 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79  o go immediately
18930 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65   to the next ite
18940 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  ration of the.  
18950 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20  ** loop..  **.  
18960 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69 73  ** When there is
18970 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c   an IN operator,
18980 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61 20   we also have a 
18990 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 20  "addrNxt" label 
189a0 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20  that.  ** means 
189b0 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
189c0 20 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61 6c   the next IN val
189d0 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20  ue combination. 
189e0 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65   When.  ** there
189f0 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61   are no IN opera
18a00 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e 73  tors in the cons
18a10 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22 61 64  traints, the "ad
18a20 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a  drNxt" label.  *
18a30 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  * is the same as
18a40 20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f   "addrBrk"..  */
18a50 0a 20 20 61 64 64 72 42 72 6b 20 3d 20 70 4c 65  .  addrBrk = pLe
18a60 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70  vel->addrBrk = p
18a70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d  Level->addrNxt =
18a80 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
18a90 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64 72  Label(v);.  addr
18aa0 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  Cont = pLevel->a
18ab0 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65  ddrCont = sqlite
18ac0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
18ad0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
18ae0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61   is the right ta
18af0 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  ble of a LEFT OU
18b00 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61  TER JOIN, alloca
18b10 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74  te and.  ** init
18b20 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20  ialize a memory 
18b30 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64  cell that record
18b40 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20  s if this table 
18b50 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a  matches any.  **
18b60 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74   row of the left
18b70 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
18b80 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  in..  */.  if( p
18b90 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26  Level->iFrom>0 &
18ba0 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a  & (pTabItem[0].j
18bb0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
18bc0 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65  T)!=0 ){.    pLe
18bd0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d  vel->iLeftJoin =
18be0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
18bf0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18c00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
18c10 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  eger, 0, pLevel-
18c20 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
18c30 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
18c40 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e   "init LEFT JOIN
18c50 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22 29   no-match flag")
18c60 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65  );.  }..  /* Spe
18c70 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 46  cial case of a F
18c80 52 4f 4d 20 63 6c 61 75 73 65 20 73 75 62 71 75  ROM clause subqu
18c90 65 72 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  ery implemented 
18ca0 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  as a co-routine 
18cb0 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 49 74 65  */.  if( pTabIte
18cc0 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  m->viaCoroutine 
18cd0 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59 69  ){.    int regYi
18ce0 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  eld = pTabItem->
18cf0 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 73  regReturn;.    s
18d00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18d10 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
18d20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46 69  pTabItem->addrFi
18d30 6c 6c 53 75 62 2d 31 2c 20 72 65 67 59 69 65 6c  llSub-1, regYiel
18d40 64 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  d);.    pLevel->
18d50 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64 62  p2 =  sqlite3Vdb
18d60 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
18d70 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a  eld, regYield);.
18d80 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
18d90 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66  (v, "next row of
18da0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 25 73 22 2c   co-routine %s",
18db0 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d   pTabItem->pTab-
18dc0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73 71  >zName));.    sq
18dd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18de0 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 59 69 65  v, OP_If, regYie
18df0 6c 64 2b 31 2c 20 61 64 64 72 42 72 6b 29 3b 0a  ld+1, addrBrk);.
18e00 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
18e10 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73   OP_Goto;.  }els
18e20 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e..#ifndef SQLIT
18e30 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
18e40 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 6f 6f  BLE.  if(  (pLoo
18e50 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
18e60 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
18e70 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  !=0 ){.    /* Ca
18e80 73 65 20 31 3a 20 20 54 68 65 20 74 61 62 6c 65  se 1:  The table
18e90 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61   is a virtual-ta
18ea0 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56 46  ble.  Use the VF
18eb0 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a  ilter and VNext.
18ec0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
18ed0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
18ee0 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ta..    */.    i
18ef0 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33  nt iReg;   /* P3
18f00 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46   Value for OP_VF
18f10 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ilter */.    int
18f20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20   addrNotFound;. 
18f30 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69     int nConstrai
18f40 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  nt = pLoop->nLTe
18f50 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  rm;..    sqlite3
18f60 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
18f70 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67 20  arse);.    iReg 
18f80 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
18f90 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
18fa0 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20  onstraint+2);.  
18fb0 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d    addrNotFound =
18fc0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
18fd0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
18fe0 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b  <nConstraint; j+
18ff0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54  +){.      int iT
19000 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a 2b 32  arget = iReg+j+2
19010 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
19020 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
19030 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
19040 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  m==0 ) continue;
19050 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
19060 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
19070 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  _IN ){.        c
19080 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
19090 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
190a0 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20  Level, j, bRev, 
190b0 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20  iTarget);.      
190c0 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d    addrNotFound =
190d0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
190e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
190f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
19100 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
19110 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
19120 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  ght, iTarget);. 
19130 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
19140 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19150 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
19160 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  , pLoop->u.vtab.
19170 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20  idxNum, iReg);. 
19180 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19190 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
191a0 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c  er, nConstraint,
191b0 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71   iReg+1);.    sq
191c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
191d0 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69  v, OP_VFilter, i
191e0 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e  Cur, addrNotFoun
191f0 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20 20 20  d, iReg,.       
19200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19210 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
19220 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Str,.           
19230 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
19240 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
19250 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a  e ? P4_MPRINTF :
19260 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
19270 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e   pLoop->u.vtab.n
19280 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  eedFree = 0;.   
19290 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e   for(j=0; j<nCon
192a0 73 74 72 61 69 6e 74 20 26 26 20 6a 3c 31 36 3b  straint && j<16;
192b0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
192c0 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e   (pLoop->u.vtab.
192d0 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26 31 20 29  omitMask>>j)&1 )
192e0 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c  {.        disabl
192f0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4c  eTerm(pLevel, pL
19300 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 29 3b  oop->aLTerm[j]);
19310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19320 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
19330 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c  OP_VNext;.    pL
19340 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
19350 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
19360 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
19370 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
19380 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
19390 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
193a0 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69   iReg, nConstrai
193b0 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  nt+2);.    sqlit
193c0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
193d0 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65 6c  Parse, 1);.  }el
193e0 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
193f0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
19400 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20  TABLE */..  if( 
19410 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
19420 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a  & WHERE_IPK)!=0.
19430 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
19440 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43  Flags & (WHERE_C
19450 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43  OLUMN_IN|WHERE_C
19460 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20 20  OLUMN_EQ))!=0.  
19470 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32  ){.    /* Case 2
19480 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74  :  We can direct
19490 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73  ly reference a s
194a0 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20  ingle row using 
194b0 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  an.    **       
194c0 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70     equality comp
194d0 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
194e0 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20  he ROWID field. 
194f0 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   Or.    **      
19500 20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63 65      we reference
19510 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75   multiple rows u
19520 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e  sing a "rowid IN
19530 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20   (...)".    **  
19540 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63          construc
19550 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
19560 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62  sert( pLoop->u.b
19570 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20  tree.nEq==1 );. 
19580 20 20 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d     iReleaseReg =
19590 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
195a0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
195b0 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61  pTerm = pLoop->a
195c0 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73  LTerm[0];.    as
195d0 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
195e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
195f0 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b  erm->pExpr!=0 );
19600 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69  .    assert( omi
19610 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  tTable==0 );.   
19620 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
19630 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
19640 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
19650 69 52 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65  iRowidReg = code
19660 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
19670 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
19680 65 6c 2c 20 30 2c 20 62 52 65 76 2c 20 69 52 65  el, 0, bRev, iRe
19690 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20 61  leaseReg);.    a
196a0 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d  ddrNxt = pLevel-
196b0 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71  >addrNxt;.    sq
196c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
196d0 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
196e0 20 69 52 6f 77 69 64 52 65 67 2c 20 61 64 64 72   iRowidReg, addr
196f0 4e 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Nxt);.    sqlite
19700 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
19710 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75  P_NotExists, iCu
19720 72 2c 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77  r, addrNxt, iRow
19730 69 64 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69  idReg);.    sqli
19740 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
19750 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
19760 65 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 31 29  e, iRowidReg, 1)
19770 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
19780 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
19790 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
197a0 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64  owidReg);.    Vd
197b0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70  beComment((v, "p
197c0 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  k"));.    pLevel
197d0 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
197e0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 6f    }else if( (pLo
197f0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
19800 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 20  ERE_IPK)!=0.    
19810 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e       && (pLoop->
19820 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
19830 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29 21 3d 30  COLUMN_RANGE)!=0
19840 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  .  ){.    /* Cas
19850 65 20 33 3a 20 20 57 65 20 68 61 76 65 20 61 6e  e 3:  We have an
19860 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70   inequality comp
19870 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
19880 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a  he ROWID field..
19890 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74      */.    int t
198a0 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  estOp = OP_Noop;
198b0 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a  .    int start;.
198c0 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61      int memEndVa
198d0 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65  lue = 0;.    Whe
198e0 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20  reTerm *pStart, 
198f0 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65  *pEnd;..    asse
19900 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
19910 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20   );.    j = 0;. 
19920 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64     pStart = pEnd
19930 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c   = 0;.    if( pL
19940 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
19950 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
19960 20 70 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d   pStart = pLoop-
19970 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
19980 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
19990 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
199a0 5f 4c 49 4d 49 54 20 29 20 70 45 6e 64 20 3d 20  _LIMIT ) pEnd = 
199b0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b  pLoop->aLTerm[j+
199c0 2b 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +];.    assert( 
199d0 70 53 74 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e  pStart!=0 || pEn
199e0 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  d!=0 );.    if( 
199f0 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54  bRev ){.      pT
19a00 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20  erm = pStart;.  
19a10 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e      pStart = pEn
19a20 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  d;.      pEnd = 
19a30 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  pTerm;.    }.   
19a40 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
19a50 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
19a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19a70 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
19a80 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 74  t defines the st
19a90 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  art bound */.   
19aa0 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70     int r1, rTemp
19ab0 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  ;        /* Regi
19ac0 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e  sters for holdin
19ad0 67 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e  g the start boun
19ae0 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  dary */..      /
19af0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
19b00 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b  constant maps TK
19b10 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63  _xx codes into c
19b20 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20  orresponding .  
19b30 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f      ** seek opco
19b40 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73  des.  It depends
19b50 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
19b60 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f   ordering of TK_
19b70 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  xx.      */.    
19b80 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65    const u8 aMove
19b90 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  Op[] = {.       
19ba0 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20      /* TK_GT */ 
19bb0 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20   OP_SeekGt,.    
19bc0 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20         /* TK_LE 
19bd0 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20  */  OP_SeekLe,. 
19be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
19bf0 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74  LT */  OP_SeekLt
19c00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
19c10 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_GE */  OP_See
19c20 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  kGe.      };.   
19c30 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
19c40 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20  ==TK_GT+1 );    
19c50 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
19c60 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f  he ordering.. */
19c70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
19c80 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
19c90 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66        /*  ... of
19ca0 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65   the TK_xx value
19cb0 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  s... */.      as
19cc0 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f  sert( TK_GE==TK_
19cd0 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+3 );      /* 
19ce0 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74   ... is correcct
19cf0 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65  . */..      asse
19d00 72 74 28 20 28 70 53 74 61 72 74 2d 3e 77 74 46  rt( (pStart->wtF
19d10 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
19d20 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  L)==0 );.      t
19d30 65 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d  estcase( pStart-
19d40 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
19d50 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
19d60 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45   pX = pStart->pE
19d70 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
19d80 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20  t( pX!=0 );.    
19d90 20 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61    testcase( pSta
19da0 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rt->leftCursor!=
19db0 69 43 75 72 20 29 3b 20 2f 2a 20 74 72 61 6e 73  iCur ); /* trans
19dc0 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74  itive constraint
19dd0 73 20 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20  s */.      r1 = 
19de0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
19df0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  emp(pParse, pX->
19e00 70 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b  pRight, &rTemp);
19e10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19e20 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76  beAddOp3(v, aMov
19e30 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54  eOp[pX->op-TK_GT
19e40 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  ], iCur, addrBrk
19e50 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
19e60 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b  eComment((v, "pk
19e70 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
19e80 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
19e90 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
19ea0 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
19eb0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
19ec0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 54  mpReg(pParse, rT
19ed0 65 6d 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61  emp);.      disa
19ee0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
19ef0 70 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c  pStart);.    }el
19f00 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
19f10 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62  3VdbeAddOp2(v, b
19f20 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
19f30 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c  OP_Rewind, iCur,
19f40 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d   addrBrk);.    }
19f50 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b  .    if( pEnd ){
19f60 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
19f70 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64  .      pX = pEnd
19f80 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
19f90 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a  ssert( pX!=0 );.
19fa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
19fb0 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
19fc0 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b  ERM_VNULL)==0 );
19fd0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19fe0 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f   pEnd->leftCurso
19ff0 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54 72  r!=iCur ); /* Tr
1a000 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61  ansitive constra
1a010 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65  ints */.      te
1a020 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74  stcase( pEnd->wt
1a030 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1a040 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65  TUAL );.      me
1a050 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50  mEndValue = ++pP
1a060 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1a070 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1a080 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  e(pParse, pX->pR
1a090 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75  ight, memEndValu
1a0a0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  e);.      if( pX
1a0b0 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70  ->op==TK_LT || p
1a0c0 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a  X->op==TK_GT ){.
1a0d0 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
1a0e0 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20   bRev ? OP_Le : 
1a0f0 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c  OP_Ge;.      }el
1a100 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
1a110 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c  Op = bRev ? OP_L
1a120 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20  t : OP_Gt;.     
1a130 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65   }.      disable
1a140 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e  Term(pLevel, pEn
1a150 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  d);.    }.    st
1a160 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
1a170 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1a180 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1a190 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
1a1a0 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
1a1b0 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
1a1c0 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
1a1d0 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61  2 = start;.    a
1a1e0 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70  ssert( pLevel->p
1a1f0 35 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  5==0 );.    if( 
1a200 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  testOp!=OP_Noop 
1a210 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52  ){.      iRowidR
1a220 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67  eg = iReleaseReg
1a230 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1a240 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
1a250 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a260 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
1a270 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52  d, iCur, iRowidR
1a280 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
1a290 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
1a2a0 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d  (pParse, iCur, -
1a2b0 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  1, iRowidReg);. 
1a2c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a2d0 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70  AddOp3(v, testOp
1a2e0 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61  , memEndValue, a
1a2f0 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65  ddrBrk, iRowidRe
1a300 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1a310 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1a320 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
1a330 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d  RIC | SQLITE_JUM
1a340 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a  PIFNULL);.    }.
1a350 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f    }else if( pLoo
1a360 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1a370 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20  RE_INDEXED ){.  
1a380 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 41 20 73    /* Case 4: A s
1a390 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64  can using an ind
1a3a0 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ex..    **.    *
1a3b0 2a 20 20 20 20 20 20 20 20 20 54 68 65 20 57 48  *         The WH
1a3c0 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63  ERE clause may c
1a3d0 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d  ontain zero or m
1a3e0 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20  ore equality .  
1a3f0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72    **         ter
1a400 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22  ms ("==" or "IN"
1a410 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68 61 74   operators) that
1a420 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a   refer to the N.
1a430 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c      **         l
1a440 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73  eft-most columns
1a450 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49   of the index. I
1a460 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61  t may also conta
1a470 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  in.    **       
1a480 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e    inequality con
1a490 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20  straints (>, <, 
1a4a0 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65  >= or <=) on the
1a4b0 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a 20   indexed.    ** 
1a4c0 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74          column t
1a4d0 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  hat immediately 
1a4e0 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65 71  follows the N eq
1a4f0 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a  ualities. Only .
1a500 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
1a510 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f  he right-most co
1a520 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69  lumn can be an i
1a530 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20  nequality - the 
1a540 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a  rest must.    **
1a550 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68 65           use the
1a560 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f   "==" and "IN" o
1a570 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78  perators. For ex
1a580 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20  ample, if the . 
1a590 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e     **         in
1a5a0 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a  dex is on (x,y,z
1a5b0 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c  ), then the foll
1a5c0 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20 61 72  owing clauses ar
1a5d0 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20  e all .    **   
1a5e0 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a        optimized:
1a5f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1a600 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a 20 20            x=5.  
1a610 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1a620 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20 20 20  x=5 AND y=10.   
1a630 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
1a640 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20  =5 AND y<10.    
1a650 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
1a660 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c  5 AND y>5 AND y<
1a670 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
1a680 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35       x=5 AND y=5
1a690 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a   AND z<=10.    *
1a6a0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1a6b0 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f   The z<10 term o
1a6c0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1a6d0 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20  cannot be used, 
1a6e0 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 20  only.    **     
1a6f0 20 20 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d      the x=5 term
1a700 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1a710 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1a720 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20  ND z<10.    **. 
1a730 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20     **         N 
1a740 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74  may be zero if t
1a750 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c  here are inequal
1a760 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ity constraints.
1a770 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1a780 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
1a790 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1a7a0 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69  raints, then N i
1a7b0 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  s at.    **     
1a7c0 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20      least one.. 
1a7d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1a7e0 20 20 20 20 20 54 68 69 73 20 63 61 73 65 20 69       This case i
1a7f0 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e  s also used when
1a800 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48   there are no WH
1a810 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 2a  ERE clause.    *
1a820 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72  *         constr
1a830 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64  aints but an ind
1a840 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20 61  ex is selected a
1a850 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a  nyway, in order.
1a860 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
1a870 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70  o force the outp
1a880 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66  ut order to conf
1a890 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20  orm to an ORDER 
1a8a0 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20  BY..    */  .   
1a8b0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
1a8c0 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a   aStartOp[] = {.
1a8d0 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30        0,.      0
1a8e0 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e  ,.      OP_Rewin
1a8f0 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
1a900 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74  2: (!start_const
1a910 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45  raints && startE
1a920 71 20 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a  q &&  !bRev) */.
1a930 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20        OP_Last,  
1a940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a             /* 3:
1a950 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61   (!start_constra
1a960 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20  ints && startEq 
1a970 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20  &&   bRev) */.  
1a980 20 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20      OP_SeekGt,  
1a990 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28           /* 4: (
1a9a0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1a9b0 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26  s  && !startEq &
1a9c0 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  & !bRev) */.    
1a9d0 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20    OP_SeekLt,    
1a9e0 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74         /* 5: (st
1a9f0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1aa00 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20   && !startEq && 
1aa10 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20   bRev) */.      
1aa20 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20 20 20 20  OP_SeekGe,      
1aa30 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72       /* 6: (star
1aa40 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
1aa50 26 20 20 73 74 61 72 74 45 71 20 26 26 20 21 62  &  startEq && !b
1aa60 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
1aa70 5f 53 65 65 6b 4c 65 20 20 20 20 20 20 20 20 20  _SeekLe         
1aa80 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f     /* 7: (start_
1aa90 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
1aaa0 20 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65   startEq &&  bRe
1aab0 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20  v) */.    };.   
1aac0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
1aad0 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20   aEndOp[] = {.  
1aae0 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20      OP_Noop,    
1aaf0 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 28           /* 0: (
1ab00 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  !end_constraints
1ab10 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64  ) */.      OP_Id
1ab20 78 47 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  xGE,            
1ab30 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 1: (end_const
1ab40 72 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 29  raints && !bRev)
1ab50 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78   */.      OP_Idx
1ab60 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  LT             /
1ab70 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72  * 2: (end_constr
1ab80 61 69 6e 74 73 20 26 26 20 62 52 65 76 29 20 2a  aints && bRev) *
1ab90 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 75 31 36  /.    };.    u16
1aba0 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e   nEq = pLoop->u.
1abb0 62 74 72 65 65 2e 6e 45 71 3b 20 20 20 20 20 2f  btree.nEq;     /
1abc0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  * Number of == o
1abd0 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r IN terms */.  
1abe0 20 20 69 6e 74 20 69 73 4d 69 6e 51 75 65 72 79    int isMinQuery
1abf0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
1ac00 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
1ac10 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c 45 43 54  optimized SELECT
1ac20 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20   min(x).. */.   
1ac30 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20   int regBase;   
1ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ac50 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20 68   Base register h
1ac60 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e  olding constrain
1ac70 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20  t values */.    
1ac80 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20 20  int r1;         
1ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1aca0 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 2a 2f  Temp register */
1acb0 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
1acc0 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b  pRangeStart = 0;
1acd0 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20    /* Inequality 
1ace0 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61  constraint at ra
1acf0 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20  nge start */.   
1ad00 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e   WhereTerm *pRan
1ad10 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a  geEnd = 0;    /*
1ad20 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   Inequality cons
1ad30 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20  traint at range 
1ad40 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  end */.    int s
1ad50 74 61 72 74 45 71 3b 20 20 20 20 20 20 20 20 20  tartEq;         
1ad60 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1ad70 69 66 20 72 61 6e 67 65 20 73 74 61 72 74 20 75  if range start u
1ad80 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d  ses ==, >= or <=
1ad90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45   */.    int endE
1ada0 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
1adb0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1adc0 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d  range end uses =
1add0 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20  =, >= or <= */. 
1ade0 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e     int start_con
1adf0 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20  straints;       
1ae00 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67  /* Start of rang
1ae10 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64  e is constrained
1ae20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e   */.    int nCon
1ae30 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20  straint;        
1ae40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ae50 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  f constraint ter
1ae60 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  ms */.    Index 
1ae70 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
1ae80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
1ae90 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75  dex we will be u
1aea0 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sing */.    int 
1aeb0 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20 20  iIdxCur;        
1aec0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1aed0 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
1aee0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
1aef0 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20 3d   int nExtraReg =
1af00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1af10 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
1af20 20 72 65 67 69 73 74 65 72 73 20 6e 65 65 64 65   registers neede
1af30 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b  d */.    int op;
1af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af50 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63        /* Instruc
1af60 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  tion opcode */. 
1af70 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72 74 41     char *zStartA
1af80 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
1af90 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20  /* Affinity for 
1afa0 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 63  start of range c
1afb0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
1afc0 20 63 68 61 72 20 63 45 6e 64 41 66 66 20 3d 20   char cEndAff = 
1afd0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
1afe0 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 65 6e   Affinity for en
1aff0 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74  d of range const
1b000 72 61 69 6e 74 20 2a 2f 0a 0a 20 20 20 20 70 49  raint */..    pI
1b010 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  dx = pLoop->u.bt
1b020 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
1b030 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
1b040 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 61  ->iIdxCur;.    a
1b050 73 73 65 72 74 28 20 6e 45 71 3e 3d 70 4c 6f 6f  ssert( nEq>=pLoo
1b060 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70  p->u.btree.nSkip
1b070 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   );..    /* If t
1b080 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69  his loop satisfi
1b090 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20  es a sort order 
1b0a0 28 70 4f 72 64 65 72 42 79 29 20 72 65 71 75 65  (pOrderBy) reque
1b0b0 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a 2a 20  st that .    ** 
1b0c0 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  was passed to th
1b0d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69  is function to i
1b0e0 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c 45  mplement a "SELE
1b0f0 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a  CT min(x) ..." .
1b100 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68      ** query, th
1b110 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  en the caller wi
1b120 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68  ll only allow th
1b130 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f  e loop to run fo
1b140 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c  r.    ** a singl
1b150 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69  e iteration. Thi
1b160 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
1b170 20 66 69 72 73 74 20 72 6f 77 20 72 65 74 75 72   first row retur
1b180 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c  ned.    ** shoul
1b190 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55 4c  d not have a NUL
1b1a0 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  L value stored i
1b1b0 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e  n 'x'. If column
1b1c0 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a 20 74   'x' is.    ** t
1b1d0 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61 66 74  he first one aft
1b1e0 65 72 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c  er the nEq equal
1b1f0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
1b200 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20  in the index,.  
1b210 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75 69 72    ** this requir
1b220 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c 20  es some special 
1b230 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f  handling..    */
1b240 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f  .    if( (pWInfo
1b250 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45  ->wctrlFlags&WHE
1b260 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21  RE_ORDERBY_MIN)!
1b270 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e  =0.     && (pWIn
1b280 66 6f 2d 3e 62 4f 42 53 61 74 21 3d 30 29 0a 20  fo->bOBSat!=0). 
1b290 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e 6e 4b      && (pIdx->nK
1b2a0 65 79 43 6f 6c 3e 6e 45 71 29 0a 20 20 20 20 29  eyCol>nEq).    )
1b2b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1b2c0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
1b2d0 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Skip==0 );.     
1b2e0 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31 3b   isMinQuery = 1;
1b2f0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
1b300 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
1b310 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65   /* Find any ine
1b320 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1b330 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65  nt terms for the
1b340 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a   start and end .
1b350 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61      ** of the ra
1b360 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nge. .    */.   
1b370 20 6a 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66   j = nEq;.    if
1b380 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1b390 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
1b3a0 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e  IT ){.      pRan
1b3b0 67 65 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d  geStart = pLoop-
1b3c0 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
1b3d0 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
1b3e0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
1b3f0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1b400 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
1b410 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67  T ){.      pRang
1b420 65 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  eEnd = pLoop->aL
1b430 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20  Term[j++];.     
1b440 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a   nExtraReg = 1;.
1b450 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
1b460 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
1b470 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73  valuate all cons
1b480 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69  traint terms usi
1b490 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20  ng == or IN.    
1b4a0 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
1b4b0 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65   values of those
1b4c0 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72   terms in an arr
1b4d0 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a  ay of registers.
1b4e0 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
1b4f0 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20  at regBase..    
1b500 2a 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d  */.    regBase =
1b510 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79   codeAllEquality
1b520 54 65 72 6d 73 28 70 50 61 72 73 65 2c 70 4c 65  Terms(pParse,pLe
1b530 76 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72 61 52  vel,bRev,nExtraR
1b540 65 67 2c 26 7a 53 74 61 72 74 41 66 66 29 3b 0a  eg,&zStartAff);.
1b550 20 20 20 20 61 73 73 65 72 74 28 20 7a 53 74 61      assert( zSta
1b560 72 74 41 66 66 3d 3d 30 20 7c 7c 20 73 71 6c 69  rtAff==0 || sqli
1b570 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 61  te3Strlen30(zSta
1b580 72 74 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20  rtAff)>=nEq );. 
1b590 20 20 20 69 66 28 20 7a 53 74 61 72 74 41 66 66     if( zStartAff
1b5a0 20 29 20 63 45 6e 64 41 66 66 20 3d 20 7a 53 74   ) cEndAff = zSt
1b5b0 61 72 74 41 66 66 5b 6e 45 71 5d 3b 0a 20 20 20  artAff[nEq];.   
1b5c0 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65   addrNxt = pLeve
1b5d0 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20  l->addrNxt;..   
1b5e0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
1b5f0 69 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72  ing a reverse or
1b600 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61  der scan on an a
1b610 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20  scending index, 
1b620 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77  or.    ** a forw
1b630 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f  ard order scan o
1b640 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69  n a descending i
1b650 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67  ndex, interchang
1b660 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74  e the .    ** st
1b670 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d  art and end term
1b680 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61  s (pRangeStart a
1b690 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20  nd pRangeEnd).. 
1b6a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e     */.    if( (n
1b6b0 45 71 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  Eq<pIdx->nKeyCol
1b6c0 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d   && bRev==(pIdx-
1b6d0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
1b6e0 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29  ==SQLITE_SO_ASC)
1b6f0 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76 20  ).     || (bRev 
1b700 26 26 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  && pIdx->nKeyCol
1b710 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  ==nEq).    ){.  
1b720 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65      SWAP(WhereTe
1b730 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c  rm *, pRangeEnd,
1b740 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20   pRangeStart);. 
1b750 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61     }..    testca
1b760 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  se( pRangeStart 
1b770 26 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d  && (pRangeStart-
1b780 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1b790 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  LE)!=0 );.    te
1b7a0 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
1b7b0 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74  art && (pRangeSt
1b7c0 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
1b7d0 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20   WO_GE)!=0 );.  
1b7e0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
1b7f0 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65  geEnd && (pRange
1b800 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
1b810 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20   WO_LE)!=0 );.  
1b820 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
1b830 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65  geEnd && (pRange
1b840 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
1b850 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20   WO_GE)!=0 );.  
1b860 20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52 61    startEq = !pRa
1b870 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e  ngeStart || pRan
1b880 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
1b890 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
1b8a0 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20  E);.    endEq = 
1b8b0 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20    !pRangeEnd || 
1b8c0 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
1b8d0 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f  ator & (WO_LE|WO
1b8e0 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f  _GE);.    start_
1b8f0 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52  constraints = pR
1b900 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71  angeStart || nEq
1b910 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  >0;..    /* Seek
1b920 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f   the index curso
1b930 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
1b940 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
1b950 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20      nConstraint 
1b960 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
1b970 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20  RangeStart ){.  
1b980 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
1b990 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e   = pRangeStart->
1b9a0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
1b9b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b9c0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
1b9d0 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
1b9e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52  );.      if( (pR
1b9f0 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61  angeStart->wtFla
1ba00 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
1ba10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
1ba20 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73  qlite3ExprCodeIs
1ba30 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67  NullJump(v, pRig
1ba40 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  ht, regBase+nEq,
1ba50 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20   addrNxt);.     
1ba60 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74   }.      if( zSt
1ba70 61 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20  artAff ){.      
1ba80 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d    if( sqlite3Com
1ba90 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69  pareAffinity(pRi
1baa0 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e  ght, zStartAff[n
1bab0 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46  Eq])==SQLITE_AFF
1bac0 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20  _NONE){.        
1bad0 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63    /* Since the c
1bae0 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20  omparison is to 
1baf0 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74  be performed wit
1bb00 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73  h no conversions
1bb10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70  .          ** ap
1bb20 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65  plied to the ope
1bb30 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61  rands, set the a
1bb40 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79  ffinity to apply
1bb50 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20   to pRight to . 
1bb60 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49           ** SQLI
1bb70 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f  TE_AFF_NONE.  */
1bb80 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72  .          zStar
1bb90 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49  tAff[nEq] = SQLI
1bba0 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
1bbb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1bbc0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65  f( sqlite3ExprNe
1bbd0 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
1bbe0 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61  nge(pRight, zSta
1bbf0 72 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20  rtAff[nEq]) ){. 
1bc00 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41           zStartA
1bc10 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
1bc20 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
1bc30 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20     }.      }  . 
1bc40 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
1bc50 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ++;.      testca
1bc60 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d  se( pRangeStart-
1bc70 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1bc80 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d  VIRTUAL );.    }
1bc90 65 6c 73 65 20 69 66 28 20 69 73 4d 69 6e 51 75  else if( isMinQu
1bca0 65 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ery ){.      sql
1bcb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1bcc0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
1bcd0 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
1bce0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
1bcf0 0a 20 20 20 20 20 20 73 74 61 72 74 45 71 20 3d  .      startEq =
1bd00 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f   0;.      start_
1bd10 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b  constraints = 1;
1bd20 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41  .    }.    codeA
1bd30 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61  pplyAffinity(pPa
1bd40 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  rse, regBase, nC
1bd50 6f 6e 73 74 72 61 69 6e 74 2c 20 7a 53 74 61 72  onstraint, zStar
1bd60 74 41 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20  tAff);.    op = 
1bd70 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f  aStartOp[(start_
1bd80 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20  constraints<<2) 
1bd90 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b  + (startEq<<1) +
1bda0 20 62 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65   bRev];.    asse
1bdb0 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20  rt( op!=0 );.   
1bdc0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1bdd0 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20  P_Rewind );.    
1bde0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
1bdf0 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20 74 65 73  _Last );.    tes
1be00 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
1be10 65 6b 47 74 20 29 3b 0a 20 20 20 20 74 65 73 74  ekGt );.    test
1be20 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
1be30 6b 47 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63  kGe );.    testc
1be40 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
1be50 4c 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  Le );.    testca
1be60 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  se( op==OP_SeekL
1be70 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t );.    sqlite3
1be80 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
1be90 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64   op, iIdxCur, ad
1bea0 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20  drNxt, regBase, 
1beb0 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 0a 20  nConstraint);.. 
1bec0 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76     /* Load the v
1bed0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65  alue for the ine
1bee0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1bef0 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
1bf00 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67   the.    ** rang
1bf10 65 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20  e (if any)..    
1bf20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  */.    nConstrai
1bf30 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66  nt = nEq;.    if
1bf40 28 20 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20  ( pRangeEnd ){. 
1bf50 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
1bf60 74 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70  t = pRangeEnd->p
1bf70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
1bf80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1bf90 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
1bfa0 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  e, regBase+nEq, 
1bfb0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1bfc0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1bfd0 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
1bfe0 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66  e+nEq);.      if
1bff0 28 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74  ( (pRangeEnd->wt
1c000 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
1c010 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LL)==0 ){.      
1c020 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1c030 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70  eIsNullJump(v, p
1c040 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e  Right, regBase+n
1c050 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  Eq, addrNxt);.  
1c060 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1c070 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1c080 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 63  finity(pRight, c
1c090 45 6e 64 41 66 66 29 21 3d 53 51 4c 49 54 45 5f  EndAff)!=SQLITE_
1c0a0 41 46 46 5f 4e 4f 4e 45 0a 20 20 20 20 20 20 20  AFF_NONE.       
1c0b0 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 4e  && !sqlite3ExprN
1c0c0 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
1c0d0 61 6e 67 65 28 70 52 69 67 68 74 2c 20 63 45 6e  ange(pRight, cEn
1c0e0 64 41 66 66 29 0a 20 20 20 20 20 20 29 7b 0a 20  dAff).      ){. 
1c0f0 20 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79         codeApply
1c100 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
1c110 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 2c   regBase+nEq, 1,
1c120 20 26 63 45 6e 64 41 66 66 29 3b 0a 20 20 20 20   &cEndAff);.    
1c130 20 20 7d 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74    }.      nConst
1c140 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74  raint++;.      t
1c150 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
1c160 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
1c170 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
1c180 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
1c190 62 46 72 65 65 28 64 62 2c 20 7a 53 74 61 72 74  bFree(db, zStart
1c1a0 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f  Aff);..    /* To
1c1b0 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f  p of the loop bo
1c1c0 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c  dy */.    pLevel
1c1d0 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
1c1e0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1c1f0 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
1c200 69 66 20 74 68 65 20 69 6e 64 65 78 20 63 75 72  if the index cur
1c210 73 6f 72 20 69 73 20 70 61 73 74 20 74 68 65 20  sor is past the 
1c220 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65  end of the range
1c230 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45  . */.    op = aE
1c240 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64 20  ndOp[(pRangeEnd 
1c250 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b 20 62  || nEq) * (1 + b
1c260 52 65 76 29 5d 3b 0a 20 20 20 20 74 65 73 74 63  Rev)];.    testc
1c270 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70  ase( op==OP_Noop
1c280 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1c290 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29  ( op==OP_IdxGE )
1c2a0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1c2b0 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a  op==OP_IdxLT );.
1c2c0 20 20 20 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e      if( op!=OP_N
1c2d0 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  oop ){.      sql
1c2e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
1c2f0 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  t(v, op, iIdxCur
1c300 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61  , addrNxt, regBa
1c310 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29  se, nConstraint)
1c320 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1c330 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 65  dbeChangeP5(v, e
1c340 6e 64 45 71 21 3d 62 52 65 76 20 3f 31 3a 30 29  ndEq!=bRev ?1:0)
1c350 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1c360 49 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 65  If there are ine
1c370 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1c380 6e 74 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20  nts, check that 
1c390 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  the value.    **
1c3a0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f   of the table co
1c3b0 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 69 6e  lumn that the in
1c3c0 65 71 75 61 6c 69 74 79 20 63 6f 6e 74 72 61 69  equality contrai
1c3d0 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a  ns is not NULL..
1c3e0 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c      ** If it is,
1c3f0 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78   jump to the nex
1c400 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
1c410 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  he loop..    */.
1c420 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1c430 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
1c440 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  e);.    testcase
1c450 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1c460 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
1c470 49 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IT );.    testca
1c480 73 65 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  se( pLoop->wsFla
1c490 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
1c4a0 49 4d 49 54 20 29 3b 0a 20 20 20 20 69 66 28 20  IMIT );.    if( 
1c4b0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1c4c0 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  & (WHERE_BTM_LIM
1c4d0 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  IT|WHERE_TOP_LIM
1c4e0 49 54 29 29 21 3d 30 20 0a 20 20 20 20 20 26 26  IT))!=0 .     &&
1c4f0 20 28 6a 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f   (j = pIdx->aiCo
1c500 6c 75 6d 6e 5b 6e 45 71 5d 29 3e 3d 30 20 0a 20  lumn[nEq])>=0 . 
1c510 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70 54 61      && pIdx->pTa
1c520 62 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74  ble->aCol[j].not
1c530 4e 75 6c 6c 3d 3d 30 20 0a 20 20 20 20 29 7b 0a  Null==0 .    ){.
1c540 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c550 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
1c560 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e  lumn, iIdxCur, n
1c570 45 71 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56  Eq, r1);.      V
1c580 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1c590 25 73 22 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c  %s", pIdx->pTabl
1c5a0 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  e->aCol[j].zName
1c5b0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
1c5c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1c5d0 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64  P_IsNull, r1, ad
1c5e0 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  drCont);.    }. 
1c5f0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1c600 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1c610 20 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65   r1);..    /* Se
1c620 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  ek the table cur
1c630 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65 64  sor, if required
1c640 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54   */.    disableT
1c650 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e  erm(pLevel, pRan
1c660 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69  geStart);.    di
1c670 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
1c680 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20  , pRangeEnd);.  
1c690 20 20 69 66 28 20 6f 6d 69 74 54 61 62 6c 65 20    if( omitTable 
1c6a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 49 64 78  ){.      /* pIdx
1c6b0 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69   is a covering i
1c6c0 6e 64 65 78 2e 20 20 4e 6f 20 6e 65 65 64 20 74  ndex.  No need t
1c6d0 6f 20 61 63 63 65 73 73 20 74 68 65 20 6d 61 69  o access the mai
1c6e0 6e 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  n table. */.    
1c6f0 7d 65 6c 73 65 20 69 66 28 20 48 61 73 52 6f 77  }else if( HasRow
1c700 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29  id(pIdx->pTable)
1c710 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64   ){.      iRowid
1c720 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65  Reg = iReleaseRe
1c730 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
1c740 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
1c750 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c760 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
1c770 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20  Rowid, iIdxCur, 
1c780 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1c790 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1c7a0 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
1c7b0 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
1c7c0 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
1c7d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c7e0 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20   OP_Seek, iCur, 
1c7f0 69 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20  iRowidReg);  /* 
1c800 44 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f  Deferred seek */
1c810 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c820 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73    Index *pPk = s
1c830 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
1c840 49 6e 64 65 78 28 70 49 64 78 2d 3e 70 54 61 62  Index(pIdx->pTab
1c850 6c 65 29 3b 0a 20 20 20 20 20 20 69 52 6f 77 69  le);.      iRowi
1c860 64 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  dReg = sqlite3Ge
1c870 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
1c880 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29  e, pPk->nKeyCol)
1c890 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
1c8a0 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   j<pPk->nKeyCol;
1c8b0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b   j++){.        k
1c8c0 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
1c8d0 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 70 50  OfIndex(pIdx, pP
1c8e0 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b  k->aiColumn[j]);
1c8f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c900 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1c910 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72  _Column, iIdxCur
1c920 2c 20 6b 2c 20 69 52 6f 77 69 64 52 65 67 2b 6a  , k, iRowidReg+j
1c930 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c940 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c950 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
1c960 6f 75 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72  ound, iCur, addr
1c970 43 6f 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Cont,.          
1c980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c990 20 69 52 6f 77 69 64 52 65 67 2c 20 70 50 6b 2d   iRowidReg, pPk-
1c9a0 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 7d  >nKeyCol);.    }
1c9b0 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20  ..    /* Record 
1c9c0 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
1c9d0 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  used to terminat
1c9e0 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61  e the loop. Disa
1c9f0 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52  ble .    ** WHER
1ca00 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d  E clause terms m
1ca10 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79  ade redundant by
1ca20 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65   the index range
1ca30 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20   scan..    */.  
1ca40 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
1ca50 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
1ca60 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  ROW ){.      pLe
1ca70 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f  vel->op = OP_Noo
1ca80 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  p;.    }else if(
1ca90 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70   bRev ){.      p
1caa0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50  Level->op = OP_P
1cab0 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rev;.    }else{.
1cac0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
1cad0 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   = OP_Next;.    
1cae0 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  }.    pLevel->p1
1caf0 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20   = iIdxCur;.    
1cb00 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
1cb10 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53  ags & WHERE_CONS
1cb20 54 52 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20 20  TRAINT)==0 ){.  
1cb30 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d      pLevel->p5 =
1cb40 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
1cb50 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
1cb60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1cb70 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65     assert( pLeve
1cb80 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20  l->p5==0 );.    
1cb90 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64  }.  }else..#ifnd
1cba0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ef SQLITE_OMIT_O
1cbb0 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  R_OPTIMIZATION. 
1cbc0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1cbd0 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
1cbe0 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43  I_OR ){.    /* C
1cbf0 61 73 65 20 35 3a 20 20 54 77 6f 20 6f 72 20 6d  ase 5:  Two or m
1cc00 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79 20 69  ore separately i
1cc10 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e  ndexed terms con
1cc20 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20  nected by OR.   
1cc30 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70   **.    ** Examp
1cc40 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
1cc50 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
1cc60 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20   t1(a,b,c,d);.  
1cc70 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e    **   CREATE IN
1cc80 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b  DEX i1 ON t1(a);
1cc90 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
1cca0 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28   INDEX i2 ON t1(
1ccb0 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  b);.    **   CRE
1ccc0 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20  ATE INDEX i3 ON 
1ccd0 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  t1(c);.    **.  
1cce0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20    **   SELECT * 
1ccf0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
1cd00 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31  5 OR b=7 OR (c=1
1cd10 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20  1 AND d=13).    
1cd20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65  **.    ** In the
1cd30 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20   example, there 
1cd40 61 72 65 20 74 68 72 65 65 20 69 6e 64 65 78 65  are three indexe
1cd50 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  d terms connecte
1cd60 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20  d by OR..    ** 
1cd70 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c  The top of the l
1cd80 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74  oop looks like t
1cd90 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  his:.    **.    
1cda0 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c  **          Null
1cdb0 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
1cdc0 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74          # Zero t
1cdd0 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67  he rowset in reg
1cde0 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   1.    **.    **
1cdf0 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20   Then, for each 
1ce00 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74 68  indexed term, th
1ce10 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65  e following. The
1ce20 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20   arguments to.  
1ce30 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74 20    ** RowSetTest 
1ce40 61 72 65 20 73 75 63 68 20 74 68 61 74 20 74 68  are such that th
1ce50 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63  e rowid of the c
1ce60 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69 6e  urrent row is in
1ce70 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e  serted.    ** in
1ce80 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20 49  to the RowSet. I
1ce90 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
1cea0 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c  present, control
1ceb0 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20 2a   skips the.    *
1cec0 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20 61  * Gosub opcode a
1ced0 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67 68  nd jumps straigh
1cee0 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65  t to the code ge
1cef0 6e 65 72 61 74 65 64 20 62 79 20 57 68 65 72 65  nerated by Where
1cf00 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  End()..    **.  
1cf10 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69    **        sqli
1cf20 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c 74  te3WhereBegin(<t
1cf30 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20  erm>).    **    
1cf40 20 20 20 20 20 20 52 6f 77 53 65 74 54 65 73 74        RowSetTest
1cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf60 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69 64    # Insert rowid
1cf70 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20 20   into rowset.   
1cf80 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 73   **          Gos
1cf90 75 62 20 20 20 20 20 20 32 20 41 0a 20 20 20 20  ub      2 A.    
1cfa0 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  **        sqlite
1cfb0 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20 20  3WhereEnd().    
1cfc0 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77  **.    ** Follow
1cfd0 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20 63  ing the above, c
1cfe0 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ode to terminate
1cff0 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c   the loop. Label
1d000 20 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a 20   A, the target. 
1d010 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73     ** of the Gos
1d020 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20  ub above, jumps 
1d030 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  to the instructi
1d040 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72 20 74  on right after t
1d050 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a  he Goto..    **.
1d060 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1d070 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20  Null       1    
1d080 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65              # Ze
1d090 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e  ro the rowset in
1d0a0 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20 20   reg 1.    **   
1d0b0 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20         Goto     
1d0c0 20 20 42 20 20 20 20 20 20 20 20 20 20 20 20 20    B             
1d0d0 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69 73     # The loop is
1d0e0 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a   finished..    *
1d0f0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41  *.    **       A
1d100 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20  : <loop body>   
1d110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1d120 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68 61  Return data, wha
1d130 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20  tever..    **.  
1d140 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 65    **          Re
1d150 74 75 72 6e 20 20 20 20 20 32 20 20 20 20 20 20  turn     2      
1d160 20 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d 70            # Jump
1d170 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f 73   back to the Gos
1d180 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ub.    **.    **
1d190 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65 72         B: <after
1d1a0 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a   the loop>.    *
1d1b0 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68 65  *.    */.    Whe
1d1c0 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b  reClause *pOrWc;
1d1d0 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c      /* The OR-cl
1d1e0 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20  ause broken out 
1d1f0 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f  into subterms */
1d200 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4f  .    SrcList *pO
1d210 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 53  rTab;       /* S
1d220 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20 6c  hortened table l
1d230 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73 65  ist or OR-clause
1d240 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20   generation */. 
1d250 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 20 3d     Index *pCov =
1d260 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1d270 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f 76  /* Potential cov
1d280 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f 72 20  ering index (or 
1d290 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e 74  NULL) */.    int
1d2a0 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61 72 73   iCovCur = pPars
1d2b0 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20 43  e->nTab++;  /* C
1d2c0 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 69  ursor used for i
1d2d0 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66 20 61  ndex scans (if a
1d2e0 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20  ny) */..    int 
1d2f0 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
1d300 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20  arse->nMem;     
1d310 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
1d320 72 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f 47  r used with OP_G
1d330 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20  osub */.    int 
1d340 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20 20  regRowset = 0;  
1d350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d360 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
1d370 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a  r for RowSet obj
1d380 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ect */.    int r
1d390 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20  egRowid = 0;    
1d3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3b0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
1d3c0 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a   holding rowid *
1d3d0 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42  /.    int iLoopB
1d3e0 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ody = sqlite3Vdb
1d3f0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
1d400 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70  /* Start of loop
1d410 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74   body */.    int
1d420 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20 20   iRetInit;      
1d430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d440 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1d450 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20 69  s of regReturn i
1d460 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75  nit */.    int u
1d470 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 30  ntestedTerms = 0
1d480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1d490 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20   Some terms not 
1d4a0 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74 65  completely teste
1d4b0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  d */.    int ii;
1d4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1d4e0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1d4f0 20 20 20 45 78 70 72 20 2a 70 41 6e 64 45 78 70     Expr *pAndExp
1d500 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
1d510 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e 20        /* An ".. 
1d520 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70 72 65  AND (...)" expre
1d530 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a 20 20 20  ssion */.   .   
1d540 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e   pTerm = pLoop->
1d550 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61  aLTerm[0];.    a
1d560 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
1d570 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1d580 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1d590 26 20 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61  & WO_OR );.    a
1d5a0 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77  ssert( (pTerm->w
1d5b0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  tFlags & TERM_OR
1d5c0 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20  INFO)!=0 );.    
1d5d0 70 4f 72 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWc = &pTerm->
1d5e0 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
1d5f0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1d600 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20 70  OP_Return;.    p
1d610 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52  Level->p1 = regR
1d620 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53  eturn;..    /* S
1d630 65 74 20 75 70 20 61 20 6e 65 77 20 53 72 63 4c  et up a new SrcL
1d640 69 73 74 20 69 6e 20 70 4f 72 54 61 62 20 63 6f  ist in pOrTab co
1d650 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
1d660 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64  le being scanned
1d670 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
1d680 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b 30 5d  loop in the a[0]
1d690 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f   slot and all no
1d6a0 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 69 6e  tReady tables in
1d6b0 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20   a[1..] slots.. 
1d6c0 20 20 20 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d     ** This becom
1d6d0 65 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69  es the SrcList i
1d6e0 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  n the recursive 
1d6f0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
1d700 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 20  hereBegin()..   
1d710 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 49 6e   */.    if( pWIn
1d720 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a  fo->nLevel>1 ){.
1d730 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65        int nNotRe
1d740 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
1d750 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
1d760 65 72 20 6f 66 20 6e 6f 74 52 65 61 64 79 20 74  er of notReady t
1d770 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 73  ables */.      s
1d780 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1d790 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20 20 20  em *origSrc;    
1d7a0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73   /* Original lis
1d7b0 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
1d7c0 20 20 20 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d       nNotReady =
1d7d0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20   pWInfo->nLevel 
1d7e0 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20  - iLevel - 1;.  
1d7f0 20 20 20 20 70 4f 72 54 61 62 20 3d 20 73 71 6c      pOrTab = sql
1d800 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61  ite3StackAllocRa
1d810 77 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  w(db,.          
1d820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d830 20 20 73 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62    sizeof(*pOrTab
1d840 29 2b 20 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a  )+ nNotReady*siz
1d850 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d  eof(pOrTab->a[0]
1d860 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  ));.      if( pO
1d870 72 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  rTab==0 ) return
1d880 20 6e 6f 74 52 65 61 64 79 3b 0a 20 20 20 20 20   notReady;.     
1d890 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20   pOrTab->nAlloc 
1d8a0 3d 20 28 75 38 29 28 6e 4e 6f 74 52 65 61 64 79  = (u8)(nNotReady
1d8b0 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72   + 1);.      pOr
1d8c0 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54  Tab->nSrc = pOrT
1d8d0 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20  ab->nAlloc;.    
1d8e0 20 20 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d    memcpy(pOrTab-
1d8f0 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69  >a, pTabItem, si
1d900 7a 65 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29  zeof(*pTabItem))
1d910 3b 0a 20 20 20 20 20 20 6f 72 69 67 53 72 63 20  ;.      origSrc 
1d920 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
1d930 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72  st->a;.      for
1d940 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61  (k=1; k<=nNotRea
1d950 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  dy; k++){.      
1d960 20 20 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62    memcpy(&pOrTab
1d970 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63  ->a[k], &origSrc
1d980 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d  [pLevel[k].iFrom
1d990 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62  ], sizeof(pOrTab
1d9a0 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20  ->a[k]));.      
1d9b0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1d9c0 20 20 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e     pOrTab = pWIn
1d9d0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
1d9e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74    }..    /* Init
1d9f0 69 61 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65  ialize the rowse
1da00 74 20 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f  t register to co
1da10 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53  ntain NULL. An S
1da20 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20  QL NULL is .    
1da30 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  ** equivalent to
1da40 20 61 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74   an empty rowset
1da50 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1da60 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  Also initialize 
1da70 72 65 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e  regReturn to con
1da80 74 61 69 6e 20 74 68 65 20 61 64 64 72 65 73 73  tain the address
1da90 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75 63 74   of the instruct
1daa0 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65  ion .    ** imme
1dab0 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
1dac0 67 20 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20  g the OP_Return 
1dad0 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
1dae0 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a   the loop. This.
1daf0 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
1db00 65 64 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63  ed in a few obsc
1db10 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61  ure LEFT JOIN ca
1db20 73 65 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f  ses where contro
1db30 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f  l jumps.    ** o
1db40 76 65 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74  ver the top of t
1db50 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65  he loop into the
1db60 20 62 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20   body of it. In 
1db70 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 20  this case the . 
1db80 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65     ** correct re
1db90 73 70 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65  sponse for the e
1dba0 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20  nd-of-loop code 
1dbb0 28 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20  (the OP_Return) 
1dbc0 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61  is to .    ** fa
1dbd0 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
1dbe0 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
1dbf0 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f  on, just as an O
1dc00 50 5f 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20  P_Next does if. 
1dc10 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20     ** called on 
1dc20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  an uninitialized
1dc30 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a   cursor..    */.
1dc40 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d      if( (pWInfo-
1dc50 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
1dc60 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f  ERE_DUPLICATES_O
1dc70 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  K)==0 ){.      r
1dc80 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61  egRowset = ++pPa
1dc90 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
1dca0 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50   regRowid = ++pP
1dcb0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1dcc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1dcd0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1dce0 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a 20  0, regRowset);. 
1dcf0 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49 6e 69     }.    iRetIni
1dd00 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
1dd10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1dd20 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74 75 72  ger, 0, regRetur
1dd30 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  n);..    /* If t
1dd40 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52  he original WHER
1dd50 45 20 63 6c 61 75 73 65 20 69 73 20 7a 20 6f 66  E clause is z of
1dd60 20 74 68 65 20 66 6f 72 6d 3a 20 20 28 78 31 20   the form:  (x1 
1dd70 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41 4e  OR x2 OR ...) AN
1dd80 44 20 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20  D y.    ** Then 
1dd90 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 78  for every term x
1dda0 4e 2c 20 65 76 61 6c 75 61 74 65 20 61 73 20 74  N, evaluate as t
1ddb0 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
1ddc0 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20 2a  : xN AND z.    *
1ddd0 2a 20 54 68 61 74 20 77 61 79 2c 20 74 65 72 6d  * That way, term
1dde0 73 20 69 6e 20 79 20 74 68 61 74 20 61 72 65 20  s in y that are 
1ddf0 66 61 63 74 6f 72 65 64 20 69 6e 74 6f 20 74 68  factored into th
1de00 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77 69  e disjunction wi
1de10 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 69 63  ll.    ** be pic
1de20 6b 65 64 20 75 70 20 62 79 20 74 68 65 20 72 65  ked up by the re
1de30 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f  cursive calls to
1de40 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1de50 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20 20  in() below..    
1de60 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74 75 61 6c  **.    ** Actual
1de70 6c 79 2c 20 65 61 63 68 20 73 75 62 65 78 70 72  ly, each subexpr
1de80 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65 72  ession is conver
1de90 74 65 64 20 74 6f 20 22 78 4e 20 41 4e 44 20 77  ted to "xN AND w
1dea0 22 20 77 68 65 72 65 20 77 20 69 73 0a 20 20 20  " where w is.   
1deb0 20 2a 2a 20 74 68 65 20 22 69 6e 74 65 72 65 73   ** the "interes
1dec0 74 69 6e 67 22 20 74 65 72 6d 73 20 6f 66 20 7a  ting" terms of z
1ded0 20 2d 20 74 65 72 6d 73 20 74 68 61 74 20 64 69   - terms that di
1dee0 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20  d not originate 
1def0 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 4e  in the.    ** ON
1df00 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
1df10 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   of a LEFT JOIN,
1df20 20 61 6e 64 20 74 65 72 6d 73 20 74 68 61 74 20   and terms that 
1df30 61 72 65 20 75 73 61 62 6c 65 20 61 73 20 0a 20  are usable as . 
1df40 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a 20     ** indices.. 
1df50 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
1df60 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61  s optimization a
1df70 6c 73 6f 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73  lso only applies
1df80 20 69 66 20 74 68 65 20 28 78 31 20 4f 52 20 78   if the (x1 OR x
1df90 32 20 4f 52 20 2e 2e 2e 29 20 74 65 72 6d 0a 20  2 OR ...) term. 
1dfa0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e     ** is not con
1dfb0 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 4f 4e  tained in the ON
1dfc0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46   clause of a LEF
1dfd0 54 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20 53  T JOIN..    ** S
1dfe0 65 65 20 74 69 63 6b 65 74 20 68 74 74 70 3a 2f  ee ticket http:/
1dff0 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f  /www.sqlite.org/
1e000 73 72 63 2f 69 6e 66 6f 2f 66 32 33 36 39 33 30  src/info/f236930
1e010 34 65 34 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  4e4.    */.    i
1e020 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31 20  f( pWC->nTerm>1 
1e030 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 65  ){.      int iTe
1e040 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 54  rm;.      for(iT
1e050 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57 43  erm=0; iTerm<pWC
1e060 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b  ->nTerm; iTerm++
1e070 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
1e080 2a 70 45 78 70 72 20 3d 20 70 57 43 2d 3e 61 5b  *pExpr = pWC->a[
1e090 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20  iTerm].pExpr;.  
1e0a0 20 20 20 20 20 20 69 66 28 20 26 70 57 43 2d 3e        if( &pWC->
1e0b0 61 5b 69 54 65 72 6d 5d 20 3d 3d 20 70 54 65 72  a[iTerm] == pTer
1e0c0 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  m ) continue;.  
1e0d0 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
1e0e0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1e0f0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
1e100 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1e110 20 20 69 66 28 20 70 57 43 2d 3e 61 5b 69 54 65    if( pWC->a[iTe
1e120 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 28 54  rm].wtFlags & (T
1e130 45 52 4d 5f 4f 52 49 4e 46 4f 29 20 29 20 63 6f  ERM_ORINFO) ) co
1e140 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1e150 69 66 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72  if( (pWC->a[iTer
1e160 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m].eOperator & W
1e170 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74  O_ALL)==0 ) cont
1e180 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45  inue;.        pE
1e190 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1e1a0 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
1e1b0 30 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64  0);.        pAnd
1e1c0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
1e1d0 70 72 41 6e 64 28 64 62 2c 20 70 41 6e 64 45 78  prAnd(db, pAndEx
1e1e0 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  pr, pExpr);.    
1e1f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 41    }.      if( pA
1e200 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  ndExpr ){.      
1e210 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c    pAndExpr = sql
1e220 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
1e230 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e  , TK_AND, 0, pAn
1e240 64 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  dExpr, 0);.     
1e250 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
1e260 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63  r(ii=0; ii<pOrWc
1e270 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a  ->nTerm; ii++){.
1e280 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
1e290 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57  *pOrTerm = &pOrW
1e2a0 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20  c->a[ii];.      
1e2b0 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
1e2c0 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c  tCursor==iCur ||
1e2d0 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
1e2e0 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d  ator & WO_AND)!=
1e2f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65  0 ){.        Whe
1e300 72 65 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66  reInfo *pSubWInf
1e310 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  o;          /* I
1e320 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f  nfo for single O
1e330 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20  R-term scan */. 
1e340 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72         Expr *pOr
1e350 45 78 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  Expr = pOrTerm->
1e360 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
1e370 66 28 20 70 41 6e 64 45 78 70 72 20 26 26 20 21  f( pAndExpr && !
1e380 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1e390 70 4f 72 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  pOrExpr, EP_From
1e3a0 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  Join) ){.       
1e3b0 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65     pAndExpr->pLe
1e3c0 66 74 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20  ft = pOrExpr;.  
1e3d0 20 20 20 20 20 20 20 20 70 4f 72 45 78 70 72 20          pOrExpr 
1e3e0 3d 20 70 41 6e 64 45 78 70 72 3b 0a 20 20 20 20  = pAndExpr;.    
1e3f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
1e400 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61   Loop through ta
1e410 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74  ble entries that
1e420 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54   match term pOrT
1e430 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  erm. */.        
1e440 70 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69  pSubWInfo = sqli
1e450 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
1e460 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f  arse, pOrTab, pO
1e470 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20  rExpr, 0, 0,.   
1e480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e490 20 20 20 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f       WHERE_OMIT_
1e4a0 4f 50 45 4e 5f 43 4c 4f 53 45 20 7c 20 57 48 45  OPEN_CLOSE | WHE
1e4b0 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20  RE_AND_ONLY |.  
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4d0 20 20 20 20 20 20 57 48 45 52 45 5f 46 4f 52 43        WHERE_FORC
1e4e0 45 5f 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f  E_TABLE | WHERE_
1e4f0 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 2c 20 69  ONETABLE_ONLY, i
1e500 43 6f 76 43 75 72 29 3b 0a 20 20 20 20 20 20 20  CovCur);.       
1e510 20 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e   assert( pSubWIn
1e520 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  fo || pParse->nE
1e530 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
1e540 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
1e550 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 20    if( pSubWInfo 
1e560 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65  ){.          Whe
1e570 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f 70  reLoop *pSubLoop
1e580 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 6c  ;.          expl
1e590 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20  ainOneScan(.    
1e5a0 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
1e5b0 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57  , pOrTab, &pSubW
1e5c0 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76  Info->a[0], iLev
1e5d0 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  el, pLevel->iFro
1e5e0 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20 29  m, 0.          )
1e5f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1e600 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
1e610 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c  ags & WHERE_DUPL
1e620 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b  ICATES_OK)==0 ){
1e630 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
1e640 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f   iSet = ((ii==pO
1e650 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31  rWc->nTerm-1)?-1
1e660 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  :ii);.          
1e670 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20    int r;.       
1e680 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33       r = sqlite3
1e690 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1e6a0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74  n(pParse, pTabIt
1e6b0 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43  em->pTab, -1, iC
1e6c0 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ur, .           
1e6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1e6f0 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20  gRowid, 0);.    
1e700 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1e710 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
1e720 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72  OP_RowSetTest, r
1e730 65 67 52 6f 77 73 65 74 2c 0a 20 20 20 20 20 20  egRowset,.      
1e740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e750 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1e760 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1e770 72 28 76 29 2b 32 2c 20 72 2c 20 69 53 65 74 29  r(v)+2, r, iSet)
1e780 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e790 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1e7a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e7b0 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e  Gosub, regReturn
1e7c0 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20  , iLoopBody);.. 
1e7d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e7e0 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  pSubWInfo->untes
1e7f0 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65  tedTerms flag me
1e800 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f 52  ans that this OR
1e810 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20   term.          
1e820 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65  ** contained one
1e830 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72   or more AND ter
1e840 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64  m from a notRead
1e850 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20  y table.  The.  
1e860 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73          ** terms
1e870 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61   from the notRea
1e880 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e  dy table could n
1e890 6f 74 20 62 65 20 74 65 73 74 65 64 20 61 6e 64  ot be tested and
1e8a0 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20   will.          
1e8b0 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65  ** need to be te
1e8c0 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20  sted later..    
1e8d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1e8e0 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
1e8f0 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
1e900 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ) untestedTerms 
1e910 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
1e920 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  /* If all of the
1e930 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
1e940 72 6d 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65  rms are optimize
1e950 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
1e960 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
1e970 64 65 78 2c 20 61 6e 64 20 74 68 65 20 69 6e 64  dex, and the ind
1e980 65 78 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  ex is opened usi
1e990 6e 67 20 74 68 65 20 73 61 6d 65 20 63 75 72 73  ng the same curs
1e9a0 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  or number.      
1e9b0 20 20 20 20 2a 2a 20 62 79 20 65 61 63 68 20 63      ** by each c
1e9c0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
1e9d0 65 72 65 42 65 67 69 6e 28 29 20 6d 61 64 65 20  ereBegin() made 
1e9e0 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74  by this loop, it
1e9f0 20 6d 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a   may.          *
1ea00 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  * be possible to
1ea10 20 75 73 65 20 74 68 61 74 20 69 6e 64 65 78 20   use that index 
1ea20 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  as a covering in
1ea30 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
1ea40 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  *.          ** I
1ea50 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  f the call to sq
1ea60 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1ea70 29 20 61 62 6f 76 65 20 72 65 73 75 6c 74 65 64  ) above resulted
1ea80 20 69 6e 20 61 20 73 63 61 6e 20 74 68 61 74 0a   in a scan that.
1ea90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
1eaa0 73 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20  s an index, and 
1eab0 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 74  this is either t
1eac0 68 65 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e  he first OR-conn
1ead0 65 63 74 65 64 20 74 65 72 6d 0a 20 20 20 20 20  ected term.     
1eae0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
1eaf0 64 20 6f 72 20 74 68 65 20 69 6e 64 65 78 20 69  d or the index i
1eb00 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
1eb10 61 74 20 75 73 65 64 20 62 79 20 61 6c 6c 20 70  at used by all p
1eb20 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
1eb30 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74 20    ** terms, set 
1eb40 70 43 6f 76 20 74 6f 20 74 68 65 20 63 61 6e 64  pCov to the cand
1eb50 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69  idate covering i
1eb60 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73 65 2c  ndex. Otherwise,
1eb70 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 20 20   set .          
1eb80 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20  ** pCov to NULL 
1eb90 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
1eba0 20 6e 6f 20 63 61 6e 64 69 64 61 74 65 20 63 6f   no candidate co
1ebb0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 77 69 6c  vering index wil
1ebc0 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l .          ** 
1ebd0 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20  be available..  
1ebe0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1ebf0 20 20 20 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20       pSubLoop = 
1ec00 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  pSubWInfo->a[0].
1ec10 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  pWLoop;.        
1ec20 20 20 61 73 73 65 72 74 28 20 28 70 53 75 62 4c    assert( (pSubL
1ec30 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1ec40 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
1ec50 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
1ec60 20 69 66 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e   if( (pSubLoop->
1ec70 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1ec80 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
1ec90 20 20 20 20 20 20 20 26 26 20 28 69 69 3d 3d 30         && (ii==0
1eca0 20 7c 7c 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e   || pSubLoop->u.
1ecb0 62 74 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70 43  btree.pIndex==pC
1ecc0 6f 76 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  ov).          ){
1ecd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
1ece0 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e  ert( pSubWInfo->
1ecf0 61 5b 30 5d 2e 69 49 64 78 43 75 72 3d 3d 69 43  a[0].iIdxCur==iC
1ed00 6f 76 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20  ovCur );.       
1ed10 20 20 20 20 20 70 43 6f 76 20 3d 20 70 53 75 62       pCov = pSub
1ed20 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
1ed30 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20  ndex;.          
1ed40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1ed50 20 20 20 70 43 6f 76 20 3d 20 30 3b 0a 20 20 20     pCov = 0;.   
1ed60 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1ed70 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68      /* Finish th
1ed80 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  e loop through t
1ed90 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61  able entries tha
1eda0 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72  t match term pOr
1edb0 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20  Term. */.       
1edc0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
1edd0 6e 64 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20  nd(pSubWInfo);. 
1ede0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1edf0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
1ee00 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 20 3d 20 70  l->u.pCovidx = p
1ee10 43 6f 76 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  Cov;.    if( pCo
1ee20 76 20 29 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  v ) pLevel->iIdx
1ee30 43 75 72 20 3d 20 69 43 6f 76 43 75 72 3b 0a 20  Cur = iCovCur;. 
1ee40 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
1ee50 29 7b 0a 20 20 20 20 20 20 70 41 6e 64 45 78 70  ){.      pAndExp
1ee60 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20  r->pLeft = 0;.  
1ee70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1ee80 65 6c 65 74 65 28 64 62 2c 20 70 41 6e 64 45 78  elete(db, pAndEx
1ee90 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  pr);.    }.    s
1eea0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1eeb0 50 31 28 76 2c 20 69 52 65 74 49 6e 69 74 2c 20  P1(v, iRetInit, 
1eec0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1eed0 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20  ntAddr(v));.    
1eee0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1eef0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
1ef00 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
1ef10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1ef20 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1ef30 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20  , iLoopBody);.. 
1ef40 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
1ef50 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65  Level>1 ) sqlite
1ef60 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70  3StackFree(db, p
1ef70 4f 72 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20  OrTab);.    if( 
1ef80 21 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29  !untestedTerms )
1ef90 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
1efa0 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d  vel, pTerm);.  }
1efb0 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
1efc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
1efd0 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20  TIMIZATION */.. 
1efe0 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 36   {.    /* Case 6
1eff0 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75  :  There is no u
1f000 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65  sable index.  We
1f010 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c   must do a compl
1f020 65 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ete.    **      
1f030 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20      scan of the 
1f040 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20  entire table..  
1f050 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20    */.    static 
1f060 63 6f 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d  const u8 aStep[]
1f070 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50   = { OP_Next, OP
1f080 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61  _Prev };.    sta
1f090 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
1f0a0 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77  art[] = { OP_Rew
1f0b0 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a  ind, OP_Last };.
1f0c0 20 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76      assert( bRev
1f0d0 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29  ==0 || bRev==1 )
1f0e0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
1f0f0 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a   = aStep[bRev];.
1f100 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
1f110 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
1f120 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69  l->p2 = 1 + sqli
1f130 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f140 20 61 53 74 61 72 74 5b 62 52 65 76 5d 2c 20 69   aStart[bRev], i
1f150 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20  Cur, addrBrk);. 
1f160 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20     pLevel->p5 = 
1f170 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
1f180 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b  S_FULLSCAN_STEP;
1f190 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  .  }..  /* Inser
1f1a0 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65  t code to test e
1f1b0 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69  very subexpressi
1f1c0 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63  on that can be c
1f1d0 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63  ompletely.  ** c
1f1e0 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68  omputed using th
1f1f0 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66  e current set of
1f200 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
1f210 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
1f220 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , j=pWC->nTerm; 
1f230 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b  j>0; j--, pTerm+
1f240 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
1f250 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1f260 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1f270 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1f280 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1f290 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1f2a0 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
1f2b0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
1f2c0 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
1f2d0 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
1f2e0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1f2f0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
1f300 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d  reqAll & pLevel-
1f310 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b  >notReady)!=0 ){
1f320 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f330 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
1f340 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20  dTerms==0.      
1f350 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
1f360 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
1f370 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
1f380 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20  _ONLY)!=0 );.   
1f390 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73     pWInfo->untes
1f3a0 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20  tedTerms = 1;.  
1f3b0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1f3c0 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65    }.    pE = pTe
1f3d0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61  rm->pExpr;.    a
1f3e0 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a  ssert( pE!=0 );.
1f3f0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
1f400 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78  iLeftJoin && !Ex
1f410 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1f420 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
1f430 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
1f440 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1f450 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1f460 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43  Parse, pE, addrC
1f470 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
1f480 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65  IFNULL);.    pTe
1f490 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
1f4a0 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a  ERM_CODED;.  }..
1f4b0 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65    /* Insert code
1f4c0 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6d 70   to test for imp
1f4d0 6c 69 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73  lied constraints
1f4e0 20 62 61 73 65 64 20 6f 6e 20 74 72 61 6e 73 69   based on transi
1f4f0 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74  tivity.  ** of t
1f500 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72  he "==" operator
1f510 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
1f520 70 6c 65 3a 20 49 66 20 74 68 65 20 57 48 45 52  ple: If the WHER
1f530 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
1f540 73 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e  s "t1.a=t2.b" an
1f550 64 20 22 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a  d "t2.b=123".  *
1f560 2a 20 61 6e 64 20 77 65 20 61 72 65 20 63 6f 64  * and we are cod
1f570 69 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ing the t1 loop 
1f580 61 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f 70 20  and the t2 loop 
1f590 68 61 73 20 6e 6f 74 20 79 65 74 20 63 6f 64 65  has not yet code
1f5a0 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65 20  d,.  ** then we 
1f5b0 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20 22  cannot use the "
1f5c0 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74  t1.a=t2.b" const
1f5d0 72 61 69 6e 74 2c 20 62 75 74 20 77 65 20 63 61  raint, but we ca
1f5e0 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20  n code.  ** the 
1f5f0 69 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d 31 32  implied "t1.a=12
1f600 33 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  3" constraint.. 
1f610 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   */.  for(pTerm=
1f620 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e  pWC->a, j=pWC->n
1f630 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
1f640 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
1f650 70 72 20 2a 70 45 2c 20 2a 70 45 41 6c 74 3b 0a  pr *pE, *pEAlt;.
1f660 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1f670 41 6c 74 3b 0a 20 20 20 20 69 66 28 20 70 54 65  Alt;.    if( pTe
1f680 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
1f690 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
1f6a0 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
1f6b0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
1f6c0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28 57  m->eOperator!=(W
1f6d0 4f 5f 45 51 55 49 56 7c 57 4f 5f 45 51 29 20 29  O_EQUIV|WO_EQ) )
1f6e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
1f6f0 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
1f700 72 73 6f 72 21 3d 69 43 75 72 20 29 20 63 6f 6e  rsor!=iCur ) con
1f710 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
1f720 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
1f730 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1f740 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pE = pTerm->pEx
1f750 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
1f760 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1f770 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  (pE, EP_FromJoin
1f780 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
1f790 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
1f7a0 69 67 68 74 20 26 20 70 4c 65 76 65 6c 2d 3e 6e  ight & pLevel->n
1f7b0 6f 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a 20  otReady)!=0 );. 
1f7c0 20 20 20 70 41 6c 74 20 3d 20 66 69 6e 64 54 65     pAlt = findTe
1f7d0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 54  rm(pWC, iCur, pT
1f7e0 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
1f7f0 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  n, notReady, WO_
1f800 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20  EQ|WO_IN, 0);.  
1f810 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29 20    if( pAlt==0 ) 
1f820 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
1f830 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20  ( pAlt->wtFlags 
1f840 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  & (TERM_CODED) )
1f850 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 74   continue;.    t
1f860 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65  estcase( pAlt->e
1f870 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
1f880 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1f890 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f  ( pAlt->eOperato
1f8a0 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
1f8b0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1f8c0 28 28 76 2c 20 22 62 65 67 69 6e 20 74 72 61 6e  ((v, "begin tran
1f8d0 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e  sitive constrain
1f8e0 74 22 29 29 3b 0a 20 20 20 20 70 45 41 6c 74 20  t"));.    pEAlt 
1f8f0 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c  = sqlite3StackAl
1f900 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
1f910 66 28 2a 70 45 41 6c 74 29 29 3b 0a 20 20 20 20  f(*pEAlt));.    
1f920 69 66 28 20 70 45 41 6c 74 20 29 7b 0a 20 20 20  if( pEAlt ){.   
1f930 20 20 20 2a 70 45 41 6c 74 20 3d 20 2a 70 41 6c     *pEAlt = *pAl
1f940 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  t->pExpr;.      
1f950 70 45 41 6c 74 2d 3e 70 4c 65 66 74 20 3d 20 70  pEAlt->pLeft = p
1f960 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  E->pLeft;.      
1f970 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1f980 73 65 28 70 50 61 72 73 65 2c 20 70 45 41 6c 74  se(pParse, pEAlt
1f990 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
1f9a0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
1f9b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 61        sqlite3Sta
1f9c0 63 6b 46 72 65 65 28 64 62 2c 20 70 45 41 6c 74  ckFree(db, pEAlt
1f9d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1f9e0 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f 55  /* For a LEFT OU
1f9f0 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61  TER JOIN, genera
1fa00 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
1fa10 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  l record the fac
1fa20 74 20 74 68 61 74 0a 20 20 2a 2a 20 61 74 20 6c  t that.  ** at l
1fa30 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  east one row of 
1fa40 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
1fa50 68 61 73 20 6d 61 74 63 68 65 64 20 74 68 65 20  has matched the 
1fa60 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20  left table.  .  
1fa70 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  */.  if( pLevel-
1fa80 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  >iLeftJoin ){.  
1fa90 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69    pLevel->addrFi
1faa0 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rst = sqlite3Vdb
1fab0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1fac0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1fad0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1fae0 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d  eger, 1, pLevel-
1faf0 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
1fb00 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1fb10 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f   "record LEFT JO
1fb20 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20 73  IN hit"));.    s
1fb30 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
1fb40 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
1fb50 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
1fb60 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e  >a, j=0; j<pWC->
1fb70 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72  nTerm; j++, pTer
1fb80 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65 73 74  m++){.      test
1fb90 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
1fba0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
1fbb0 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UAL );.      tes
1fbc0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
1fbd0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
1fbe0 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ED );.      if( 
1fbf0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1fc00 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
1fc10 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
1fc20 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
1fc30 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
1fc40 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  ll & pLevel->not
1fc50 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20  Ready)!=0 ){.   
1fc60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49       assert( pWI
1fc70 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
1fc80 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ms );.        co
1fc90 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
1fca0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
1fcb0 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  erm->pExpr );.  
1fcc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1fcd0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1fce0 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64 64  Term->pExpr, add
1fcf0 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55  rCont, SQLITE_JU
1fd00 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
1fd10 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
1fd20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
1fd30 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1fd40 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1fd50 28 70 50 61 72 73 65 2c 20 69 52 65 6c 65 61 73  (pParse, iReleas
1fd60 65 52 65 67 29 3b 0a 0a 20 20 72 65 74 75 72 6e  eReg);..  return
1fd70 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64   pLevel->notRead
1fd80 79 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  y;.}..#if define
1fd90 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  d(WHERETRACE_ENA
1fda0 42 4c 45 44 29 20 26 26 20 64 65 66 69 6e 65 64  BLED) && defined
1fdb0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54  (SQLITE_ENABLE_T
1fdc0 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a  REE_EXPLAIN)./*.
1fdd0 2a 2a 20 47 65 6e 65 72 61 74 65 20 22 45 78 70  ** Generate "Exp
1fde0 6c 61 6e 61 74 69 6f 6e 22 20 74 65 78 74 20 66  lanation" text f
1fdf0 6f 72 20 61 20 57 68 65 72 65 54 65 72 6d 2e 0a  or a WhereTerm..
1fe00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1fe10 68 65 72 65 45 78 70 6c 61 69 6e 54 65 72 6d 28  hereExplainTerm(
1fe20 56 64 62 65 20 2a 76 2c 20 57 68 65 72 65 54 65  Vdbe *v, WhereTe
1fe30 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 63 68  rm *pTerm){.  ch
1fe40 61 72 20 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 6d  ar zType[4];.  m
1fe50 65 6d 63 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e  emcpy(zType, "..
1fe60 2e 22 2c 20 34 29 3b 0a 20 20 69 66 28 20 70 54  .", 4);.  if( pT
1fe70 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
1fe80 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 7a 54  ERM_VIRTUAL ) zT
1fe90 79 70 65 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20  ype[0] = 'V';.  
1fea0 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
1feb0 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 20  ator & WO_EQUIV 
1fec0 20 29 20 7a 54 79 70 65 5b 31 5d 20 3d 20 27 45   ) zType[1] = 'E
1fed0 27 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ';.  if( ExprHas
1fee0 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
1fef0 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
1ff00 69 6e 29 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d  in) ) zType[2] =
1ff10 20 27 4c 27 3b 0a 20 20 73 71 6c 69 74 65 33 45   'L';.  sqlite3E
1ff20 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 76 2c 20  xplainPrintf(v, 
1ff30 22 25 73 20 22 2c 20 7a 54 79 70 65 29 3b 0a 20  "%s ", zType);. 
1ff40 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1ff50 78 70 72 28 76 2c 20 70 54 65 72 6d 2d 3e 70 45  xpr(v, pTerm->pE
1ff60 78 70 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  xpr);.}.#endif /
1ff70 2a 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  * WHERETRACE_ENA
1ff80 42 4c 45 44 20 26 26 20 53 51 4c 49 54 45 5f 45  BLED && SQLITE_E
1ff90 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41  NABLE_TREE_EXPLA
1ffa0 49 4e 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57  IN */...#ifdef W
1ffb0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
1ffc0 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  D./*.** Print a 
1ffd0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1ffe0 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70   for debugging p
1fff0 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69  urposes.*/.stati
20000 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
20010 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20  Print(WhereLoop 
20020 2a 70 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20  *p, WhereClause 
20030 2a 70 57 43 29 7b 0a 20 20 57 68 65 72 65 49 6e  *pWC){.  WhereIn
20040 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43  fo *pWInfo = pWC
20050 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20  ->pWInfo;.  int 
20060 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e  nb = 1+(pWInfo->
20070 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 37  pTabList->nSrc+7
20080 29 2f 38 3b 0a 20 20 73 74 72 75 63 74 20 53 72  )/8;.  struct Sr
20090 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
200a0 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  m = pWInfo->pTab
200b0 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61  List->a + p->iTa
200c0 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  b;.  Table *pTab
200d0 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
200e0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
200f0 69 6e 74 66 28 22 25 63 25 32 64 2e 25 30 2a 6c  intf("%c%2d.%0*l
20100 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63  lx.%0*llx", p->c
20110 49 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Id,.            
20120 20 20 20 20 20 20 20 20 20 70 2d 3e 69 54 61 62           p->iTab
20130 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c  , nb, p->maskSel
20140 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71  f, nb, p->prereq
20150 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
20160 67 50 72 69 6e 74 66 28 22 20 25 31 32 73 22 2c  gPrintf(" %12s",
20170 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20180 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c        pItem->zAl
20190 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c  ias ? pItem->zAl
201a0 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d  ias : pTab->zNam
201b0 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73  e);.  if( (p->ws
201c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
201d0 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
201e0 7b 0a 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  {.     const cha
201f0 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69  r *zName;.     i
20200 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  f( p->u.btree.pI
20210 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65 20 3d  ndex && (zName =
20220 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
20230 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ex->zName)!=0 ){
20240 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
20250 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
20260 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31  e_autoindex_", 1
20270 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  7)==0 ){.       
20280 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33   int i = sqlite3
20290 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20  Strlen30(zName) 
202a0 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69  - 1;.        whi
202b0 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f  le( zName[i]!='_
202c0 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20  ' ) i--;.       
202d0 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20   zName += i;.   
202e0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
202f0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2e  e3DebugPrintf(".
20300 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d  %-16s %2d", zNam
20310 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  e, p->u.btree.nE
20320 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  q);.    }else{. 
20330 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
20340 67 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c 22  gPrintf("%20s","
20350 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ");.    }.  }els
20360 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  e{.    char *z;.
20370 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74 61      if( p->u.vta
20380 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20  b.idxStr ){.    
20390 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
203a0 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73 5c  rintf("(%d,\"%s\
203b0 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20 20  ",%x)",.        
203c0 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61          p->u.vta
203d0 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76  b.idxNum, p->u.v
203e0 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75  tab.idxStr, p->u
203f0 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b  .vtab.omitMask);
20400 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20410 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
20420 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22 2c  rintf("(%d,%x)",
20430 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75   p->u.vtab.idxNu
20440 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  m, p->u.vtab.omi
20450 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  tMask);.    }.  
20460 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
20470 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20 7a  intf(" %-19s", z
20480 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
20490 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 73 71  ree(z);.  }.  sq
204a0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
204b0 28 22 20 66 20 25 30 34 78 20 4e 20 25 64 22 2c  (" f %04x N %d",
204c0 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e   p->wsFlags, p->
204d0 6e 4c 54 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74  nLTerm);.  sqlit
204e0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
204f0 63 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22  cost %d,%d,%d\n"
20500 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e  , p->rSetup, p->
20510 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a  rRun, p->nOut);.
20520 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
20530 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49  ABLE_TREE_EXPLAI
20540 4e 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 30 78  N.  /* If the 0x
20550 31 30 30 20 62 69 74 20 6f 66 20 77 68 65 72 65  100 bit of where
20560 74 72 61 63 69 6e 67 20 69 73 20 73 65 74 2c 20  tracing is set, 
20570 74 68 65 6e 20 73 68 6f 77 20 61 6c 6c 20 6f 66  then show all of
20580 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 0a   the constraint.
20590 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73    ** expressions
205a0 20 69 6e 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   in the WhereLoo
205b0 70 2e 61 4c 54 65 72 6d 5b 5d 20 61 72 72 61 79  p.aLTerm[] array
205c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
205d0 6e 4c 54 65 72 6d 20 26 26 20 28 73 71 6c 69 74  nLTerm && (sqlit
205e0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
205f0 78 31 30 30 29 21 3d 30 20 29 7b 20 20 2f 2a 20  x100)!=0 ){  /* 
20600 57 48 45 52 45 54 52 41 43 45 20 30 78 31 30 30  WHERETRACE 0x100
20610 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   */.    int i;. 
20620 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 57 49     Vdbe *v = pWI
20630 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 70 56 64  nfo->pParse->pVd
20640 62 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  be;.    sqlite3E
20650 78 70 6c 61 69 6e 42 65 67 69 6e 28 76 29 3b 0a  xplainBegin(v);.
20660 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
20670 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a  ->nLTerm; i++){.
20680 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
20690 2a 70 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65  *pTerm = p->aLTe
206a0 72 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  rm[i];.      if(
206b0 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74   pTerm==0 ) cont
206c0 69 6e 75 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  inue;.      sqli
206d0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
206e0 28 76 2c 20 22 20 20 28 25 64 29 20 23 25 2d 32  (v, "  (%d) #%-2
206f0 64 20 22 2c 20 69 2b 31 2c 20 28 69 6e 74 29 28  d ", i+1, (int)(
20700 70 54 65 72 6d 2d 70 57 43 2d 3e 61 29 29 3b 0a  pTerm-pWC->a));.
20710 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20720 6c 61 69 6e 50 75 73 68 28 76 29 3b 0a 20 20 20  lainPush(v);.   
20730 20 20 20 77 68 65 72 65 45 78 70 6c 61 69 6e 54     whereExplainT
20740 65 72 6d 28 76 2c 20 70 54 65 72 6d 29 3b 0a 20  erm(v, pTerm);. 
20750 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
20760 61 69 6e 50 6f 70 28 76 29 3b 0a 20 20 20 20 20  ainPop(v);.     
20770 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
20780 4c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  L(v);.    }.    
20790 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 46 69  sqlite3ExplainFi
207a0 6e 69 73 68 28 76 29 3b 0a 20 20 20 20 73 71 6c  nish(v);.    sql
207b0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
207c0 22 25 73 22 2c 20 73 71 6c 69 74 65 33 56 64 62  "%s", sqlite3Vdb
207d0 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28 76 29 29  eExplanation(v))
207e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 23  ;.  }.#endif.}.#
207f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  endif../*.** Con
20800 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72 79  vert bulk memory
20810 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 57 68   into a valid Wh
20820 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63 61 6e  ereLoop that can
20830 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f   be passed.** to
20840 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 20   whereLoopClear 
20850 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73  harmlessly..*/.s
20860 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
20870 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65 4c 6f  LoopInit(WhereLo
20880 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c 54  op *p){.  p->aLT
20890 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 53  erm = p->aLTermS
208a0 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72  pace;.  p->nLTer
208b0 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c  m = 0;.  p->nLSl
208c0 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70  ot = ArraySize(p
208d0 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3b 0a  ->aLTermSpace);.
208e0 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30    p->wsFlags = 0
208f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
20900 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 75   the WhereLoop.u
20910 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20 57   union.  Leave W
20920 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20  hereLoop.pLTerm 
20930 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  intact..*/.stati
20940 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
20950 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69 74  ClearUnion(sqlit
20960 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
20970 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  p *p){.  if( p->
20980 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
20990 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c 57 48  _VIRTUALTABLE|WH
209a0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20  ERE_AUTO_INDEX) 
209b0 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77  ){.    if( (p->w
209c0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
209d0 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
209e0 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  && p->u.vtab.nee
209f0 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 73  dFree ){.      s
20a00 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 75  qlite3_free(p->u
20a10 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20  .vtab.idxStr);. 
20a20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 6e       p->u.vtab.n
20a30 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  eedFree = 0;.   
20a40 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78     p->u.vtab.idx
20a50 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Str = 0;.    }el
20a60 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  se if( (p->wsFla
20a70 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
20a80 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 2d 3e  INDEX)!=0 && p->
20a90 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d  u.btree.pIndex!=
20aa0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
20ab0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
20ac0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
20ad0 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20 20  zColAff);.      
20ae0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
20af0 72 65 66 28 70 2d 3e 75 2e 62 74 72 65 65 2e 70  ref(p->u.btree.p
20b00 49 6e 64 65 78 2d 3e 70 4b 65 79 49 6e 66 6f 29  Index->pKeyInfo)
20b10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
20b20 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62  bFree(db, p->u.b
20b30 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20  tree.pIndex);.  
20b40 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70      p->u.btree.p
20b50 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d  Index = 0;.    }
20b60 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
20b70 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e 61  allocate interna
20b80 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
20b90 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
20ba0 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
20bb0 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  id whereLoopClea
20bc0 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  r(sqlite3 *db, W
20bd0 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
20be0 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70  if( p->aLTerm!=p
20bf0 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20  ->aLTermSpace ) 
20c00 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
20c10 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20  , p->aLTerm);.  
20c20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
20c30 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77 68  ion(db, p);.  wh
20c40 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a  ereLoopInit(p);.
20c50 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73  }../*.** Increas
20c60 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
20c70 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f  ocation for pLoo
20c80 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62  p->aLTerm[] to b
20c90 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f  e at least n..*/
20ca0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
20cb0 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69  eLoopResize(sqli
20cc0 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
20cd0 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20  op *p, int n){. 
20ce0 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e   WhereTerm **paN
20cf0 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53  ew;.  if( p->nLS
20d00 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20  lot>=n ) return 
20d10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d  SQLITE_OK;.  n =
20d20 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e   (n+7)&~7;.  paN
20d30 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
20d40 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
20d50 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29  of(p->aLTerm[0])
20d60 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65 77  *n);.  if( paNew
20d70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
20d80 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
20d90 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c  cpy(paNew, p->aL
20da0 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  Term, sizeof(p->
20db0 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c  aLTerm[0])*p->nL
20dc0 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Slot);.  if( p->
20dd0 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72  aLTerm!=p->aLTer
20de0 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33  mSpace ) sqlite3
20df0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
20e00 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65  Term);.  p->aLTe
20e10 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d  rm = paNew;.  p-
20e20 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72  >nLSlot = n;.  r
20e30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66  .}../*.** Transf
20e50 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  er content from 
20e60 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70  the second pLoop
20e70 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74 2e   into the first.
20e80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
20e90 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c  hereLoopXfer(sql
20ea0 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
20eb0 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c  oop *pTo, WhereL
20ec0 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77  oop *pFrom){.  w
20ed0 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
20ee0 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69  on(db, pTo);.  i
20ef0 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
20f00 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f  ze(db, pTo, pFro
20f10 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20  m->nLTerm) ){.  
20f20 20 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75    memset(&pTo->u
20f30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d  , 0, sizeof(pTo-
20f40 3e 75 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >u));.    return
20f50 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
20f60 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c   }.  memcpy(pTo,
20f70 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f   pFrom, WHERE_LO
20f80 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d  OP_XFER_SZ);.  m
20f90 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72  emcpy(pTo->aLTer
20fa0 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d  m, pFrom->aLTerm
20fb0 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69  , pTo->nLTerm*si
20fc0 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d  zeof(pTo->aLTerm
20fd0 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46 72  [0]));.  if( pFr
20fe0 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  om->wsFlags & WH
20ff0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
21000 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75   ){.    pFrom->u
21010 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
21020 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
21030 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20  (pFrom->wsFlags 
21040 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
21050 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 46  EX)!=0 ){.    pF
21060 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  rom->u.btree.pIn
21070 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  dex = 0;.  }.  r
21080 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21090 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
210a0 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
210b0 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
210c0 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65  id whereLoopDele
210d0 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
210e0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
210f0 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28   whereLoopClear(
21100 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65  db, p);.  sqlite
21110 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
21120 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20  }../*.** Free a 
21130 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
21140 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ure.*/.static vo
21150 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  id whereInfoFree
21160 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
21170 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
21180 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  {.  if( ALWAYS(p
21190 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 77 68  WInfo) ){.    wh
211a0 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
211b0 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20  pWInfo->sWC);.  
211c0 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d    while( pWInfo-
211d0 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20  >pLoops ){.     
211e0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20   WhereLoop *p = 
211f0 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a  pWInfo->pLoops;.
21200 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c        pWInfo->pL
21210 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c  oops = p->pNextL
21220 6f 6f 70 3b 0a 20 20 20 20 20 20 77 68 65 72 65  oop;.      where
21230 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70  LoopDelete(db, p
21240 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
21250 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
21260 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  WInfo);.  }.}../
21270 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72  *.** Insert or r
21280 65 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f  eplace a WhereLo
21290 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74  op entry using t
212a0 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70  he template supp
212b0 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  lied..**.** An e
212c0 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
212d0 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65  p entry might be
212e0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20   overwritten if 
212f0 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65  the new template
21300 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e  .** is better an
21310 64 20 68 61 73 20 66 65 77 65 72 20 64 65 70 65  d has fewer depe
21320 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68  ndencies.  Or th
21330 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20  e template will 
21340 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e  be ignored.** an
21350 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c  d no insert will
21360 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78 69   occur if an exi
21370 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
21380 69 73 20 66 61 73 74 65 72 20 61 6e 64 20 68 61  is faster and ha
21390 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e  s.** fewer depen
213a0 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65  dencies than the
213b0 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65   template.  Othe
213c0 72 77 69 73 65 20 61 20 6e 65 77 20 57 68 65 72  rwise a new Wher
213d0 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65  eLoop is.** adde
213e0 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74  d based on the t
213f0 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49  emplate..**.** I
21400 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  f pBuilder->pOrS
21410 65 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  et is not NULL t
21420 68 65 6e 20 77 65 20 6f 6e 6c 79 20 63 61 72 65  hen we only care
21430 20 61 62 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a   about only the.
21440 2a 2a 20 70 72 65 72 65 71 75 69 73 69 74 65 73  ** prerequisites
21450 20 61 6e 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f   and rRun and nO
21460 75 74 20 63 6f 73 74 73 20 6f 66 20 74 68 65 20  ut costs of the 
21470 4e 20 62 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54  N best loops.  T
21480 68 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  hat.** informati
21490 6f 6e 20 69 73 20 67 61 74 68 65 72 65 64 20 69  on is gathered i
214a0 6e 20 74 68 65 20 70 42 75 69 6c 64 65 72 2d 3e  n the pBuilder->
214b0 70 4f 72 53 65 74 20 6f 62 6a 65 63 74 2e 20 20  pOrSet object.  
214c0 54 68 69 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20  This special.** 
214d0 70 72 6f 63 65 73 73 69 6e 67 20 6d 6f 64 65 20  processing mode 
214e0 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72  is used only for
214f0 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65   OR clause proce
21500 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ssing..**.** Whe
21510 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d  n accumulating m
21520 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77  ultiple loops (w
21530 68 65 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  hen pBuilder->pO
21540 72 53 65 74 20 69 73 20 4e 55 4c 4c 29 20 77 65  rSet is NULL) we
21550 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67 68 74 20  .** still might 
21560 6f 76 65 72 77 72 69 74 65 20 73 69 6d 69 6c 61  overwrite simila
21570 72 20 6c 6f 6f 70 73 20 77 69 74 68 20 74 68 65  r loops with the
21580 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 66   new template if
21590 20 74 68 65 0a 2a 2a 20 74 65 6d 70 6c 61 74 65   the.** template
215a0 20 69 73 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f   is better.  Loo
215b0 70 73 20 6d 61 79 20 62 65 20 6f 76 65 72 77 72  ps may be overwr
215c0 69 74 74 65 6e 20 69 66 20 74 68 65 20 66 6f 6c  itten if the fol
215d0 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69  lowing .** condi
215e0 74 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a  tions are met:.*
215f0 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65  *.**    (1)  The
21600 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  y have the same 
21610 69 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20  iTab..**    (2) 
21620 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73   They have the s
21630 61 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a  ame iSortIdx..**
21640 20 20 20 20 28 33 29 20 20 54 68 65 20 74 65 6d      (3)  The tem
21650 70 6c 61 74 65 20 68 61 73 20 73 61 6d 65 20 6f  plate has same o
21660 72 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  r fewer dependen
21670 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 63 75  cies than the cu
21680 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20  rrent loop.**   
21690 20 28 34 29 20 20 54 68 65 20 74 65 6d 70 6c 61   (4)  The templa
216a0 74 65 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  te has the same 
216b0 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68  or lower cost th
216c0 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  an the current l
216d0 6f 6f 70 0a 2a 2a 20 20 20 20 28 35 29 20 20 54  oop.**    (5)  T
216e0 68 65 20 74 65 6d 70 6c 61 74 65 20 75 73 65 73  he template uses
216f0 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 74   more terms of t
21700 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 62 75  he same index bu
21710 74 20 68 61 73 20 6e 6f 20 61 64 64 69 74 69 6f  t has no additio
21720 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  nal.**         d
21730 65 70 65 6e 64 65 6e 63 69 65 73 20 20 20 20 20  ependencies     
21740 20 20 20 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20       .*/.static 
21750 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  int whereLoopIns
21760 65 72 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  ert(WhereLoopBui
21770 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
21780 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
21790 6c 61 74 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f  late){.  WhereLo
217a0 6f 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a 70 2c  op **ppPrev, *p,
217b0 20 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 57   *pNext = 0;.  W
217c0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
217d0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
217e0 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nfo;.  sqlite3 *
217f0 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
21800 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  rse->db;..  /* I
21810 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  f pBuilder->pOrS
21820 65 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  et is defined, t
21830 68 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72  hen only keep tr
21840 61 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73  ack of the costs
21850 0a 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71  .  ** and prereq
21860 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  s..  */.  if( pB
21870 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d  uilder->pOrSet!=
21880 30 20 29 7b 0a 23 69 66 20 57 48 45 52 45 54 52  0 ){.#if WHERETR
21890 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
218a0 75 31 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72  u16 n = pBuilder
218b0 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20  ->pOrSet->n;.   
218c0 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a   int x =.#endif.
218d0 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72      whereOrInser
218e0 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  t(pBuilder->pOrS
218f0 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  et, pTemplate->p
21900 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65  rereq, pTemplate
21910 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20  ->rRun,.        
21920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21930 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d              pTem
21940 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69  plate->nOut);.#i
21950 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
21960 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
21970 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
21980 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
21990 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
219a0 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20  ebugPrintf(x?"  
219b0 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f   or-%d:  ":"   o
219c0 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20  r-X:  ", n);.   
219d0 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
219e0 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75  t(pTemplate, pBu
219f0 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20  ilder->pWC);.   
21a00 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65   }.#endif.    re
21a10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21a20 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
21a30 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
21a40 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 6f 76   WhereLoop to ov
21a50 65 72 77 72 69 74 65 2c 20 6f 72 20 77 68 69 63  erwrite, or whic
21a60 68 20 74 61 6b 65 73 0a 20 20 2a 2a 20 70 72 69  h takes.  ** pri
21a70 6f 72 69 74 79 20 6f 76 65 72 20 70 54 65 6d 70  ority over pTemp
21a80 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  late..  */.  for
21a90 28 70 70 50 72 65 76 3d 26 70 57 49 6e 66 6f 2d  (ppPrev=&pWInfo-
21aa0 3e 70 4c 6f 6f 70 73 2c 20 70 3d 2a 70 70 50 72  >pLoops, p=*ppPr
21ab0 65 76 3b 20 70 3b 20 70 70 50 72 65 76 3d 26 70  ev; p; ppPrev=&p
21ac0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a  ->pNextLoop, p=*
21ad0 70 70 50 72 65 76 29 7b 0a 20 20 20 20 69 66 28  ppPrev){.    if(
21ae0 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c   p->iTab!=pTempl
21af0 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e  ate->iTab || p->
21b00 69 53 6f 72 74 49 64 78 21 3d 70 54 65 6d 70 6c  iSortIdx!=pTempl
21b10 61 74 65 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b  ate->iSortIdx ){
21b20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 65 69 74  .      /* If eit
21b30 68 65 72 20 74 68 65 20 69 54 61 62 20 6f 72 20  her the iTab or 
21b40 69 53 6f 72 74 49 64 78 20 76 61 6c 75 65 73 20  iSortIdx values 
21b50 66 6f 72 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f  for two WhereLoo
21b60 70 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 0a  p are different.
21b70 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
21b80 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e  ose WhereLoops n
21b90 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64  eed to be consid
21ba0 65 72 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  ered separately.
21bb0 20 20 4e 65 69 74 68 65 72 20 69 73 0a 20 20 20    Neither is.   
21bc0 20 20 20 2a 2a 20 61 20 63 61 6e 64 69 64 61 74     ** a candidat
21bd0 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65  e to replace the
21be0 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20   other. */.     
21bf0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
21c00 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 63  .    /* In the c
21c10 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
21c20 61 74 69 6f 6e 2c 20 74 68 65 20 72 53 65 74 75  ation, the rSetu
21c30 70 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65  p value is eithe
21c40 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72  r zero.    ** or
21c50 20 74 68 65 20 63 6f 73 74 20 6f 66 20 62 75 69   the cost of bui
21c60 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74  lding an automat
21c70 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29  ic index (NlogN)
21c80 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20   and the NlogN. 
21c90 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d     ** is the sam
21ca0 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65  e for compatible
21cb0 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a   WhereLoops. */.
21cc0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
21cd0 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d  Setup==0 || pTem
21ce0 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30  plate->rSetup==0
21cf0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
21d00 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d     || p->rSetup=
21d10 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
21d20 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68  up );..    /* wh
21d30 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
21d40 29 20 61 6c 77 61 79 73 20 67 65 6e 65 72 61 74  ) always generat
21d50 65 73 20 61 6e 64 20 69 6e 73 65 72 74 73 20 74  es and inserts t
21d60 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
21d70 65 78 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 66  ex.    ** case f
21d80 69 72 73 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d  irst.  Hence com
21d90 70 61 74 69 62 6c 65 20 63 61 6e 64 69 64 61 74  patible candidat
21da0 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76  e WhereLoops nev
21db0 65 72 20 68 61 76 65 20 61 20 6c 61 72 67 65 72  er have a larger
21dc0 0a 20 20 20 20 2a 2a 20 72 53 65 74 75 70 2e 20  .    ** rSetup. 
21dd0 43 61 6c 6c 20 74 68 69 73 20 53 45 54 55 50 2d  Call this SETUP-
21de0 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20  INVARIANT */.   
21df0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74   assert( p->rSet
21e00 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up>=pTemplate->r
21e10 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 69 66  Setup );..    if
21e20 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
21e30 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
21e40 29 3d 3d 70 2d 3e 70 72 65 72 65 71 0a 20 20 20  )==p->prereq.   
21e50 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d    && p->rSetup<=
21e60 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
21e70 70 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  p.     && p->rRu
21e80 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n<=pTemplate->rR
21e90 75 6e 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f  un.     && p->nO
21ea0 75 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  ut<=pTemplate->n
21eb0 4f 75 74 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Out.    ){.     
21ec0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
21ed0 74 61 6b 65 6e 20 77 68 65 6e 20 70 20 69 73 20  taken when p is 
21ee0 65 71 75 61 6c 20 6f 72 20 62 65 74 74 65 72 20  equal or better 
21ef0 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 20 69  than pTemplate i
21f00 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  n .      ** all 
21f10 6f 66 20 28 31 29 20 64 65 70 65 6e 64 65 6e 63  of (1) dependenc
21f20 69 65 73 20 28 32 29 20 73 65 74 75 70 2d 63 6f  ies (2) setup-co
21f30 73 74 2c 20 28 33 29 20 72 75 6e 2d 63 6f 73 74  st, (3) run-cost
21f40 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28  , and.      ** (
21f50 34 29 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  4) number of out
21f60 70 75 74 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20  put rows. */.   
21f70 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
21f80 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  etup==pTemplate-
21f90 3e 72 53 65 74 75 70 20 29 3b 0a 20 20 20 20 20  >rSetup );.     
21fa0 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71 3d 3d   if( p->prereq==
21fb0 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
21fc0 71 0a 20 20 20 20 20 20 20 26 26 20 70 2d 3e 6e  q.       && p->n
21fd0 4c 54 65 72 6d 3c 70 54 65 6d 70 6c 61 74 65 2d  LTerm<pTemplate-
21fe0 3e 6e 4c 54 65 72 6d 0a 20 20 20 20 20 20 20 26  >nLTerm.       &
21ff0 26 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  & (p->wsFlags & 
22000 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61  pTemplate->wsFla
22010 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
22020 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26  ED)!=0.       &&
22030 20 28 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e   (p->u.btree.pIn
22040 64 65 78 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  dex==pTemplate->
22050 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 0a 20  u.btree.pIndex. 
22060 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 65 6d           || pTem
22070 70 6c 61 74 65 2d 3e 72 52 75 6e 2b 70 2d 3e 6e  plate->rRun+p->n
22080 4c 54 65 72 6d 3c 3d 70 2d 3e 72 52 75 6e 2b 70  LTerm<=p->rRun+p
22090 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d  Template->nLTerm
220a0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
220b0 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20     /* Overwrite 
220c0 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  an existing Wher
220d0 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 73 69  eLoop with an si
220e0 6d 69 6c 61 72 20 6f 6e 65 20 74 68 61 74 20 75  milar one that u
220f0 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  ses.        ** m
22100 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ore terms of the
22110 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
22120 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65    pNext = p->pNe
22130 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  xtLoop;.        
22140 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
22150 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70  se{.        /* p
22160 54 65 6d 70 6c 61 74 65 20 69 73 20 6e 6f 74 20  Template is not 
22170 68 65 6c 70 66 75 6c 2e 0a 20 20 20 20 20 20 20  helpful..       
22180 20 2a 2a 20 52 65 74 75 72 6e 20 77 69 74 68 6f   ** Return witho
22190 75 74 20 63 68 61 6e 67 69 6e 67 20 6f 72 20 61  ut changing or a
221a0 64 64 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a  dding anything *
221b0 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77  /.        goto w
221c0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e  hereLoopInsert_n
221d0 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oop;.      }.   
221e0 20 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70   }.    if( (p->p
221f0 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74  rereq & pTemplat
22200 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d  e->prereq)==pTem
22210 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20  plate->prereq.  
22220 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70     && p->rRun>=p
22230 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 0a 20  Template->rRun. 
22240 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d      && p->nOut>=
22250 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 0a  pTemplate->nOut.
22260 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
22270 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65 78 69  Overwrite an exi
22280 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
22290 77 69 74 68 20 61 20 62 65 74 74 65 72 20 6f 6e  with a better on
222a0 65 3a 20 6f 6e 65 20 74 68 61 74 20 69 73 0a 20  e: one that is. 
222b0 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 61       ** better a
222c0 74 20 6f 6e 65 20 6f 66 20 28 31 29 20 64 65 70  t one of (1) dep
222d0 65 6e 64 65 6e 63 69 65 73 2c 20 28 32 29 20 73  endencies, (2) s
222e0 65 74 75 70 2d 63 6f 73 74 2c 20 28 33 29 20 72  etup-cost, (3) r
222f0 75 6e 2d 63 6f 73 74 0a 20 20 20 20 20 20 2a 2a  un-cost.      **
22300 20 6f 72 20 28 34 29 20 6e 75 6d 62 65 72 20 6f   or (4) number o
22310 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2c 20 61  f output rows, a
22320 6e 64 20 69 73 20 6e 6f 20 77 6f 72 73 65 20 69  nd is no worse i
22330 6e 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 0a 20  n any of those. 
22340 20 20 20 20 20 2a 2a 20 63 61 74 65 67 6f 72 69       ** categori
22350 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  es. */.      ass
22360 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d  ert( p->rSetup>=
22370 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
22380 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e  p ); /* SETUP-IN
22390 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f  VARIANT above */
223a0 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70  .      pNext = p
223b0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
223c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
223d0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
223e0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
223f0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65   it means that e
22400 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c 64  ither p[] should
22410 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a   be overwritten.
22420 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c    ** with pTempl
22430 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78 69  ate[] if p[] exi
22440 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e 55  sts, or if p==NU
22450 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  LL then allocate
22460 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65 72   a new.  ** Wher
22470 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72 74  eLoop and insert
22480 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57 48   it..  */.#if WH
22490 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
224a0 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69 66 28   /* 0x8 */.  if(
224b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
224c0 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
224d0 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20  if( p!=0 ){.    
224e0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
224f0 69 6e 74 66 28 22 69 6e 73 2d 64 65 6c 3a 20 20  intf("ins-del:  
22500 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  ");.      whereL
22510 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 42 75 69  oopPrint(p, pBui
22520 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
22530 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
22540 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 6e 65  ugPrintf("ins-ne
22550 77 3a 20 20 22 29 3b 0a 20 20 20 20 77 68 65 72  w:  ");.    wher
22560 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
22570 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
22580 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  pWC);.  }.#endif
22590 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
225a0 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62     p = sqlite3Db
225b0 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
225c0 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
225d0 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
225e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
225f0 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c  OMEM;.    whereL
22600 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a  oopInit(p);.  }.
22610 20 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28    whereLoopXfer(
22620 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65  db, p, pTemplate
22630 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  );.  p->pNextLoo
22640 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 2a 70 70  p = pNext;.  *pp
22650 50 72 65 76 20 3d 20 70 3b 0a 20 20 69 66 28 20  Prev = p;.  if( 
22660 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
22670 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
22680 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65  )==0 ){.    Inde
22690 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75  x *pIndex = p->u
226a0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
226b0 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26 26     if( pIndex &&
226c0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30   pIndex->tnum==0
226d0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62   ){.      p->u.b
226e0 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
226f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
22700 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
22710 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
22720 66 20 74 68 65 20 69 6e 73 65 72 74 20 69 73 20  f the insert is 
22730 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 77 68 65 72 65  a no-op */.where
22740 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3a  LoopInsert_noop:
22750 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
22760 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
22770 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  /.  if( sqlite3W
22780 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
22790 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
227a0 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 6e  bugPrintf("ins-n
227b0 6f 6f 70 3a 20 22 29 3b 0a 20 20 20 20 77 68 65  oop: ");.    whe
227c0 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d  reLoopPrint(pTem
227d0 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d  plate, pBuilder-
227e0 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  >pWC);.  }.#endi
227f0 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
22800 45 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  E_OK;  .}../*.**
22810 20 41 64 6a 75 73 74 20 74 68 65 20 57 68 65 72   Adjust the Wher
22820 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65  eLoop.nOut value
22830 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63   downward to acc
22840 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f  ount for terms o
22850 66 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63  f the.** WHERE c
22860 6c 61 75 73 65 20 74 68 61 74 20 72 65 66 65 72  lause that refer
22870 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75  ence the loop bu
22880 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
22890 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e  used by an.** in
228a0 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  dex..**.** In th
228b0 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
228c0 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 66 69  entation, the fi
228d0 72 73 74 20 65 78 74 72 61 20 57 48 45 52 45 20  rst extra WHERE 
228e0 63 6c 61 75 73 65 20 74 65 72 6d 20 72 65 64 75  clause term redu
228f0 63 65 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  ces.** the numbe
22900 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
22910 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20   by a factor of 
22920 31 30 20 61 6e 64 20 65 61 63 68 20 61 64 64 69  10 and each addi
22930 74 69 6f 6e 61 6c 20 74 65 72 6d 0a 2a 2a 20 72  tional term.** r
22940 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65  educes the numbe
22950 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
22960 20 62 79 20 73 71 72 74 28 32 29 2e 0a 2a 2f 0a   by sqrt(2)..*/.
22970 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
22980 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73  eLoopOutputAdjus
22990 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
229a0 57 43 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  WC, WhereLoop *p
229b0 4c 6f 6f 70 29 7b 0a 20 20 57 68 65 72 65 54 65  Loop){.  WhereTe
229c0 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a  rm *pTerm, *pX;.
229d0 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c    Bitmask notAll
229e0 6f 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e  owed = ~(pLoop->
229f0 70 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61  prereq|pLoop->ma
22a00 73 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69  skSelf);.  int i
22a10 2c 20 6a 3b 0a 0a 20 20 69 66 28 20 21 4f 70 74  , j;..  if( !Opt
22a20 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
22a30 28 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50  (pWC->pWInfo->pP
22a40 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45  arse->db, SQLITE
22a50 5f 41 64 6a 75 73 74 4f 75 74 45 73 74 29 20 29  _AdjustOutEst) )
22a60 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
22a70 7d 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e  }.  for(i=pWC->n
22a80 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d  Term, pTerm=pWC-
22a90 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54  >a; i>0; i--, pT
22aa0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
22ab0 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
22ac0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21  & TERM_VIRTUAL)!
22ad0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
22ae0 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
22af0 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d  eqAll & pLoop->m
22b00 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f  askSelf)==0 ) co
22b10 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
22b20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
22b30 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21  l & notAllowed)!
22b40 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
22b50 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e     for(j=pLoop->
22b60 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20  nLTerm-1; j>=0; 
22b70 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d  j--){.      pX =
22b80 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
22b90 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  ];.      if( pX=
22ba0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
22bb0 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65       if( pX==pTe
22bc0 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rm ) break;.    
22bd0 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e    if( pX->iParen
22be0 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61  t>=0 && (&pWC->a
22bf0 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d  [pX->iParent])==
22c00 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20  pTerm ) break;. 
22c10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30     }.    if( j<0
22c20 20 29 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b   ) pLoop->nOut +
22c30 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  = pTerm->truthPr
22c40 6f 62 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ob;.  }.}../*.**
22c50 20 57 65 20 68 61 76 65 20 73 6f 20 66 61 72 20   We have so far 
22c60 6d 61 74 63 68 65 64 20 70 42 75 69 6c 64 65 72  matched pBuilder
22c70 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
22c80 6e 45 71 20 74 65 72 6d 73 20 6f 66 20 74 68 65  nEq terms of the
22c90 20 69 6e 64 65 78 20 70 49 6e 64 65 78 2e 0a 2a   index pIndex..*
22ca0 2a 20 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f  * Try to match o
22cb0 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ne more..**.** I
22cc0 66 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d  f pProbe->tnum==
22cd0 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 70 49  0, that means pI
22ce0 6e 64 65 78 20 69 73 20 61 20 66 61 6b 65 20 69  ndex is a fake i
22cf0 6e 64 65 78 20 75 73 65 64 20 66 6f 72 20 74 68  ndex used for th
22d00 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
22d10 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61  MARY KEY..*/.sta
22d20 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
22d30 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 0a  pAddBtreeIndex(.
22d40 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
22d50 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 20  er *pBuilder,   
22d60 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
22d70 6f 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20  op factory */.  
22d80 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
22d90 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20  tem *pSrc,      
22da0 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  /* FROM clause t
22db0 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  erm being analyz
22dc0 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
22dd0 50 72 6f 62 65 2c 20 20 20 20 20 20 20 20 20 20  Probe,          
22de0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
22df0 64 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20  dex on pSrc */. 
22e00 20 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20   LogEst nInMul  
22e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e20 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f   /* log(Number o
22e30 66 20 69 74 65 72 61 74 69 6f 6e 73 20 64 75 65  f iterations due
22e40 20 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20   to IN) */.){.  
22e50 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
22e60 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
22e70 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20  Info;  /* WHERE 
22e80 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78 74 20  analyse context 
22e90 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
22ea0 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
22eb0 72 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50  rse;        /* P
22ec0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
22ed0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
22ee0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
22ef0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
22f00 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f  connection mallo
22f10 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  c context */.  W
22f20 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20  hereLoop *pNew; 
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22f40 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65  * Template Where
22f50 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73 74  Loop under const
22f60 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65  ruction */.  Whe
22f70 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
22f80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22f90 41 20 57 68 65 72 65 54 65 72 6d 20 75 6e 64 65  A WhereTerm unde
22fa0 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20  r consideration 
22fb0 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b  */.  int opMask;
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fd0 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70       /* Valid op
22fe0 65 72 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73  erators for cons
22ff0 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65  traints */.  Whe
23000 72 65 53 63 61 6e 20 73 63 61 6e 3b 20 20 20 20  reScan scan;    
23010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23020 49 74 65 72 61 74 6f 72 20 66 6f 72 20 57 48 45  Iterator for WHE
23030 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69  RE terms */.  Bi
23040 74 6d 61 73 6b 20 73 61 76 65 64 5f 70 72 65 72  tmask saved_prer
23050 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  eq;           /*
23060 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
23070 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  of pNew->prereq 
23080 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
23090 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  LTerm;          
230a0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
230b0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
230c0 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20  nLTerm */.  u16 
230d0 73 61 76 65 64 5f 6e 45 71 3b 20 20 20 20 20 20  saved_nEq;      
230e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
230f0 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
23100 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
23110 45 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  Eq */.  u16 save
23120 64 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20 20 20  d_nSkip;        
23130 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
23140 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
23150 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70  w->u.btree.nSkip
23160 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64 5f   */.  u32 saved_
23170 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  wsFlags;        
23180 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
23190 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
231a0 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f  >wsFlags */.  Lo
231b0 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b  gEst saved_nOut;
231c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
231d0 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
231e0 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f  of pNew->nOut */
231f0 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
23200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23210 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
23220 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  he column in the
23230 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
23240 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
23250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
23260 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
23270 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 3b 20  LogEst nRowEst; 
23280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23290 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 69 6e 64  /* Estimated ind
232a0 65 78 20 73 65 6c 65 63 74 69 76 69 74 79 20 2a  ex selectivity *
232b0 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53  /.  LogEst rLogS
232c0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
232d0 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d      /* Logarithm
232e0 20 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20 2a   of table size *
232f0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
23300 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d  Top = 0, *pBtm =
23310 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62   0; /* Top and b
23320 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73  ottom range cons
23330 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e  traints */..  pN
23340 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
23350 4e 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  New;.  if( db->m
23360 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
23370 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
23380 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70  M;..  assert( (p
23390 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
233a0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
233b0 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  E)==0 );.  asser
233c0 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  t( (pNew->wsFlag
233d0 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
233e0 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  MIT)==0 );.  if(
233f0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26   pNew->wsFlags &
23400 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
23410 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d   ){.    opMask =
23420 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20   WO_LT|WO_LE;.  
23430 7d 65 6c 73 65 20 69 66 28 20 70 50 72 6f 62 65  }else if( pProbe
23440 2d 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70 53  ->tnum<=0 || (pS
23450 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  rc->jointype & J
23460 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20  T_LEFT)!=0 ){.  
23470 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51    opMask = WO_EQ
23480 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_IN|WO_GT|WO_
23490 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a  GE|WO_LT|WO_LE;.
234a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d    }else{.    opM
234b0 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49  ask = WO_EQ|WO_I
234c0 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47  N|WO_ISNULL|WO_G
234d0 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f  T|WO_GE|WO_LT|WO
234e0 5f 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _LE;.  }.  if( p
234f0 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65  Probe->bUnordere
23500 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28  d ) opMask &= ~(
23510 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c  WO_GT|WO_GE|WO_L
23520 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73  T|WO_LE);..  ass
23530 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72  ert( pNew->u.btr
23540 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e  ee.nEq<=pProbe->
23550 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 69 66 28  nKeyCol );.  if(
23560 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
23570 45 71 20 3c 20 70 50 72 6f 62 65 2d 3e 6e 4b 65  Eq < pProbe->nKe
23580 79 43 6f 6c 20 29 7b 0a 20 20 20 20 69 43 6f 6c  yCol ){.    iCol
23590 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c   = pProbe->aiCol
235a0 75 6d 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65  umn[pNew->u.btre
235b0 65 2e 6e 45 71 5d 3b 0a 20 20 20 20 6e 52 6f 77  e.nEq];.    nRow
235c0 45 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Est = sqlite3Log
235d0 45 73 74 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f  Est(pProbe->aiRo
235e0 77 45 73 74 5b 70 4e 65 77 2d 3e 75 2e 62 74 72  wEst[pNew->u.btr
235f0 65 65 2e 6e 45 71 2b 31 5d 29 3b 0a 20 20 20 20  ee.nEq+1]);.    
23600 69 66 28 20 6e 52 6f 77 45 73 74 3d 3d 30 20 26  if( nRowEst==0 &
23610 26 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f  & pProbe->onErro
23620 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 6e 52 6f  r==OE_None ) nRo
23630 77 45 73 74 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  wEst = 1;.  }els
23640 65 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 2d 31  e{.    iCol = -1
23650 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 3d 20  ;.    nRowEst = 
23660 30 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  0;.  }.  pTerm =
23670 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26   whereScanInit(&
23680 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e  scan, pBuilder->
23690 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  pWC, pSrc->iCurs
236a0 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20 20 20 20 20  or, iCol,.      
236b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236c0 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65    opMask, pProbe
236d0 29 3b 0a 20 20 73 61 76 65 64 5f 6e 45 71 20 3d  );.  saved_nEq =
236e0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
236f0 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69  Eq;.  saved_nSki
23700 70 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  p = pNew->u.btre
23710 65 2e 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65 64  e.nSkip;.  saved
23720 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e  _nLTerm = pNew->
23730 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f  nLTerm;.  saved_
23740 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e  wsFlags = pNew->
23750 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64  wsFlags;.  saved
23760 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e  _prereq = pNew->
23770 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f  prereq;.  saved_
23780 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75  nOut = pNew->nOu
23790 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  t;.  pNew->rSetu
237a0 70 20 3d 20 30 3b 0a 20 20 72 4c 6f 67 53 69 7a  p = 0;.  rLogSiz
237b0 65 20 3d 20 65 73 74 4c 6f 67 28 73 71 6c 69 74  e = estLog(sqlit
237c0 65 33 4c 6f 67 45 73 74 28 70 50 72 6f 62 65 2d  e3LogEst(pProbe-
237d0 3e 61 69 52 6f 77 45 73 74 5b 30 5d 29 29 3b 0a  >aiRowEst[0]));.
237e0 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 0a 20    if( pTerm==0. 
237f0 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d    && saved_nEq==
23800 73 61 76 65 64 5f 6e 53 6b 69 70 0a 20 20 20 26  saved_nSkip.   &
23810 26 20 73 61 76 65 64 5f 6e 45 71 2b 31 3c 70 50  & saved_nEq+1<pP
23820 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20  robe->nKeyCol.  
23830 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f   && pProbe->aiRo
23840 77 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31  wEst[saved_nEq+1
23850 5d 3e 35 30 0a 20 20 29 7b 0a 20 20 20 20 4c 6f  ]>50.  ){.    Lo
23860 67 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20  gEst nIter;.    
23870 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
23880 71 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  q++;.    pNew->u
23890 2e 62 74 72 65 65 2e 6e 53 6b 69 70 2b 2b 3b 0a  .btree.nSkip++;.
238a0 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
238b0 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d  [pNew->nLTerm++]
238c0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
238d0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
238e0 5f 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20 6e  _SKIPSCAN;.    n
238f0 49 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Iter = sqlite3Lo
23900 67 45 73 74 28 70 50 72 6f 62 65 2d 3e 61 69 52  gEst(pProbe->aiR
23910 6f 77 45 73 74 5b 30 5d 2f 70 50 72 6f 62 65 2d  owEst[0]/pProbe-
23920 3e 61 69 52 6f 77 45 73 74 5b 73 61 76 65 64 5f  >aiRowEst[saved_
23930 6e 45 71 2b 31 5d 29 3b 0a 20 20 20 20 77 68 65  nEq+1]);.    whe
23940 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
23950 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53  dex(pBuilder, pS
23960 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 74 65  rc, pProbe, nIte
23970 72 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 20  r);.  }.  for(; 
23980 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
23990 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d   pTerm!=0; pTerm
239a0 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74   = whereScanNext
239b0 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 69 6e  (&scan)){.    in
239c0 74 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65  t nIn = 0;.#ifde
239d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
239e0 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
239f0 20 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64     int nRecValid
23a00 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65   = pBuilder->nRe
23a10 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20  cValid;.#endif. 
23a20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
23a30 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e  Operator==WO_ISN
23a40 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77  ULL || (pTerm->w
23a50 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c  tFlags&TERM_VNUL
23a60 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 28  L)!=0).     && (
23a70 69 43 6f 6c 3c 30 20 7c 7c 20 70 53 72 63 2d 3e  iCol<0 || pSrc->
23a80 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
23a90 2e 6e 6f 74 4e 75 6c 6c 29 0a 20 20 20 20 29 7b  .notNull).    ){
23aa0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
23ab0 20 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e   /* ignore IS [N
23ac0 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  OT] NULL constra
23ad0 69 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c  ints on NOT NULL
23ae0 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
23af0 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  }.    if( pTerm-
23b00 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
23b10 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20  New->maskSelf ) 
23b20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 61  continue;..    a
23b30 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75  ssert( pNew->nOu
23b40 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b  t==saved_nOut );
23b50 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ..    pNew->wsFl
23b60 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
23b70 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ags;.    pNew->u
23b80 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
23b90 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77  ed_nEq;.    pNew
23ba0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
23bb0 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28  _nLTerm;.    if(
23bc0 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
23bd0 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d  (db, pNew, pNew-
23be0 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65  >nLTerm+1) ) bre
23bf0 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20  ak; /* OOM */.  
23c00 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70    pNew->aLTerm[p
23c10 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d  New->nLTerm++] =
23c20 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77   pTerm;.    pNew
23c30 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76 65  ->prereq = (save
23c40 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d  d_prereq | pTerm
23c50 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20 26  ->prereqRight) &
23c60 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66   ~pNew->maskSelf
23c70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e  ;.    pNew->rRun
23c80 20 3d 20 72 4c 6f 67 53 69 7a 65 3b 20 2f 2a 20   = rLogSize; /* 
23c90 42 61 73 65 6c 69 6e 65 20 63 6f 73 74 20 69 73  Baseline cost is
23ca0 20 6c 6f 67 32 28 4e 29 2e 20 20 41 64 6a 75 73   log2(N).  Adjus
23cb0 74 6d 65 6e 74 73 20 62 65 6c 6f 77 20 2a 2f 0a  tments below */.
23cc0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
23cd0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
23ce0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
23cf0 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
23d00 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  Expr;.      pNew
23d10 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
23d20 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20  RE_COLUMN_IN;.  
23d30 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
23d40 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
23d50 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
23d60 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e          /* "x IN
23d70 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20   (SELECT ...)": 
23d80 20 54 55 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c   TUNING: the SEL
23d90 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20 72  ECT returns 25 r
23da0 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e  ows */.        n
23db0 49 6e 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74  In = 46;  assert
23dc0 28 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 46==sqlite3Log
23dd0 45 73 74 28 32 35 29 20 29 3b 0a 20 20 20 20 20  Est(25) );.     
23de0 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
23df0 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  S(pExpr->x.pList
23e00 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   && pExpr->x.pLi
23e10 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
23e20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28        /* "x IN (
23e30 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e  value, value, ..
23e40 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e  .)" */.        n
23e50 49 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  In = sqlite3LogE
23e60 73 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  st(pExpr->x.pLis
23e70 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
23e80 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72   }.      pNew->r
23e90 52 75 6e 20 2b 3d 20 6e 49 6e 3b 0a 20 20 20 20  Run += nIn;.    
23ea0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
23eb0 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65  nEq++;.      pNe
23ec0 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73  w->nOut = nRowEs
23ed0 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e  t + nInMul + nIn
23ee0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
23ef0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
23f00 20 26 20 28 57 4f 5f 45 51 29 20 29 7b 0a 20 20   & (WO_EQ) ){.  
23f10 20 20 20 20 61 73 73 65 72 74 28 0a 20 20 20 20      assert(.    
23f20 20 20 20 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61      (pNew->wsFla
23f30 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
23f40 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52 45 5f 43 4f  MN_NULL|WHERE_CO
23f50 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 53 4b  LUMN_IN|WHERE_SK
23f60 49 50 53 43 41 4e 29 29 21 3d 30 0a 20 20 20 20  IPSCAN))!=0.    
23f70 20 20 20 20 7c 7c 20 6e 49 6e 4d 75 6c 3d 3d 30      || nInMul==0
23f80 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
23f90 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
23fa0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
23fb0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
23fc0 3c 30 20 20 0a 20 20 20 20 20 20 20 7c 7c 20 28  <0  .       || (
23fd0 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21  pProbe->onError!
23fe0 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 6e 49 6e 4d  =OE_None && nInM
23ff0 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ul==0.          
24000 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65   && pNew->u.btre
24010 65 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e  e.nEq==pProbe->n
24020 4b 65 79 43 6f 6c 2d 31 29 0a 20 20 20 20 20 20  KeyCol-1).      
24030 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
24040 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  t( (pNew->wsFlag
24050 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
24060 5f 49 4e 29 3d 3d 30 20 7c 7c 20 69 43 6f 6c 3c  _IN)==0 || iCol<
24070 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  0 );.        pNe
24080 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
24090 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20  ERE_ONEROW;.    
240a0 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e    }.      pNew->
240b0 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20  u.btree.nEq++;. 
240c0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
240d0 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d  = nRowEst + nInM
240e0 75 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ul;.    }else if
240f0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
24100 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29  or & (WO_ISNULL)
24110 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
24120 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
24130 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20  _COLUMN_NULL;.  
24140 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
24150 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 2f  e.nEq++;.      /
24160 2a 20 54 55 4e 49 4e 47 3a 20 49 53 20 4e 55 4c  * TUNING: IS NUL
24170 4c 20 73 65 6c 65 63 74 73 20 32 20 72 6f 77 73  L selects 2 rows
24180 20 2a 2f 0a 20 20 20 20 20 20 6e 49 6e 20 3d 20   */.      nIn = 
24190 31 30 3b 20 20 61 73 73 65 72 74 28 20 31 30 3d  10;  assert( 10=
241a0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
241b0 29 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ) );.      pNew-
241c0 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20  >nOut = nRowEst 
241d0 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a  + nInMul + nIn;.
241e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
241f0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
24200 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29   (WO_GT|WO_GE) )
24210 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
24220 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
24230 6f 72 20 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20  or & WO_GT );.  
24240 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
24250 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
24260 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20   WO_GE );.      
24270 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
24280 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
24290 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49  NGE|WHERE_BTM_LI
242a0 4d 49 54 3b 0a 20 20 20 20 20 20 70 42 74 6d 20  MIT;.      pBtm 
242b0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  = pTerm;.      p
242c0 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Top = 0;.    }el
242d0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
242e0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
242f0 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  or & (WO_LT|WO_L
24300 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  E) );.      test
24310 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
24320 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 54 20 29  erator & WO_LT )
24330 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
24340 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
24350 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20  or & WO_LE );.  
24360 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
24370 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
24380 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f  N_RANGE|WHERE_TO
24390 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70  P_LIMIT;.      p
243a0 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  Top = pTerm;.   
243b0 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d     pBtm = (pNew-
243c0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
243d0 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f  _BTM_LIMIT)!=0 ?
243e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
243f0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
24400 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d  rm[pNew->nLTerm-
24410 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 20 20  2] : 0;.    }.  
24420 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c    if( pNew->wsFl
24430 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
24440 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  MN_RANGE ){.    
24450 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74    /* Adjust nOut
24460 20 61 6e 64 20 72 52 75 6e 20 66 6f 72 20 53 54   and rRun for ST
24470 41 54 33 20 72 61 6e 67 65 20 76 61 6c 75 65 73  AT3 range values
24480 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
24490 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61  ( pNew->nOut==sa
244a0 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20  ved_nOut );.    
244b0 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e    whereRangeScan
244c0 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69  Est(pParse, pBui
244d0 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70  lder, pBtm, pTop
244e0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 23  , pNew);.    }.#
244f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
24500 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
24510 54 34 0a 20 20 20 20 69 66 28 20 6e 49 6e 4d 75  T4.    if( nInMu
24520 6c 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50  l==0 .     && pP
24530 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20  robe->nSample . 
24540 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62      && pNew->u.b
24550 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65  tree.nEq<=pProbe
24560 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20  ->nSampleCol.   
24570 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
24580 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
24590 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20 20 20  ITE_Stat3) .    
245a0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
245b0 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
245c0 78 70 72 3b 0a 20 20 20 20 20 20 74 52 6f 77 63  xpr;.      tRowc
245d0 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20  nt nOut = 0;.   
245e0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
245f0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
24600 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30  Q|WO_ISNULL))!=0
24610 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
24620 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
24630 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29  erator & WO_EQ )
24640 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
24650 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
24660 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
24670 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
24680 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
24690 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c  st(pParse, pBuil
246a0 64 65 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  der, pExpr->pRig
246b0 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20  ht, &nOut);.    
246c0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65    }else if( (pTe
246d0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
246e0 57 4f 5f 49 4e 29 0a 20 20 20 20 20 20 20 20 20  WO_IN).         
246f0 20 20 20 20 26 26 20 20 21 45 78 70 72 48 61 73      &&  !ExprHas
24700 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
24710 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 20 29  EP_xIsSelect)  )
24720 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
24730 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50  hereInScanEst(pP
24740 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
24750 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20  pExpr->x.pList, 
24760 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a  &nOut);.      }.
24770 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f        assert( nO
24780 75 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  ut==0 || rc==SQL
24790 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
247a0 69 66 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20  if( nOut ){.    
247b0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
247c0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e   sqlite3LogEst(n
247d0 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Out);.        if
247e0 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76  ( pNew->nOut>sav
247f0 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e  ed_nOut ) pNew->
24800 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
24810 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
24820 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
24830 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
24840 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   (WHERE_IDX_ONLY
24850 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20  |WHERE_IPK))==0 
24860 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 61 63 68  ){.      /* Each
24870 20 72 6f 77 20 69 6e 76 6f 6c 76 65 73 20 61 20   row involves a 
24880 73 74 65 70 20 6f 66 20 74 68 65 20 69 6e 64 65  step of the inde
24890 78 2c 20 74 68 65 6e 20 61 20 62 69 6e 61 72 79  x, then a binary
248a0 20 73 65 61 72 63 68 20 6f 66 0a 20 20 20 20 20   search of.     
248b0 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20 74 61 62   ** the main tab
248c0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  le */.      pNew
248d0 2d 3e 72 52 75 6e 20 3d 20 20 73 71 6c 69 74 65  ->rRun =  sqlite
248e0 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d  3LogEstAdd(pNew-
248f0 3e 72 52 75 6e 2c 72 4c 6f 67 53 69 7a 65 3e 32  >rRun,rLogSize>2
24900 37 20 3f 20 72 4c 6f 67 53 69 7a 65 2d 31 37 20  7 ? rLogSize-17 
24910 3a 20 31 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  : 10);.    }.   
24920 20 2f 2a 20 53 74 65 70 20 63 6f 73 74 20 66 6f   /* Step cost fo
24930 72 20 65 61 63 68 20 6f 75 74 70 75 74 20 72 6f  r each output ro
24940 77 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 72  w */.    pNew->r
24950 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
24960 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75  EstAdd(pNew->rRu
24970 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a  n, pNew->nOut);.
24980 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74      whereLoopOut
24990 70 75 74 41 64 6a 75 73 74 28 70 42 75 69 6c 64  putAdjust(pBuild
249a0 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77 29 3b 0a  er->pWC, pNew);.
249b0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
249c0 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
249d0 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 69 66  r, pNew);.    if
249e0 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
249f0 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
24a00 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  IT)==0.     && p
24a10 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
24a20 3c 28 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  <(pProbe->nKeyCo
24a30 6c 20 2b 20 28 70 50 72 6f 62 65 2d 3e 7a 4e 61  l + (pProbe->zNa
24a40 6d 65 21 3d 30 29 29 0a 20 20 20 20 29 7b 0a 20  me!=0)).    ){. 
24a50 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64       whereLoopAd
24a60 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
24a70 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
24a80 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b  be, nInMul+nIn);
24a90 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d  .    }.    pNew-
24aa0 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
24ab0 75 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ut;.#ifdef SQLIT
24ac0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
24ad0 52 5f 53 54 41 54 34 0a 20 20 20 20 70 42 75 69  R_STAT4.    pBui
24ae0 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
24af0 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e  = nRecValid;.#en
24b00 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e  dif.  }.  pNew->
24b10 70 72 65 72 65 71 20 3d 20 73 61 76 65 64 5f 70  prereq = saved_p
24b20 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75  rereq;.  pNew->u
24b30 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
24b40 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e  ed_nEq;.  pNew->
24b50 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20  u.btree.nSkip = 
24b60 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70  saved_nSkip;.  p
24b70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73  New->wsFlags = s
24b80 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20  aved_wsFlags;.  
24b90 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
24ba0 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d  ed_nOut;.  pNew-
24bb0 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f  >nLTerm = saved_
24bc0 6e 4c 54 65 72 6d 3b 0a 20 20 72 65 74 75 72 6e  nLTerm;.  return
24bd0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
24be0 74 75 72 6e 20 54 72 75 65 20 69 66 20 69 74 20  turn True if it 
24bf0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
24c00 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65   pIndex might be
24c10 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d   useful in.** im
24c20 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f  plementing the O
24c30 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69  RDER BY clause i
24c40 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a  n pBuilder..**.*
24c50 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69  * Return False i
24c60 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20  f pBuilder does 
24c70 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f  not contain an O
24c80 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
24c90 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
24ca0 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64   no way for pInd
24cb0 65 78 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20  ex to be useful 
24cc0 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  in implementing 
24cd0 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59  that.** ORDER BY
24ce0 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   clause..*/.stat
24cf0 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68  ic int indexMigh
24d00 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79  tHelpWithOrderBy
24d10 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
24d20 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
24d30 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
24d40 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29  .  int iCursor.)
24d50 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
24d60 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  B;.  int ii, jj;
24d70 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  ..  if( pIndex->
24d80 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74  bUnordered ) ret
24d90 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4f  urn 0;.  if( (pO
24da0 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  B = pBuilder->pW
24db0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d  Info->pOrderBy)=
24dc0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
24dd0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
24de0 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  B->nExpr; ii++){
24df0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
24e00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
24e10 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61  ipCollate(pOB->a
24e20 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  [ii].pExpr);.   
24e30 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
24e40 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
24e50 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 45  rn 0;.    if( pE
24e60 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75  xpr->iTable==iCu
24e70 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 66 6f  rsor ){.      fo
24e80 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65  r(jj=0; jj<pInde
24e90 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b  x->nKeyCol; jj++
24ea0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
24eb0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
24ec0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
24ed0 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  jj] ) return 1;.
24ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
24ef0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
24f00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
24f10 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31 73  bitmask where 1s
24f20 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
24f30 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
24f40 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
24f50 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64 20  e table is used 
24f60 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e  by an index.  On
24f70 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33 20  ly the first 63 
24f80 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73  columns are cons
24f90 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  idered..*/.stati
24fa0 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e  c Bitmask column
24fb0 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  sInIndex(Index *
24fc0 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b  pIdx){.  Bitmask
24fd0 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b   m = 0;.  int j;
24fe0 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e  .  for(j=pIdx->n
24ff0 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20  Column-1; j>=0; 
25000 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  j--){.    int x 
25010 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
25020 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d  [j];.    if( x>=
25030 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
25040 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b  ase( x==BMS-1 );
25050 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
25060 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20   x==BMS-2 );.   
25070 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29     if( x<BMS-1 )
25080 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29   m |= MASKBIT(x)
25090 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
250a0 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68  turn m;.}../* Ch
250b0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20  eck to see if a 
250c0 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 77 69  partial index wi
250d0 74 68 20 70 50 61 72 74 49 6e 64 65 78 57 68 65  th pPartIndexWhe
250e0 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a  re can be used.*
250f0 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * in the current
25100 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 20   query.  Return 
25110 74 72 75 65 20 69 66 20 69 74 20 63 61 6e 20 62  true if it can b
25120 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e  e and false if n
25130 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
25140 74 20 77 68 65 72 65 55 73 61 62 6c 65 50 61 72  t whereUsablePar
25150 74 69 61 6c 49 6e 64 65 78 28 69 6e 74 20 69 54  tialIndex(int iT
25160 61 62 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20  ab, WhereClause 
25170 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 57 68 65  *pWC, Expr *pWhe
25180 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  re){.  int i;.  
25190 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
251a0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65  ;.  for(i=0, pTe
251b0 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
251c0 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
251d0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
251e0 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
251f0 65 73 45 78 70 72 28 70 54 65 72 6d 2d 3e 70 45  esExpr(pTerm->pE
25200 78 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61  xpr, pWhere, iTa
25210 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  b) ) return 1;. 
25220 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
25230 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
25240 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
25250 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74  s for a single t
25260 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
25270 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c 65   where the table
25280 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69 65 64 20  .** is idenfied 
25290 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  by pBuilder->pNe
252a0 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74  w->iTab.  That t
252b0 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65  able is guarante
252c0 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d  ed to be.** a b-
252d0 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  tree table, not 
252e0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
252f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
25300 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
25310 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
25320 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
25330 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
25340 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
25350 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20   Bitmask mExtra 
25360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25370 45 78 74 72 61 20 70 72 65 72 65 71 75 65 73 69  Extra prerequesi
25380 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68  tes for using th
25390 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  is table */.){. 
253a0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
253b0 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fo;          /* 
253c0 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63  WHERE analysis c
253d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
253e0 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20  x *pProbe;      
253f0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
25400 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75  dex we are evalu
25410 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78  ating */.  Index
25420 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20   sPk;           
25430 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65         /* A fake
25440 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f   index object fo
25450 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  r the primary ke
25460 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61  y */.  tRowcnt a
25470 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20  iRowEstPk[2];   
25480 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 45     /* The aiRowE
25490 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74  st[] value for t
254a0 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a  he sPk index */.
254b0 20 20 69 31 36 20 61 69 43 6f 6c 75 6d 6e 50 6b    i16 aiColumnPk
254c0 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a   = -1;        /*
254d0 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76   The aColumn[] v
254e0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
254f0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c   index */.  SrcL
25500 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20  ist *pTabList;  
25510 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
25520 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
25530 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
25540 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54  tem *pSrc;  /* T
25550 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62  he FROM clause b
25560 74 72 65 65 20 74 65 72 6d 20 74 6f 20 61 64 64  tree term to add
25570 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
25580 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
25590 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68    /* Template Wh
255a0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
255b0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
255c0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
255d0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
255e0 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 49 64 78  /.  int iSortIdx
255f0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
25600 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20  /* Index number 
25610 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20 20 20  */.  int b;     
25620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25630 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61   /* A boolean va
25640 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  lue */.  LogEst 
25650 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
25660 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f       /* number o
25670 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
25680 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ble */.  LogEst 
25690 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20  rLogSize;       
256a0 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68       /* Logarith
256b0 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  m of the number 
256c0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
256d0 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  able */.  WhereC
256e0 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20  lause *pWC;     
256f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
25700 73 65 64 20 57 48 45 52 45 20 63 6c 61 75 73 65  sed WHERE clause
25710 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
25720 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
25730 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
25740 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20   queried */.  . 
25750 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
25760 2d 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f  ->pNew;.  pWInfo
25770 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
25780 6e 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74 20  nfo;.  pTabList 
25790 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
257a0 73 74 3b 0a 20 20 70 53 72 63 20 3d 20 70 54 61  st;.  pSrc = pTa
257b0 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d  bList->a + pNew-
257c0 3e 69 54 61 62 3b 0a 20 20 70 54 61 62 20 3d 20  >iTab;.  pTab = 
257d0 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57  pSrc->pTab;.  pW
257e0 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
257f0 43 3b 0a 20 20 61 73 73 65 72 74 28 20 21 49 73  C;.  assert( !Is
25800 56 69 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54  Virtual(pSrc->pT
25810 61 62 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ab) );..  if( pS
25820 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20  rc->pIndex ){.  
25830 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20    /* An INDEXED 
25840 42 59 20 63 6c 61 75 73 65 20 73 70 65 63 69 66  BY clause specif
25850 69 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  ies a particular
25860 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f   index to use */
25870 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53  .    pProbe = pS
25880 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65  rc->pIndex;.  }e
25890 6c 73 65 20 69 66 28 20 21 48 61 73 52 6f 77 69  lse if( !HasRowi
258a0 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70  d(pTab) ){.    p
258b0 50 72 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49  Probe = pTab->pI
258c0 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ndex;.  }else{. 
258d0 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
258e0 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  o INDEXED BY cla
258f0 75 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66  use.  Create a f
25900 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  ake Index object
25910 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a   in local.    **
25920 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f   variable sPk to
25930 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72   represent the r
25940 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79  owid primary key
25950 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68   index.  Make th
25960 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69  is.    ** fake i
25970 6e 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69  ndex the first i
25980 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64  n a chain of Ind
25990 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20  ex objects with 
259a0 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a  all of the real.
259b0 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74      ** indices t
259c0 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  o follow */.    
259d0 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20  Index *pFirst;  
259e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259f0 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c  /* First of real
25a00 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   indices on the 
25a10 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d  table */.    mem
25a20 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a  set(&sPk, 0, siz
25a30 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20  eof(Index));.   
25a40 20 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31   sPk.nKeyCol = 1
25a50 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75  ;.    sPk.aiColu
25a60 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b  mn = &aiColumnPk
25a70 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45  ;.    sPk.aiRowE
25a80 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b  st = aiRowEstPk;
25a90 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72  .    sPk.onError
25aa0 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20   = OE_Replace;. 
25ab0 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20     sPk.pTable = 
25ac0 70 54 61 62 3b 0a 20 20 20 20 61 69 52 6f 77 45  pTab;.    aiRowE
25ad0 73 74 50 6b 5b 30 5d 20 3d 20 70 54 61 62 2d 3e  stPk[0] = pTab->
25ae0 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 61 69 52  nRowEst;.    aiR
25af0 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a  owEstPk[1] = 1;.
25b00 20 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72      pFirst = pSr
25b10 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  c->pTab->pIndex;
25b20 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  .    if( pSrc->n
25b30 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a  otIndexed==0 ){.
25b40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61        /* The rea
25b50 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65  l indices of the
25b60 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20   table are only 
25b70 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68  considered if th
25b80 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49  e.      ** NOT I
25b90 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72  NDEXED qualifier
25ba0 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   is omitted from
25bb0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
25bc0 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e   */.      sPk.pN
25bd0 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20  ext = pFirst;.  
25be0 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d    }.    pProbe =
25bf0 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69   &sPk;.  }.  rSi
25c00 7a 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ze = sqlite3LogE
25c10 73 74 28 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74  st(pTab->nRowEst
25c20 29 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20  );.  rLogSize = 
25c30 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a  estLog(rSize);..
25c40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
25c50 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
25c60 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74  DEX.  /* Automat
25c70 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  ic indexes */.  
25c80 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70  if( !pBuilder->p
25c90 4f 72 53 65 74 0a 20 20 20 26 26 20 28 70 57 49  OrSet.   && (pWI
25ca0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  nfo->pParse->db-
25cb0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
25cc0 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20  AutoIndex)!=0.  
25cd0 20 26 26 20 70 53 72 63 2d 3e 70 49 6e 64 65 78   && pSrc->pIndex
25ce0 3d 3d 30 0a 20 20 20 26 26 20 21 70 53 72 63 2d  ==0.   && !pSrc-
25cf0 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 0a 20 20  >viaCoroutine.  
25d00 20 26 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49 6e   && !pSrc->notIn
25d10 64 65 78 65 64 0a 20 20 20 26 26 20 48 61 73 52  dexed.   && HasR
25d20 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20 26 26  owid(pTab).   &&
25d30 20 21 70 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c   !pSrc->isCorrel
25d40 61 74 65 64 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  ated.  ){.    /*
25d50 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f 2d 69   Generate auto-i
25d60 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70 73 20  ndex WhereLoops 
25d70 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
25d80 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57 68 65   *pTerm;.    Whe
25d90 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d  reTerm *pWCEnd =
25da0 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e   pWC->a + pWC->n
25db0 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54  Term;.    for(pT
25dc0 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d  erm=pWC->a; rc==
25dd0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65  SQLITE_OK && pTe
25de0 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
25df0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
25e00 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
25e10 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  t & pNew->maskSe
25e20 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  lf ) continue;. 
25e30 20 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e       if( termCan
25e40 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
25e50 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a 20 20  , pSrc, 0) ){.  
25e60 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
25e70 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20  ree.nEq = 1;.   
25e80 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
25e90 65 65 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20  ee.nSkip = 0;.  
25ea0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
25eb0 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  ree.pIndex = 0;.
25ec0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c          pNew->nL
25ed0 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
25ee0 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30    pNew->aLTerm[0
25ef0 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
25f00 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e     /* TUNING: On
25f10 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20  e-time cost for 
25f20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75  computing the au
25f30 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73  tomatic index is
25f40 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 72  .        ** appr
25f50 6f 78 69 6d 61 74 65 6c 79 20 37 2a 4e 2a 6c 6f  oximately 7*N*lo
25f60 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73  g2(N) where N is
25f70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
25f80 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a  ows in.        *
25f90 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * the table bein
25fa0 67 20 69 6e 64 65 78 65 64 2e 20 2a 2f 0a 20 20  g indexed. */.  
25fb0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
25fc0 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20  up = rLogSize + 
25fd0 72 53 69 7a 65 20 2b 20 32 38 3b 20 20 61 73 73  rSize + 28;  ass
25fe0 65 72 74 28 20 32 38 3d 3d 73 71 6c 69 74 65 33  ert( 28==sqlite3
25ff0 4c 6f 67 45 73 74 28 37 29 20 29 3b 0a 20 20 20  LogEst(7) );.   
26000 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
26010 45 61 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75  Each index looku
26020 70 20 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73  p yields 20 rows
26030 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
26040 54 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  This.        ** 
26050 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65  is more than the
26060 20 75 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20   usual guess of 
26070 31 30 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77  10 rows, since w
26080 65 20 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20  e have no way.  
26090 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77        ** of know
260a0 6e 69 6e 67 20 68 6f 77 20 73 65 6c 65 63 74 69  ning how selecti
260b0 76 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c  ve the index wil
260c0 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e  l ultimately be.
260d0 20 20 49 74 20 77 6f 75 6c 64 0a 20 20 20 20 20    It would.     
260e0 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72     ** not be unr
260f0 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  easonable to mak
26100 65 20 74 68 69 73 20 76 61 6c 75 65 20 6d 75 63  e this value muc
26110 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20  h larger. */.   
26120 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
26130 3d 20 34 33 3b 20 20 61 73 73 65 72 74 28 20 34  = 43;  assert( 4
26140 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
26150 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20  (20) );.        
26160 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c  pNew->rRun = sql
26170 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c  ite3LogEstAdd(rL
26180 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75  ogSize,pNew->nOu
26190 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  t);.        pNew
261a0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
261b0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20  E_AUTO_INDEX;.  
261c0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
261d0 65 71 20 3d 20 6d 45 78 74 72 61 20 7c 20 70 54  eq = mExtra | pT
261e0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
261f0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
26200 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
26210 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
26220 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
26230 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
26240 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
26250 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a  C_INDEX */..  /*
26260 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69   Loop over all i
26270 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f  ndices.  */.  fo
26280 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
26290 4b 20 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72  K && pProbe; pPr
262a0 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78  obe=pProbe->pNex
262b0 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a  t, iSortIdx++){.
262c0 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
262d0 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30  pPartIdxWhere!=0
262e0 0a 20 20 20 20 20 26 26 20 21 77 68 65 72 65 55  .     && !whereU
262f0 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65  sablePartialInde
26300 78 28 70 4e 65 77 2d 3e 69 54 61 62 2c 20 70 57  x(pNew->iTab, pW
26310 43 2c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74  C, pProbe->pPart
26320 49 64 78 57 68 65 72 65 29 20 29 7b 0a 20 20 20  IdxWhere) ){.   
26330 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a     continue;  /*
26340 20 50 61 72 74 69 61 6c 20 69 6e 64 65 78 20 69   Partial index i
26350 6e 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72  nappropriate for
26360 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20   this query */. 
26370 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 75     }.    pNew->u
26380 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a  .btree.nEq = 0;.
26390 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
263a0 65 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20  e.nSkip = 0;.   
263b0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
263c0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f  0;.    pNew->iSo
263d0 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70  rtIdx = 0;.    p
263e0 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
263f0 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
26400 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20  q = mExtra;.    
26410 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
26420 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ze;.    pNew->u.
26430 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
26440 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69  Probe;.    b = i
26450 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
26460 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64 65  hOrderBy(pBuilde
26470 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d  r, pProbe, pSrc-
26480 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f  >iCursor);.    /
26490 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45  * The ONEPASS_DE
264a0 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65  SIRED flags neve
264b0 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65  r occurs togethe
264c0 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59 20  r with ORDER BY 
264d0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
264e0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
264f0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
26500 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
26510 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  | b==0 );.    if
26520 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d  ( pProbe->tnum<=
26530 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  0 ){.      /* In
26540 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65  teger primary ke
26550 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  y index */.     
26560 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
26570 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20   WHERE_IPK;..   
26580 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65     /* Full table
26590 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70   scan */.      p
265a0 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
265b0 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30  b ? iSortIdx : 0
265c0 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
265d0 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20  G: Cost of full 
265e0 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 33 2a  table scan is 3*
265f0 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20  (N + log2(N)).. 
26600 20 20 20 20 20 2a 2a 20 20 2b 20 20 54 68 65 20       **  +  The 
26610 65 78 74 72 61 20 33 20 66 61 63 74 6f 72 20 69  extra 3 factor i
26620 73 20 74 6f 20 65 6e 63 6f 75 72 61 67 65 20 74  s to encourage t
26630 68 65 20 75 73 65 20 6f 66 20 69 6e 64 65 78 65  he use of indexe
26640 64 20 6c 6f 6f 6b 75 70 73 0a 20 20 20 20 20 20  d lookups.      
26650 2a 2a 20 20 20 20 20 6f 76 65 72 20 66 75 6c 6c  **     over full
26660 20 73 63 61 6e 73 2e 20 20 46 49 58 4d 45 20 2a   scans.  FIXME *
26670 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52  /.      pNew->rR
26680 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
26690 73 74 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67  stAdd(rSize,rLog
266a0 53 69 7a 65 29 20 2b 20 31 36 3b 0a 20 20 20 20  Size) + 16;.    
266b0 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
266c0 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65  tAdjust(pWC, pNe
266d0 77 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  w);.      rc = w
266e0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
266f0 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
26700 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
26710 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20   = rSize;.      
26720 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
26730 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26740 20 42 69 74 6d 61 73 6b 20 6d 3b 0a 20 20 20 20   Bitmask m;.    
26750 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 69 73    if( pProbe->is
26760 43 6f 76 65 72 69 6e 67 20 29 7b 0a 20 20 20 20  Covering ){.    
26770 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
26780 73 20 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s = WHERE_IDX_ON
26790 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58  LY | WHERE_INDEX
267a0 45 44 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20  ED;.        m = 
267b0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
267c0 20 20 20 20 20 20 20 20 6d 20 3d 20 70 53 72 63          m = pSrc
267d0 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c  ->colUsed & ~col
267e0 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50 72 6f  umnsInIndex(pPro
267f0 62 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  be);.        pNe
26800 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d  w->wsFlags = (m=
26810 3d 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44 58  =0) ? (WHERE_IDX
26820 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45  _ONLY|WHERE_INDE
26830 58 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e 44  XED) : WHERE_IND
26840 45 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  EXED;.      }.. 
26850 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61       /* Full sca
26860 6e 20 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20  n via index */. 
26870 20 20 20 20 20 69 66 28 20 62 0a 20 20 20 20 20       if( b.     
26880 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70    || !HasRowid(p
26890 54 61 62 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  Tab).       || (
268a0 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26   m==0.         &
268b0 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64  & pProbe->bUnord
268c0 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20  ered==0.        
268d0 20 26 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a 49   && (pProbe->szI
268e0 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61  dxRow<pTab->szTa
268f0 62 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 26  bRow).         &
26900 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
26910 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
26920 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
26930 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  0.         && sq
26940 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
26950 67 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20 20  g.bUseCis.      
26960 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
26970 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f  onEnabled(pWInfo
26980 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  ->pParse->db, SQ
26990 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61  LITE_CoverIdxSca
269a0 6e 29 0a 20 20 20 20 20 20 20 20 20 20 29 0a 20  n).          ). 
269b0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
269c0 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
269d0 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20   b ? iSortIdx : 
269e0 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  0;.        if( m
269f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
26a00 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
26a10 20 6f 66 20 61 20 63 6f 76 65 72 69 6e 67 20 69   of a covering i
26a20 6e 64 65 78 20 73 63 61 6e 20 69 73 20 4b 2a 28  ndex scan is K*(
26a30 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20 20  N + log2(N))..  
26a40 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 20 54          **  +  T
26a50 68 65 20 65 78 74 72 61 20 66 61 63 74 6f 72 20  he extra factor 
26a60 4b 20 6f 66 20 62 65 74 77 65 65 6e 20 31 2e 31  K of between 1.1
26a70 20 61 6e 64 20 33 2e 30 20 74 68 61 74 20 64 65   and 3.0 that de
26a80 70 65 6e 64 73 0a 20 20 20 20 20 20 20 20 20 20  pends.          
26a90 2a 2a 20 20 20 20 20 6f 6e 20 74 68 65 20 72 65  **     on the re
26aa0 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20  lative sizes of 
26ab0 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68  the table and th
26ac0 65 20 69 6e 64 65 78 2e 20 20 4b 0a 20 20 20 20  e index.  K.    
26ad0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 73 20        **     is 
26ae0 73 6d 61 6c 6c 65 72 20 66 6f 72 20 73 6d 61 6c  smaller for smal
26af0 6c 65 72 20 69 6e 64 69 63 65 73 2c 20 74 68 75  ler indices, thu
26b00 73 20 66 61 76 6f 72 69 6e 67 20 74 68 65 6d 2e  s favoring them.
26b10 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
26b20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
26b30 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
26b40 73 74 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67  stAdd(rSize,rLog
26b50 53 69 7a 65 29 20 2b 20 31 20 2b 0a 20 20 20 20  Size) + 1 +.    
26b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b70 20 20 20 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e      (15*pProbe->
26b80 73 7a 49 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e  szIdxRow)/pTab->
26b90 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 20 20  szTabRow;.      
26ba0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26bb0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
26bc0 73 74 20 6f 66 20 73 63 61 6e 6e 69 6e 67 20 61  st of scanning a
26bd0 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e   non-covering in
26be0 64 65 78 20 69 73 20 28 4e 2b 31 29 2a 6c 6f 67  dex is (N+1)*log
26bf0 32 28 4e 29 0a 20 20 20 20 20 20 20 20 20 20 2a  2(N).          *
26c00 2a 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c 20  * which we will 
26c10 73 69 6d 70 6c 69 66 79 20 74 6f 20 6a 75 73 74  simplify to just
26c20 20 4e 2a 6c 6f 67 32 28 4e 29 20 2a 2f 0a 20 20   N*log2(N) */.  
26c30 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
26c40 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 72 4c 6f  un = rSize + rLo
26c50 67 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d  gSize;.        }
26c60 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
26c70 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70  opOutputAdjust(p
26c80 57 43 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  WC, pNew);.     
26c90 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
26ca0 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
26cb0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
26cc0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
26cd0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
26ce0 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
26cf0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
26d00 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
26d10 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
26d20 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
26d30 62 65 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53  be, 0);.#ifdef S
26d40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
26d50 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
26d60 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
26d70 65 46 72 65 65 28 70 42 75 69 6c 64 65 72 2d 3e  eFree(pBuilder->
26d80 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75 69 6c  pRec);.    pBuil
26d90 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d  der->nRecValid =
26da0 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72   0;.    pBuilder
26db0 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64  ->pRec = 0;.#end
26dc0 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  if..    /* If th
26dd0 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58  ere was an INDEX
26de0 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ED BY clause, th
26df0 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65  en only that one
26e00 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a   index is.    **
26e10 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a   considered. */.
26e20 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49      if( pSrc->pI
26e30 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 20 20  ndex ) break;.  
26e40 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
26e50 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
26e60 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
26e70 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  LE./*.** Add all
26e80 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
26e90 74 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f  ts for a table o
26ea0 66 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74  f the join ident
26eb0 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69  ified by.** pBui
26ec0 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
26ed0 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
26ee0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
26ef0 65 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  e a virtual tabl
26f00 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
26f10 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
26f20 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f  tual(.  WhereLoo
26f30 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
26f40 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20 63 6c  er,  /* WHERE cl
26f50 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
26f60 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45   */.  Bitmask mE
26f70 78 74 72 61 0a 29 7b 0a 20 20 57 68 65 72 65 49  xtra.){.  WhereI
26f80 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
26f90 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
26fa0 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74  analysis context
26fb0 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
26fc0 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
26fd0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
26fe0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
26ff0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
27000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27010 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
27020 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
27030 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20  ist_item *pSrc; 
27040 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
27050 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61  ause term to sea
27060 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  rch */.  Table *
27070 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  pTab;.  sqlite3 
27080 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  *db;.  sqlite3_i
27090 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
270a0 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71  nfo;.  struct sq
270b0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
270c0 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
270d0 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
270e0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
270f0 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67  int_usage *pUsag
27100 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  e;.  WhereTerm *
27110 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20  pTerm;.  int i, 
27120 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20  j;.  int iTerm, 
27130 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 43  mxTerm;.  int nC
27140 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74  onstraint;.  int
27150 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20   seenIn = 0;    
27160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
27170 65 20 69 66 20 61 6e 20 49 4e 20 6f 70 65 72 61  e if an IN opera
27180 74 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  tor is seen */. 
27190 20 69 6e 74 20 73 65 65 6e 56 61 72 20 3d 20 30   int seenVar = 0
271a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
271b0 20 54 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63   True if a non-c
271c0 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72 61 69  onstant constrai
271d0 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20  nt is seen */.  
271e0 69 6e 74 20 69 50 68 61 73 65 3b 20 20 20 20 20  int iPhase;     
271f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27200 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c  0: const w/o IN,
27210 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f   1: const, 2: no
27220 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20   IN,  2: IN */. 
27230 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
27240 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
27250 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e 66  ITE_OK;..  pWInf
27260 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
27270 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d  Info;.  pParse =
27280 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
27290 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
272a0 64 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  db;.  pWC = pBui
272b0 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65  lder->pWC;.  pNe
272c0 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
272d0 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57  ew;.  pSrc = &pW
272e0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
272f0 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20  a[pNew->iTab];. 
27300 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54   pTab = pSrc->pT
27310 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 49 73  ab;.  assert( Is
27320 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 3b  Virtual(pTab) );
27330 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c  .  pIdxInfo = al
27340 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28  locateIndexInfo(
27350 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72  pParse, pWC, pSr
27360 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  c, pBuilder->pOr
27370 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70 49  derBy);.  if( pI
27380 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75  dxInfo==0 ) retu
27390 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
273a0 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  .  pNew->prereq 
273b0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65  = 0;.  pNew->rSe
273c0 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  tup = 0;.  pNew-
273d0 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
273e0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20  _VIRTUALTABLE;. 
273f0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
27400 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  0;.  pNew->u.vta
27410 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
27420 20 20 70 55 73 61 67 65 20 3d 20 70 49 64 78 49    pUsage = pIdxI
27430 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
27440 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73 74 72  Usage;.  nConstr
27450 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d  aint = pIdxInfo-
27460 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >nConstraint;.  
27470 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
27480 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 6e 43  ize(db, pNew, nC
27490 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a 20 20  onstraint) ){.  
274a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
274b0 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20  db, pIdxInfo);. 
274c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
274d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66  _NOMEM;.  }..  f
274e0 6f 72 28 69 50 68 61 73 65 3d 30 3b 20 69 50 68  or(iPhase=0; iPh
274f0 61 73 65 3c 3d 33 3b 20 69 50 68 61 73 65 2b 2b  ase<=3; iPhase++
27500 29 7b 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e  ){.    if( !seen
27510 49 6e 20 26 26 20 28 69 50 68 61 73 65 26 31 29  In && (iPhase&1)
27520 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50 68  !=0 ){.      iPh
27530 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ase++;.      if(
27540 20 69 50 68 61 73 65 3e 33 20 29 20 62 72 65 61   iPhase>3 ) brea
27550 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
27560 20 21 73 65 65 6e 56 61 72 20 26 26 20 69 50 68   !seenVar && iPh
27570 61 73 65 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20  ase>1 ) break;. 
27580 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28     pIdxCons = *(
27590 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
275a0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
275b0 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
275c0 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f  nstraint;.    fo
275d0 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66  r(i=0; i<pIdxInf
275e0 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  o->nConstraint; 
275f0 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29  i++, pIdxCons++)
27600 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78  {.      j = pIdx
27610 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65  Cons->iTermOffse
27620 74 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  t;.      pTerm =
27630 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20   &pWC->a[j];.   
27640 20 20 20 73 77 69 74 63 68 28 20 69 50 68 61 73     switch( iPhas
27650 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  e ){.        cas
27660 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74  e 0:    /* Const
27670 61 6e 74 73 20 77 69 74 68 6f 75 74 20 49 4e 20  ants without IN 
27680 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
27690 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
276a0 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  usable = 0;.    
276b0 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
276c0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
276d0 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  _IN)!=0 ){.     
276e0 20 20 20 20 20 20 20 73 65 65 6e 49 6e 20 3d 20         seenIn = 
276f0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
27700 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65           if( pTe
27710 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 21  rm->prereqRight!
27720 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
27730 20 20 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20    seenVar = 1;. 
27740 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
27750 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
27760 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30  ator & WO_IN)==0
27770 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27780 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
27790 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
277a0 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
277b0 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
277c0 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e  1:    /* Constan
277d0 74 73 20 77 69 74 68 20 49 4e 20 6f 70 65 72 61  ts with IN opera
277e0 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  tors */.        
277f0 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 49 6e    assert( seenIn
27800 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49   );.          pI
27810 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
27820 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
27830 69 67 68 74 3d 3d 30 29 3b 0a 20 20 20 20 20 20  ight==0);.      
27840 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
27850 20 20 20 63 61 73 65 20 32 3a 20 20 20 20 2f 2a     case 2:    /*
27860 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 6f   Variables witho
27870 75 74 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20  ut IN */.       
27880 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56     assert( seenV
27890 61 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ar );.          
278a0 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
278b0 20 3d 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72   = (pTerm->eOper
278c0 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30  ator & WO_IN)==0
278d0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
278e0 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61 75  k;.        defau
278f0 6c 74 3a 20 20 20 2f 2a 20 56 61 72 69 61 62 6c  lt:   /* Variabl
27900 65 73 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20  es with IN */.  
27910 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27920 73 65 65 6e 56 61 72 20 26 26 20 73 65 65 6e 49  seenVar && seenI
27930 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  n );.          p
27940 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
27950 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
27960 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
27970 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
27980 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Usage, 0, sizeof
27990 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78  (pUsage[0])*pIdx
279a0 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
279b0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  t);.    if( pIdx
279c0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
279d0 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33  IdxStr ) sqlite3
279e0 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e  _free(pIdxInfo->
279f0 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70 49 64  idxStr);.    pId
27a00 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20  xInfo->idxStr = 
27a10 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
27a20 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20  >idxNum = 0;.   
27a30 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
27a40 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b  oFreeIdxStr = 0;
27a50 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f  .    pIdxInfo->o
27a60 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d  rderByConsumed =
27a70 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
27a80 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
27a90 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  = SQLITE_BIG_DBL
27aa0 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20   / (double)2;.  
27ab0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
27ac0 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a  matedRows = 25;.
27ad0 20 20 20 20 72 63 20 3d 20 76 74 61 62 42 65 73      rc = vtabBes
27ae0 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  tIndex(pParse, p
27af0 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  Tab, pIdxInfo);.
27b00 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
27b10 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74  o whereLoopAddVt
27b20 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 70 49 64  ab_exit;.    pId
27b30 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74  xCons = *(struct
27b40 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
27b50 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
27b60 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
27b70 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72  nt;.    pNew->pr
27b80 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20  ereq = mExtra;. 
27b90 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a     mxTerm = -1;.
27ba0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
27bb0 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74  ->nLSlot>=nConst
27bc0 72 61 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72  raint );.    for
27bd0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61  (i=0; i<nConstra
27be0 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e  int; i++) pNew->
27bf0 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20  aLTerm[i] = 0;. 
27c00 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
27c10 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  omitMask = 0;.  
27c20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
27c30 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
27c40 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
27c50 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70    if( (iTerm = p
27c60 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
27c70 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20  ex - 1)>=0 ){.  
27c80 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f        j = pIdxCo
27c90 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b  ns->iTermOffset;
27ca0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65  .        if( iTe
27cb0 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a  rm>=nConstraint.
27cc0 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a           || j<0.
27cd0 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70           || j>=p
27ce0 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20  WC->nTerm.      
27cf0 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65     || pNew->aLTe
27d00 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20  rm[iTerm]!=0.   
27d10 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
27d20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
27d30 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ROR;.          s
27d40 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
27d50 50 61 72 73 65 2c 20 22 25 73 2e 78 42 65 73 74  Parse, "%s.xBest
27d60 49 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e 63 74  Index() malfunct
27d70 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ion", pTab->zNam
27d80 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  e);.          go
27d90 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  to whereLoopAddV
27da0 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  tab_exit;.      
27db0 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74    }.        test
27dc0 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f  case( iTerm==nCo
27dd0 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20  nstraint-1 );.  
27de0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27df0 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  j==0 );.        
27e00 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43  testcase( j==pWC
27e10 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20  ->nTerm-1 );.   
27e20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
27e30 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  C->a[j];.       
27e40 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d   pNew->prereq |=
27e50 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
27e60 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ght;.        ass
27e70 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d  ert( iTerm<pNew-
27e80 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20  >nLSlot );.     
27e90 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
27ea0 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a  iTerm] = pTerm;.
27eb0 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
27ec0 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72  m>mxTerm ) mxTer
27ed0 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20  m = iTerm;.     
27ee0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
27ef0 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20 20  rm==15 );.      
27f00 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
27f10 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20 20  m==16 );.       
27f20 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26   if( iTerm<16 &&
27f30 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20   pUsage[i].omit 
27f40 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f  ) pNew->u.vtab.o
27f50 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54  mitMask |= 1<<iT
27f60 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  erm;.        if(
27f70 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
27f80 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29  or & WO_IN)!=0 )
27f90 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
27fa0 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d  pUsage[i].omit==
27fb0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
27fc0 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   /* Do not attem
27fd0 70 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e 20  pt to use an IN 
27fe0 63 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74 68  constraint if th
27ff0 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a  e virtual table.
28000 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
28010 61 79 73 20 74 68 61 74 20 74 68 65 20 65 71 75  ays that the equ
28020 69 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74  ivalent EQ const
28030 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
28040 73 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a  safely omitted..
28050 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49              ** I
28060 66 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74 20  f we do attempt 
28070 74 6f 20 75 73 65 20 73 75 63 68 20 61 20 63 6f  to use such a co
28080 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72  nstraint, some r
28090 6f 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20 20  ows might be.   
280a0 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65           ** repe
280b0 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70  ated in the outp
280c0 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ut. */.         
280d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
280e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
280f0 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62  /* A virtual tab
28100 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  le that is const
28110 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20  rained by an IN 
28120 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20  clause may not. 
28130 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
28140 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ume the ORDER BY
28150 20 63 6c 61 75 73 65 20 62 65 63 61 75 73 65 20   clause because 
28160 28 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66  (1) the order of
28170 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20   IN terms.      
28180 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65      ** is not ne
28190 63 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65  cessarily relate
281a0 64 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f  d to the order o
281b0 66 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61  f output terms a
281c0 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
281d0 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74  (2) Multiple out
281e0 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67  puts from a sing
281f0 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c  le IN value will
28200 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20   not merge.     
28210 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72       ** together
28220 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
28230 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
28240 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
28250 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28260 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
28270 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b  >=nConstraint ){
28280 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  .      pNew->nLT
28290 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a  erm = mxTerm+1;.
282a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
282b0 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77  ew->nLTerm<=pNew
282c0 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20  ->nLSlot );.    
282d0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
282e0 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f  dxNum = pIdxInfo
282f0 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20  ->idxNum;.      
28300 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
28310 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f  dFree = pIdxInfo
28320 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
28330 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e  tr;.      pIdxIn
28340 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
28350 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  xStr = 0;.      
28360 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
28370 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  Str = pIdxInfo->
28380 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 4e  idxStr;.      pN
28390 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64  ew->u.vtab.isOrd
283a0 65 72 65 64 20 3d 20 28 75 38 29 28 28 70 49 64  ered = (u8)((pId
283b0 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 21  xInfo->nOrderBy!
283c0 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0).            
283d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283e0 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78           && pIdx
283f0 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
28400 73 75 6d 65 64 29 3b 0a 20 20 20 20 20 20 70 4e  sumed);.      pN
28410 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
28420 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
28430 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
28440 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49  FromDouble(pIdxI
28450 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
28460 73 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  st);.      pNew-
28470 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c  >nOut = sqlite3L
28480 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f 2d 3e  ogEst(pIdxInfo->
28490 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a  estimatedRows);.
284a0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49        whereLoopI
284b0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
284c0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28  pNew);.      if(
284d0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
284e0 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  edFree ){.      
284f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
28500 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  New->u.vtab.idxS
28510 74 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  tr);.        pNe
28520 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
28530 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ee = 0;.      }.
28540 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a 77 68 65      }.  }  ..whe
28550 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78  reLoopAddVtab_ex
28560 69 74 3a 0a 20 20 69 66 28 20 70 49 64 78 49 6e  it:.  if( pIdxIn
28570 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
28580 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66  xStr ) sqlite3_f
28590 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ree(pIdxInfo->id
285a0 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  xStr);.  sqlite3
285b0 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 49  DbFree(db, pIdxI
285c0 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  nfo);.  return r
285d0 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
285e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
285f0 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
28600 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20  * Add WhereLoop 
28610 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c  entries to handl
28620 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69  e OR terms.  Thi
28630 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68  s works for eith
28640 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20  er.** btrees or 
28650 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a  virtual tables..
28660 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
28670 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 57 68 65  ereLoopAddOr(Whe
28680 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
28690 42 75 69 6c 64 65 72 2c 20 42 69 74 6d 61 73 6b  Builder, Bitmask
286a0 20 6d 45 78 74 72 61 29 7b 0a 20 20 57 68 65 72   mExtra){.  Wher
286b0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
286c0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
286d0 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ;.  WhereClause 
286e0 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  *pWC;.  WhereLoo
286f0 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65  p *pNew;.  Where
28700 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57  Term *pTerm, *pW
28710 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  CEnd;.  int rc =
28720 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
28730 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43  t iCur;.  WhereC
28740 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20  lause tempWC;.  
28750 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
28760 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68   sSubBuild;.  Wh
28770 65 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73  ereOrSet sSum, s
28780 43 75 72 2c 20 73 50 72 65 76 3b 0a 20 20 73 74  Cur, sPrev;.  st
28790 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
287a0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70  m *pItem;.  .  p
287b0 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  WC = pBuilder->p
287c0 57 43 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  WC;.  if( pWInfo
287d0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
287e0 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 29 20  HERE_AND_ONLY ) 
287f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28800 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43  ;.  pWCEnd = pWC
28810 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d  ->a + pWC->nTerm
28820 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ;.  pNew = pBuil
28830 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d  der->pNew;.  mem
28840 73 65 74 28 26 73 53 75 6d 2c 20 30 2c 20 73 69  set(&sSum, 0, si
28850 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20 70  zeof(sSum));.  p
28860 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
28870 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65  TabList->a + pNe
28880 77 2d 3e 69 54 61 62 3b 0a 20 20 69 66 28 20 21  w->iTab;.  if( !
28890 48 61 73 52 6f 77 69 64 28 70 49 74 65 6d 2d 3e  HasRowid(pItem->
288a0 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 53  pTab) ) return S
288b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 43 75 72  QLITE_OK;.  iCur
288c0 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
288d0 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d  r;..  for(pTerm=
288e0 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
288f0 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  CEnd && rc==SQLI
28900 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b  TE_OK; pTerm++){
28910 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
28920 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
28930 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  OR)!=0.     && (
28940 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
28950 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e  ->indexable & pN
28960 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  ew->maskSelf)!=0
28970 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57   .    ){.      W
28980 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e  hereClause * con
28990 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72  st pOrWC = &pTer
289a0 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
289b0 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
289c0 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45  m * const pOrWCE
289d0 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70  nd = &pOrWC->a[p
289e0 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  OrWC->nTerm];.  
289f0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
28a00 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e  OrTerm;.      in
28a10 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20  t once = 1;.    
28a20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
28a30 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64  .      sSubBuild
28a40 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20   = *pBuilder;.  
28a50 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f      sSubBuild.pO
28a60 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
28a70 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 53    sSubBuild.pOrS
28a80 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20  et = &sCur;..   
28a90 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70     for(pOrTerm=p
28aa0 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d  OrWC->a; pOrTerm
28ab0 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65  <pOrWCEnd; pOrTe
28ac0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
28ad0 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  f( (pOrTerm->eOp
28ae0 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29  erator & WO_AND)
28af0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
28b00 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d   sSubBuild.pWC =
28b10 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e   &pOrTerm->u.pAn
28b20 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  dInfo->wc;.     
28b30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
28b40 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
28b50 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ==iCur ){.      
28b60 20 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66      tempWC.pWInf
28b70 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b  o = pWC->pWInfo;
28b80 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
28b90 43 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a  C.pOuter = pWC;.
28ba0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
28bb0 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
28bc0 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e          tempWC.n
28bd0 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
28be0 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70      tempWC.a = p
28bf0 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  OrTerm;.        
28c00 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20    sSubBuild.pWC 
28c10 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20  = &tempWC;.     
28c20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28c30 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
28c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28c50 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 6e  sCur.n = 0;.#ifn
28c60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28c70 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
28c80 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75       if( IsVirtu
28c90 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20  al(pItem->pTab) 
28ca0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
28cb0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
28cc0 72 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64  rtual(&sSubBuild
28cd0 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20  , mExtra);.     
28ce0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
28cf0 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
28d00 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
28d10 6f 70 41 64 64 42 74 72 65 65 28 26 73 53 75 62  opAddBtree(&sSub
28d20 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a  Build, mExtra);.
28d30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28d40 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
28d50 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e  LITE_OK || sCur.
28d60 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
28d70 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b  if( sCur.n==0 ){
28d80 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e  .          sSum.
28d90 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
28da0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
28db0 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65 20 29  }else if( once )
28dc0 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72  {.          wher
28dd0 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26  eOrMove(&sSum, &
28de0 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20  sCur);.         
28df0 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20   once = 0;.     
28e00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28e10 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28      whereOrMove(
28e20 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a  &sPrev, &sSum);.
28e30 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e            sSum.n
28e40 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
28e50 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76  for(i=0; i<sPrev
28e60 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; i++){.      
28e70 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
28e80 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20  <sCur.n; j++){. 
28e90 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
28ea0 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d  reOrInsert(&sSum
28eb0 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65  , sPrev.a[i].pre
28ec0 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e  req | sCur.a[j].
28ed0 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20  prereq,.        
28ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ef0 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73      sqlite3LogEs
28f00 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e  tAdd(sPrev.a[i].
28f10 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e  rRun, sCur.a[j].
28f20 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20  rRun),.         
28f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f40 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74     sqlite3LogEst
28f50 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e  Add(sPrev.a[i].n
28f60 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e  Out, sCur.a[j].n
28f70 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Out));.         
28f80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
28f90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28fa0 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e   }.      pNew->n
28fb0 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
28fc0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d   pNew->aLTerm[0]
28fd0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
28fe0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
28ff0 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a  WHERE_MULTI_OR;.
29000 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
29010 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e  up = 0;.      pN
29020 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30  ew->iSortIdx = 0
29030 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
29040 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65  pNew->u, 0, size
29050 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20  of(pNew->u));.  
29060 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
29070 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
29080 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  sSum.n; i++){.  
29090 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
290a0 20 4d 75 6c 74 69 70 6c 65 20 62 79 20 33 2e 35   Multiple by 3.5
290b0 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 61   for the seconda
290c0 72 79 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 20  ry table lookup 
290d0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
290e0 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69  >rRun = sSum.a[i
290f0 5d 2e 72 52 75 6e 20 2b 20 31 38 3b 0a 20 20 20  ].rRun + 18;.   
29100 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
29110 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74  = sSum.a[i].nOut
29120 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
29130 70 72 65 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b  prereq = sSum.a[
29140 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20  i].prereq;.     
29150 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
29160 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
29170 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d  , pNew);.      }
29180 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
29190 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
291a0 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
291b0 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
291c0 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74  ll tables .*/.st
291d0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
291e0 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f  opAddAll(WhereLo
291f0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
29200 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  der){.  WhereInf
29210 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
29220 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
29230 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d  Bitmask mExtra =
29240 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50   0;.  Bitmask mP
29250 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rior = 0;.  int 
29260 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20  iTab;.  SrcList 
29270 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e  *pTabList = pWIn
29280 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
29290 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
292a0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
292b0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e  lite3 *db = pWIn
292c0 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
292d0 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 20 3d    int nTabList =
292e0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b   pWInfo->nLevel;
292f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
29300 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 70 72 69 6f  TE_OK;.  u8 prio
29310 72 4a 6f 69 6e 54 79 70 65 20 3d 20 30 3b 0a 20  rJoinType = 0;. 
29320 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
29330 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65  ;..  /* Loop ove
29340 72 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  r the tables in 
29350 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c  the join, from l
29360 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a  eft to right */.
29370 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
29380 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72 65  r->pNew;.  where
29390 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a  LoopInit(pNew);.
293a0 20 20 66 6f 72 28 69 54 61 62 3d 30 2c 20 70 49    for(iTab=0, pI
293b0 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  tem=pTabList->a;
293c0 20 69 54 61 62 3c 6e 54 61 62 4c 69 73 74 3b 20   iTab<nTabList; 
293d0 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  iTab++, pItem++)
293e0 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62  {.    pNew->iTab
293f0 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e 65   = iTab;.    pNe
29400 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65  w->maskSelf = ge
29410 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
29420 4d 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e  MaskSet, pItem->
29430 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66  iCursor);.    if
29440 28 20 28 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74  ( ((pItem->joint
29450 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 54 79 70  ype|priorJoinTyp
29460 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  e) & (JT_LEFT|JT
29470 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20  _CROSS))!=0 ){. 
29480 20 20 20 20 20 6d 45 78 74 72 61 20 3d 20 6d 50       mExtra = mP
29490 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rior;.    }.    
294a0 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20  priorJoinType = 
294b0 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b  pItem->jointype;
294c0 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75  .    if( IsVirtu
294d0 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20  al(pItem->pTab) 
294e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  ){.      rc = wh
294f0 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
29500 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74  l(pBuilder, mExt
29510 72 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ra);.    }else{.
29520 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
29530 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42 75  LoopAddBtree(pBu
29540 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a  ilder, mExtra);.
29550 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
29560 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29570 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
29580 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65  oopAddOr(pBuilde
29590 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20  r, mExtra);.    
295a0 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20  }.    mPrior |= 
295b0 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  pNew->maskSelf;.
295c0 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62      if( rc || db
295d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
295e0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68   break;.  }.  wh
295f0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
29600 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e   pNew);.  return
29610 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78   rc;.}../*.** Ex
29620 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61 74  amine a WherePat
29630 68 20 28 77 69 74 68 20 74 68 65 20 61 64 64 69  h (with the addi
29640 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72  tion of the extr
29650 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74  a WhereLoop of t
29660 68 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65  he 5th.** parame
29670 74 65 72 73 29 20 74 6f 20 73 65 65 20 69 66 20  ters) to see if 
29680 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20  it outputs rows 
29690 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
296a0 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72   ORDER BY.** (or
296b0 20 47 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f   GROUP BY) witho
296c0 75 74 20 72 65 71 75 69 72 69 6e 67 20 61 20 73  ut requiring a s
296d0 65 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65  eparate sort ope
296e0 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 3a  ration.  Return:
296f0 0a 2a 2a 20 0a 2a 2a 20 20 20 20 30 3a 20 20 4f  .** .**    0:  O
29700 52 44 45 52 20 42 59 20 69 73 20 6e 6f 74 20 73  RDER BY is not s
29710 61 74 69 73 66 69 65 64 2e 20 20 53 6f 72 74 69  atisfied.  Sorti
29720 6e 67 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 20  ng required.**  
29730 20 20 31 3a 20 20 4f 52 44 45 52 20 42 59 20 69    1:  ORDER BY i
29740 73 20 73 61 74 69 73 66 69 65 64 2e 20 20 20 20  s satisfied.    
29750 20 20 4f 6d 69 74 20 73 6f 72 74 69 6e 67 0a 2a    Omit sorting.*
29760 2a 20 20 20 2d 31 3a 20 20 55 6e 6b 6e 6f 77 6e  *   -1:  Unknown
29770 20 61 74 20 74 68 69 73 20 74 69 6d 65 0a 2a 2a   at this time.**
29780 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 72  .** Note that pr
29790 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 48 45  ocessing for WHE
297a0 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64 20 57  RE_GROUPBY and W
297b0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
297c0 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72  is not as.** str
297d0 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f 55 50  ict.  With GROUP
297e0 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
297f0 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72   the only requir
29800 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a  ement is that.**
29810 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73   equivalent rows
29820 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69 61 74   appear immediat
29830 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74 6f 20  ely adjacent to 
29840 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20 47 52  one another.  GR
29850 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49  OUP BY.** and DI
29860 53 54 49 4e 54 20 64 6f 20 6e 6f 74 20 72 65 71  STINT do not req
29870 75 69 72 65 20 72 6f 77 73 20 74 6f 20 61 70 70  uire rows to app
29880 65 61 72 20 69 6e 20 61 6e 79 20 70 61 72 74 69  ear in any parti
29890 63 75 6c 61 72 20 6f 72 64 65 72 20 61 73 20 6c  cular order as l
298a0 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69 76 65  ong.** as equive
298b0 6c 65 6e 74 20 72 6f 77 73 20 61 72 65 20 67 72  lent rows are gr
298c0 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e 20  ouped together. 
298d0 20 54 68 75 73 20 66 6f 72 20 47 52 4f 55 50 20   Thus for GROUP 
298e0 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 0a  BY and DISTINCT.
298f0 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42 79 20  ** the pOrderBy 
29900 74 65 72 6d 73 20 63 61 6e 20 62 65 20 6d 61 74  terms can be mat
29910 63 68 65 64 20 69 6e 20 61 6e 79 20 6f 72 64 65  ched in any orde
29920 72 2e 20 20 57 69 74 68 20 4f 52 44 45 52 20 42  r.  With ORDER B
29930 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64 65  Y, the .** pOrde
29940 72 42 79 20 74 65 72 6d 73 20 6d 75 73 74 20 62  rBy terms must b
29950 65 20 6d 61 74 63 68 65 64 20 69 6e 20 73 74 72  e matched in str
29960 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68  ict left-to-righ
29970 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  t order..*/.stat
29980 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68  ic int wherePath
29990 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
299a0 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  (.  WhereInfo *p
299b0 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65  WInfo,    /* The
299c0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
299d0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
299e0 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45  derBy,   /* ORDE
299f0 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
29a00 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63 6c 61   or DISTINCT cla
29a10 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  use to check */.
29a20 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 50 61    WherePath *pPa
29a30 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  th,     /* The W
29a40 68 65 72 65 50 61 74 68 20 74 6f 20 63 68 65 63  herePath to chec
29a50 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  k */.  u16 wctrl
29a60 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20  Flags,       /* 
29a70 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 57 48  Might contain WH
29a80 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72 20 57  ERE_GROUPBY or W
29a90 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
29aa0 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20  */.  u16 nLoop, 
29ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
29ac0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
29ad0 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b  in pPath->aLoop[
29ae0 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ] */.  WhereLoop
29af0 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20   *pLast,     /* 
29b00 41 64 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f  Add this WhereLo
29b10 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  op to the end of
29b20 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20   pPath->aLoop[] 
29b30 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70 52  */.  Bitmask *pR
29b40 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55  evMask     /* OU
29b50 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65  T: Mask of Where
29b60 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20  Loops to run in 
29b70 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
29b80 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b  .){.  u8 revSet;
29b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29ba0 72 75 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e  rue if rev is kn
29bb0 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b  own */.  u8 rev;
29bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29bd0 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74  * Composite sort
29be0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72   order */.  u8 r
29bf0 65 76 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  evIdx;          
29c00 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20    /* Index sort 
29c10 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73  order */.  u8 is
29c20 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20 20  OrderDistinct;  
29c30 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57 68   /* All prior Wh
29c40 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64  ereLoops are ord
29c50 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  er-distinct */. 
29c60 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c 75   u8 distinctColu
29c70 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  mns;   /* True i
29c80 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20 55  f the loop has U
29c90 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63  NIQUE NOT NULL c
29ca0 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69  olumns */.  u8 i
29cb0 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20 20  sMatch;         
29cc0 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74    /* iColumn mat
29cd0 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ches a term of t
29ce0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
29cf0 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65 79  se */.  u16 nKey
29d00 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Col;          /*
29d10 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20 63   Number of key c
29d20 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78  olumns in pIndex
29d30 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d   */.  u16 nColum
29d40 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n;          /* T
29d50 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f  otal number of o
29d60 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73 20 69  rdered columns i
29d70 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  n the index */. 
29d80 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 20 20   u16 nOrderBy;  
29d90 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
29da0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
29db0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
29dc0 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20  .  int iLoop;   
29dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
29de0 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 69  x of WhereLoop i
29df0 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20 70 72  n pPath being pr
29e00 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ocessed */.  int
29e10 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
29e20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
29e30 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ers */.  int iCu
29e40 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
29e50 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
29e60 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68 65 72  for current Wher
29e70 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69  eLoop */.  int i
29e80 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
29e90 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d   /* A column num
29ea0 62 65 72 20 77 69 74 68 69 6e 20 74 61 62 6c 65  ber within table
29eb0 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65 72 65   iCur */.  Where
29ec0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b  Loop *pLoop = 0;
29ed0 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72   /* Current Wher
29ee0 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f 63  eLoop being proc
29ef0 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72  essed. */.  Wher
29f00 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
29f10 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
29f20 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
29f30 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
29f40 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20   *pOBExpr;      
29f50 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69    /* An expressi
29f60 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45  on from the ORDE
29f70 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
29f80 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
29f90 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54         /* COLLAT
29fa0 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20  E function from 
29fb0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
29fc0 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64  se term */.  Ind
29fd0 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
29fe0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
29ff0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2a000 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74  pLoop */.  sqlit
2a010 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
2a020 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a  >pParse->db;  /*
2a030 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
2a040 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
2a050 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20 20 20  k obSat = 0;    
2a060 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52  /* Mask of ORDER
2a070 20 42 59 20 74 65 72 6d 73 20 73 61 74 69 73 66   BY terms satisf
2a080 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  ied so far */.  
2a090 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20  Bitmask obDone; 
2a0a0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
2a0b0 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65   all ORDER BY te
2a0c0 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  rms */.  Bitmask
2a0d0 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
2a0e0 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  sk;  /* Mask of 
2a0f0 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64  all well-ordered
2a100 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d   loops */.  Bitm
2a110 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20 20 20  ask ready;      
2a120 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
2a130 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a  of inner loops *
2a140 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20  /..  /*.  ** We 
2a150 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  say the WhereLoo
2a160 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69  p is "one-row" i
2a170 66 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 6e  f it generates n
2a180 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a  o more than one.
2a190 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70    ** row of outp
2a1a0 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f 70  ut.  A WhereLoop
2a1b0 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61   is one-row if a
2a1c0 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
2a1d0 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20  ing are true:.  
2a1e0 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e 64 65  **  (a) All inde
2a1f0 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20  x columns match 
2a200 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d  with WHERE_COLUM
2a210 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20  N_EQ..  **  (b) 
2a220 54 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e 69  The index is uni
2a230 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65  que.  ** Any Whe
2a240 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 57  reLoop with an W
2a250 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63  HERE_COLUMN_EQ c
2a260 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65  onstraint on the
2a270 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f   rowid is one-ro
2a280 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e  w..  ** Every on
2a290 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20  e-row WhereLoop 
2a2a0 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20 57 48  will have the WH
2a2b0 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73  ERE_ONEROW bit s
2a2c0 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20  et in wsFlags.. 
2a2d0 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20   **.  ** We say 
2a2e0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  the WhereLoop is
2a2f0 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74   "order-distinct
2a300 22 20 69 66 20 74 68 65 20 73 65 74 20 6f 66 20  " if the set of 
2a310 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a  columns from.  *
2a320 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70  * that WhereLoop
2a330 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
2a340 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2a350 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 66   are different f
2a360 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f  or every.  ** ro
2a370 77 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f  w of the WhereLo
2a380 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d 72  op.  Every one-r
2a390 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ow WhereLoop is 
2a3a0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20  automatically.  
2a3b0 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  ** order-distinc
2a3c0 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f 6f 70  t.   A WhereLoop
2a3d0 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c   that has no col
2a3e0 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52 44 45  umns in the ORDE
2a3f0 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a  R BY clause.  **
2a400 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69   is not order-di
2a410 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72  stinct. To be or
2a420 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69 73 20  der-distinct is 
2a430 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20 73 61  not quite the sa
2a440 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a  me as being.  **
2a450 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20 61 20   UNIQUE since a 
2a460 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72  UNIQUE column or
2a470 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76 65 20   index can have 
2a480 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74 68  multiple rows th
2a490 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c  at .  ** are NUL
2a4a0 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65  L and NULL value
2a4b0 73 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  s are equivalent
2a4c0 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   for the purpose
2a4d0 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   of order-distin
2a4e0 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f  ct..  ** To be o
2a4f0 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c 20 74  rder-distinct, t
2a500 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20  he columns must 
2a510 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f  be UNIQUE and NO
2a520 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a  T NULL..  **.  *
2a530 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20  * The rowid for 
2a540 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79  a table is alway
2a550 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54  s UNIQUE and NOT
2a560 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65   NULL so wheneve
2a570 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64  r the.  ** rowid
2a580 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20   appears in the 
2a590 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
2a5a0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2a5b0 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a  ng WhereLoop is.
2a5c0 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
2a5d0 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  ly order-distinc
2a5e0 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72  t..  */..  asser
2a5f0 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29  t( pOrderBy!=0 )
2a600 3b 0a 0a 20 20 2f 2a 20 53 6f 72 74 61 62 69 6c  ;..  /* Sortabil
2a610 69 74 79 20 6f 66 20 76 69 72 74 75 61 6c 20 74  ity of virtual t
2a620 61 62 6c 65 73 20 69 73 20 64 65 74 65 72 6d 69  ables is determi
2a630 6e 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74  ned by the xBest
2a640 49 6e 64 65 78 20 6d 65 74 68 6f 64 0a 20 20 2a  Index method.  *
2a650 2a 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  * of the virtual
2a660 20 74 61 62 6c 65 20 69 74 73 65 6c 66 20 2a 2f   table itself */
2a670 0a 20 20 69 66 28 20 70 4c 61 73 74 2d 3e 77 73  .  if( pLast->ws
2a680 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
2a690 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20  RTUALTABLE ){.  
2a6a0 20 20 74 65 73 74 63 61 73 65 28 20 6e 4c 6f 6f    testcase( nLoo
2a6b0 70 3e 30 20 29 3b 20 20 2f 2a 20 54 72 75 65 20  p>0 );  /* True 
2a6c0 77 68 65 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73  when outer loops
2a6d0 20 61 72 65 20 6f 6e 65 2d 72 6f 77 20 61 6e 64   are one-row and
2a6e0 20 6d 61 74 63 68 20 0a 20 20 20 20 20 20 20 20   match .        
2a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a700 20 20 2a 2a 20 6e 6f 20 4f 52 44 45 52 20 42 59    ** no ORDER BY
2a710 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 72 65   terms */.    re
2a720 74 75 72 6e 20 70 4c 61 73 74 2d 3e 75 2e 76 74  turn pLast->u.vt
2a730 61 62 2e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20  ab.isOrdered;.  
2a740 7d 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26  }.  if( nLoop &&
2a750 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
2a760 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
2a770 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 29  _OrderByIdxJoin)
2a780 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
2a790 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  nOrderBy = pOrde
2a7a0 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65  rBy->nExpr;.  te
2a7b0 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72 42 79  stcase( nOrderBy
2a7c0 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28  ==BMS-1 );.  if(
2a7d0 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31 20   nOrderBy>BMS-1 
2a7e0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
2a7f0 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20  Cannot optimize 
2a800 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f 52 44  overly large ORD
2a810 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72  ER BYs */.  isOr
2a820 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b  derDistinct = 1;
2a830 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b  .  obDone = MASK
2a840 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b  BIT(nOrderBy)-1;
2a850 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74  .  orderDistinct
2a860 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64  Mask = 0;.  read
2a870 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c 6f  y = 0;.  for(iLo
2a880 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73  op=0; isOrderDis
2a890 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f  tinct && obSat<o
2a8a0 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d  bDone && iLoop<=
2a8b0 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
2a8c0 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30  .    if( iLoop>0
2a8d0 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f   ) ready |= pLoo
2a8e0 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
2a8f0 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e   pLoop = iLoop<n
2a900 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61 4c  Loop ? pPath->aL
2a910 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61  oop[iLoop] : pLa
2a920 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
2a930 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2a940 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
2a950 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ABLE)==0 );.    
2a960 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  iCur = pWInfo->p
2a970 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
2a980 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b  ->iTab].iCursor;
2a990 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66  ..    /* Mark of
2a9a0 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74  f any ORDER BY t
2a9b0 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61 20  erm X that is a 
2a9c0 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
2a9d0 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ble of.    ** th
2a9e0 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66  e current loop f
2a9f0 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69  or which there i
2aa00 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  s term in the WH
2aa10 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73  ERE.    ** claus
2aa20 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  e of the form X 
2aa30 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74  IS NULL or X=? t
2aa40 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  hat reference on
2aa50 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  ly outer.    ** 
2aa60 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  loops..    */.  
2aa70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
2aa80 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
2aa90 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
2aaa0 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
2aab0 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45  inue;.      pOBE
2aac0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
2aad0 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
2aae0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
2aaf0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  r);.      if( pO
2ab00 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  BExpr->op!=TK_CO
2ab10 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LUMN ) continue;
2ab20 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78  .      if( pOBEx
2ab30 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
2ab40 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2ab50 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
2ab60 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  erm(&pWInfo->sWC
2ab70 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d  , iCur, pOBExpr-
2ab80 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >iColumn,.      
2ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aba0 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57   ~ready, WO_EQ|W
2abb0 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20  O_ISNULL, 0);.  
2abc0 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
2abd0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2abe0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
2abf0 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21  Operator&WO_EQ)!
2ac00 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69  =0 && pOBExpr->i
2ac10 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
2ac20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2ac30 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20  *z1, *z2;.      
2ac40 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2ac50 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49  3ExprCollSeq(pWI
2ac60 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72  nfo->pParse, pOr
2ac70 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
2ac80 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
2ac90 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
2aca0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
2acb0 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f          z1 = pCo
2acc0 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ll->zName;.     
2acd0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2ace0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
2acf0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54  Info->pParse, pT
2ad00 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  erm->pExpr);.   
2ad10 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
2ad20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
2ad30 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
2ad40 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61   z2 = pColl->zNa
2ad50 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
2ad60 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2ad70 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74  1, z2)!=0 ) cont
2ad80 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
2ad90 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
2ada0 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a  KBIT(i);.    }..
2adb0 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
2adc0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2add0 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20  ONEROW)==0 ){.  
2ade0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
2adf0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2ae00 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  PK ){.        pI
2ae10 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
2ae20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20    nKeyCol = 0;. 
2ae30 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d         nColumn =
2ae40 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
2ae50 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c  if( (pIndex = pL
2ae60 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
2ae70 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65  dex)==0 || pInde
2ae80 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b  x->bUnordered ){
2ae90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2aea0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
2aeb0 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20          nKeyCol 
2aec0 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  = pIndex->nKeyCo
2aed0 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75  l;.        nColu
2aee0 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  mn = pIndex->nCo
2aef0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  lumn;.        as
2af00 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e  sert( nColumn==n
2af10 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73  KeyCol+1 || !Has
2af20 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54  Rowid(pIndex->pT
2af30 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 20  able) );.       
2af40 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
2af50 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d  >aiColumn[nColum
2af60 6e 2d 31 5d 3d 3d 28 2d 31 29 20 7c 7c 20 21 48  n-1]==(-1) || !H
2af70 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e  asRowid(pIndex->
2af80 70 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20  pTable));.      
2af90 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2afa0 74 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  t = pIndex->onEr
2afb0 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20  ror!=OE_None;.  
2afc0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
2afd0 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
2afe0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
2aff0 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77  index and deal w
2b000 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20  ith the ones.   
2b010 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e     ** that are n
2b020 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  ot constrained b
2b030 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20  y == or IN..    
2b040 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d    */.      rev =
2b050 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20   revSet = 0;.   
2b060 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d     distinctColum
2b070 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f  ns = 0;.      fo
2b080 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e  r(j=0; j<nColumn
2b090 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
2b0a0 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54  u8 bOnce;   /* T
2b0b0 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f  rue to run the O
2b0c0 52 44 45 52 20 42 59 20 73 65 61 72 63 68 20 6c  RDER BY search l
2b0d0 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  oop */..        
2b0e0 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20  /* Skip over == 
2b0f0 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d  and IS NULL term
2b100 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  s */.        if(
2b110 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   j<pLoop->u.btre
2b120 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26  e.nEq.         &
2b130 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  & pLoop->u.btree
2b140 2e 6e 53 6b 69 70 3d 3d 30 0a 20 20 20 20 20 20  .nSkip==0.      
2b150 20 20 20 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f     && ((i = pLoo
2b160 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f  p->aLTerm[j]->eO
2b170 70 65 72 61 74 6f 72 29 20 26 20 28 57 4f 5f 45  perator) & (WO_E
2b180 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30  Q|WO_ISNULL))!=0
2b190 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2b1a0 20 20 20 20 20 20 69 66 28 20 69 20 26 20 57 4f        if( i & WO
2b1b0 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
2b1c0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2b1d0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2b1e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2b1f0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2b200 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
2b210 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
2b220 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20 7d  nue;  .        }
2b230 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  ..        /* Get
2b240 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
2b250 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  er in the table 
2b260 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f  (iColumn) and so
2b270 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  rt order.       
2b280 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72   ** (revIdx) for
2b290 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
2b2a0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   of the index.. 
2b2b0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2b2c0 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
2b2d0 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d            iColum
2b2e0 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  n = pIndex->aiCo
2b2f0 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  lumn[j];.       
2b300 20 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64     revIdx = pInd
2b310 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  ex->aSortOrder[j
2b320 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
2b330 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78   iColumn==pIndex
2b340 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20  ->pTable->iPKey 
2b350 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  ) iColumn = -1;.
2b360 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2b370 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e           iColumn
2b380 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
2b390 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20 20   revIdx = 0;.   
2b3a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2b3b0 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69  /* An unconstrai
2b3c0 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ned column that 
2b3d0 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65  might be NULL me
2b3e0 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20 20  ans that this.  
2b3f0 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f        ** WhereLo
2b400 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f  op is not well-o
2b410 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a  rdered.        *
2b420 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  /.        if( is
2b430 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a 20 20  OrderDistinct.  
2b440 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c 75 6d         && iColum
2b450 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  n>=0.         &&
2b460 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72   j>=pLoop->u.btr
2b470 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20  ee.nEq.         
2b480 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  && pIndex->pTabl
2b490 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d  e->aCol[iColumn]
2b4a0 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20  .notNull==0.    
2b4b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2b4c0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2b4d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
2b4e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64  .        /* Find
2b4f0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65   the ORDER BY te
2b500 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  rm that correspo
2b510 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74 68 20  nds to the j-th 
2b520 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a  column.        *
2b530 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  * of the index a
2b540 6e 64 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74  nd and mark that
2b550 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f   ORDER BY term o
2b560 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ff .        */. 
2b570 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 31         bOnce = 1
2b580 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74 63  ;.        isMatc
2b590 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  h = 0;.        f
2b5a0 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26  or(i=0; bOnce &&
2b5b0 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
2b5c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2b5d0 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62   MASKBIT(i) & ob
2b5e0 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Sat ) continue;.
2b5f0 20 20 20 20 20 20 20 20 20 20 70 4f 42 45 78 70            pOBExp
2b600 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
2b610 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65  kipCollate(pOrde
2b620 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
2b630 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
2b640 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73  case( wctrlFlags
2b650 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
2b660 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   );.          te
2b670 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
2b680 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
2b690 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20 20 20  NCTBY );.       
2b6a0 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
2b6b0 67 73 20 26 20 28 57 48 45 52 45 5f 47 52 4f 55  gs & (WHERE_GROU
2b6c0 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54 49 4e  PBY|WHERE_DISTIN
2b6d0 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63  CTBY))==0 ) bOnc
2b6e0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
2b6f0 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70   if( pOBExpr->op
2b700 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f  !=TK_COLUMN ) co
2b710 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2b720 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69    if( pOBExpr->i
2b730 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f  Table!=iCur ) co
2b740 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2b750 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69    if( pOBExpr->i
2b760 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
2b770 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2b780 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
2b790 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
2b7a0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
2b7b0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2b7c0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
2b7d0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2b7e0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
2b7f0 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
2b800 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
2b810 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
2b820 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
2b830 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
2b840 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  e, pIndex->azCol
2b850 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69  l[j])!=0 ) conti
2b860 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
2b870 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d 61 74  .          isMat
2b880 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ch = 1;.        
2b890 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2b8a0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
2b8b0 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  sMatch ){.      
2b8c0 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c      if( iColumn<
2b8d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2b8e0 20 74 65 73 74 63 61 73 65 28 20 64 69 73 74 69   testcase( disti
2b8f0 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b  nctColumns==0 );
2b900 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73  .            dis
2b910 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31  tinctColumns = 1
2b920 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2b930 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d          obSat |=
2b940 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
2b950 20 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e         if( (pWIn
2b960 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
2b970 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d   WHERE_GROUPBY)=
2b980 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2b990 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
2b9a0 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73  he sort order is
2b9b0 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61   compatible in a
2b9c0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
2b9d0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  e..            *
2b9e0 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69 73 20  * Sort order is 
2b9f0 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 61  irrelevant for a
2ba00 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2ba10 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
2ba20 20 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a 20   if( revSet ){. 
2ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2ba40 20 28 72 65 76 20 5e 20 72 65 76 49 64 78 29 21   (rev ^ revIdx)!
2ba50 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  =pOrderBy->a[i].
2ba60 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74 75  sortOrder ) retu
2ba70 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20  rn 0;.          
2ba80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2ba90 20 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76         rev = rev
2baa0 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e  Idx ^ pOrderBy->
2bab0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
2bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2bad0 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73  ( rev ) *pRevMas
2bae0 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f  k |= MASKBIT(iLo
2baf0 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  op);.           
2bb00 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a 20     revSet = 1;. 
2bb10 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2bb20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bb30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2bb40 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f    /* No match fo
2bb50 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
2bb60 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e   if( j==0 || j<n
2bb70 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  KeyCol ){.      
2bb80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2bb90 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21  isOrderDistinct!
2bba0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2bbb0 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2bbc0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
2bbd0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
2bbe0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
2bbf0 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f      } /* end Loo
2bc00 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78  p over all index
2bc10 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
2bc20 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f    if( distinctCo
2bc30 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20  lumns ){.       
2bc40 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
2bc50 65 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b  erDistinct==0 );
2bc60 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72  .        isOrder
2bc70 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20  Distinct = 1;.  
2bc80 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65      }.    } /* e
2bc90 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f  nd-if not one-ro
2bca0 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72  w */..    /* Mar
2bcb0 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20  k off any other 
2bcc0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
2bcd0 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c  hat reference pL
2bce0 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  oop */.    if( i
2bcf0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29  sOrderDistinct )
2bd00 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69 73  {.      orderDis
2bd10 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f  tinctMask |= pLo
2bd20 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
2bd30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2bd40 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
2bd50 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a         Expr *p;.
2bd60 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b          if( MASK
2bd70 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29  BIT(i) & obSat )
2bd80 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2bd90 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d     p = pOrderBy-
2bda0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
2bdb0 20 20 20 20 20 69 66 28 20 28 65 78 70 72 54 61       if( (exprTa
2bdc0 62 6c 65 55 73 61 67 65 28 26 70 57 49 6e 66 6f  bleUsage(&pWInfo
2bdd0 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 29 26 7e  ->sMaskSet, p)&~
2bde0 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
2bdf0 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
2be00 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
2be10 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20  BIT(i);.        
2be20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2be30 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c    } /* End the l
2be40 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68 65  oop over all Whe
2be50 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74  reLoops from out
2be60 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20  er-most down to 
2be70 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20  inner-most */.  
2be80 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e  if( obSat==obDon
2be90 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  e ) return 1;.  
2bea0 69 66 28 20 21 69 73 4f 72 64 65 72 44 69 73 74  if( !isOrderDist
2beb0 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  inct ) return 0;
2bec0 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
2bed0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
2bee0 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f  CE_ENABLED./* Fo
2bef0 72 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20  r debugging use 
2bf00 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20  only: */.static 
2bf10 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65 72  const char *wher
2bf20 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65 50  ePathName(WhereP
2bf30 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74 20  ath *pPath, int 
2bf40 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70  nLoop, WhereLoop
2bf50 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61 74   *pLast){.  stat
2bf60 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35  ic char zName[65
2bf70 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ];.  int i;.  fo
2bf80 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20  r(i=0; i<nLoop; 
2bf90 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d  i++){ zName[i] =
2bfa0 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d   pPath->aLoop[i]
2bfb0 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20 70  ->cId; }.  if( p
2bfc0 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b  Last ) zName[i++
2bfd0 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a  ] = pLast->cId;.
2bfe0 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a    zName[i] = 0;.
2bff0 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a    return zName;.
2c000 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
2c010 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74 20   Given the list 
2c020 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  of WhereLoop obj
2c030 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e  ects at pWInfo->
2c040 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f 75  pLoops, this rou
2c050 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73  tine.** attempts
2c060 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f 77   to find the low
2c070 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 74 68  est cost path th
2c080 61 74 20 76 69 73 69 74 73 20 65 61 63 68 20 57  at visits each W
2c090 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65  hereLoop.** once
2c0a0 2e 20 20 54 68 69 73 20 70 61 74 68 20 69 73 20  .  This path is 
2c0b0 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f  then loaded into
2c0c0 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d   the pWInfo->a[]
2c0d0 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a  .pWLoop fields..
2c0e0 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68 61  **.** Assume tha
2c0f0 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  t the total numb
2c100 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
2c110 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64  s that will need
2c120 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a   to be sorted.**
2c130 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74   will be nRowEst
2c140 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32   (in the 10*log2
2c150 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 29   representation)
2c160 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f  .  Or, ignore so
2c170 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69  rting.** costs i
2c180 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a  f nRowEst==0..**
2c190 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
2c1a0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
2c1b0 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  or SQLITE_NOMEM 
2c1c0 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  of a memory allo
2c1d0 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20  cation.** error 
2c1e0 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
2c1f0 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68 53  c int wherePathS
2c200 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f 20  olver(WhereInfo 
2c210 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20  *pWInfo, LogEst 
2c220 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20  nRowEst){.  int 
2c230 6d 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20  mxChoice;       
2c240 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
2c250 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c   number of simul
2c260 74 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72  taneous paths tr
2c270 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  acked */.  int n
2c280 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
2c290 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2c2a0 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a  f terms in the j
2c2b0 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  oin */.  Parse *
2c2c0 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
2c2d0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
2c2e0 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
2c2f0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
2c300 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
2c310 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2c320 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20  */.  int iLoop; 
2c330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c340 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f  * Loop counter o
2c350 76 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66  ver the terms of
2c360 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69   the join */.  i
2c370 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20  nt ii, jj;      
2c380 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2c390 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
2c3a0 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20 20 20 20  nt mxI = 0;     
2c3b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2c3c0 78 20 6f 66 20 6e 65 78 74 20 65 6e 74 72 79 20  x of next entry 
2c3d0 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20  to replace */.  
2c3e0 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20  LogEst rCost;   
2c3f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73            /* Cos
2c400 74 20 6f 66 20 61 20 70 61 74 68 20 2a 2f 0a 20  t of a path */. 
2c410 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20   LogEst nOut;   
2c420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2c430 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 73 20  mber of outputs 
2c440 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f  */.  LogEst mxCo
2c450 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  st = 0;        /
2c460 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f  * Maximum cost o
2c470 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 73  f a set of paths
2c480 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 4f   */.  LogEst mxO
2c490 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ut = 0;         
2c4a0 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 4f 75 74 20  /* Maximum nOut 
2c4b0 76 61 6c 75 65 20 6f 6e 20 74 68 65 20 73 65 74  value on the set
2c4c0 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c   of paths */.  L
2c4d0 6f 67 45 73 74 20 72 53 6f 72 74 43 6f 73 74 3b  ogEst rSortCost;
2c4e0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74           /* Cost
2c4f0 20 74 6f 20 64 6f 20 61 20 73 6f 72 74 20 2a 2f   to do a sort */
2c500 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f  .  int nTo, nFro
2c510 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
2c520 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  Number of valid 
2c530 65 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d  entries in aTo[]
2c540 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a   and aFrom[] */.
2c550 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72    WherePath *aFr
2c560 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  om;         /* A
2c570 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61  ll nFrom paths a
2c580 74 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  t the previous l
2c590 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50  evel */.  WhereP
2c5a0 61 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20  ath *aTo;       
2c5b0 20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62      /* The nTo b
2c5c0 65 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65  est paths at the
2c5d0 20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a   current level *
2c5e0 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
2c5f0 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a  From;         /*
2c600 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61   An element of a
2c610 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61  From[] that we a
2c620 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
2c630 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54  .  WherePath *pT
2c640 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
2c650 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54  An element of aT
2c660 6f 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20  o[] that we are 
2c670 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
2c680 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f  WhereLoop *pWLoo
2c690 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  p;        /* One
2c6a0 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
2c6b0 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57  p objects */.  W
2c6c0 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20  hereLoop **pX;  
2c6d0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
2c6e0 20 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20   to divy up the 
2c6f0 70 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f  pSpace memory */
2c700 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b  .  char *pSpace;
2c710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c720 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  Temporary memory
2c730 20 75 73 65 64 20 62 79 20 74 68 69 73 20 72 6f   used by this ro
2c740 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 70 50 61 72  utine */..  pPar
2c750 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
2c760 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
2c770 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20  se->db;.  nLoop 
2c780 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
2c790 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46  ;.  /* TUNING: F
2c7a0 6f 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65  or simple querie
2c7b0 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74  s, only the best
2c7c0 20 70 61 74 68 20 69 73 20 74 72 61 63 6b 65 64   path is tracked
2c7d0 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79  ..  ** For 2-way
2c7e0 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65   joins, the 5 be
2c7f0 73 74 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c  st paths are fol
2c800 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20  lowed..  ** For 
2c810 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f  joins of 3 or mo
2c820 72 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b  re tables, track
2c830 20 74 68 65 20 31 30 20 62 65 73 74 20 70 61 74   the 10 best pat
2c840 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65  hs */.  mxChoice
2c850 20 3d 20 28 6e 4c 6f 6f 70 3d 3d 31 29 20 3f 20   = (nLoop==1) ? 
2c860 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20  1 : (nLoop==2 ? 
2c870 35 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72  5 : 10);.  asser
2c880 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f  t( nLoop<=pWInfo
2c890 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ->pTabList->nSrc
2c8a0 20 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45   );.  WHERETRACE
2c8b0 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62  (0x002, ("---- b
2c8c0 65 67 69 6e 20 73 6f 6c 76 65 72 5c 6e 22 29 29  egin solver\n"))
2c8d0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
2c8e0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
2c8f0 73 70 61 63 65 20 66 6f 72 20 61 54 6f 20 61 6e  space for aTo an
2c900 64 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 69 69 20  d aFrom */.  ii 
2c910 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50  = (sizeof(WhereP
2c920 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72  ath)+sizeof(Wher
2c930 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d  eLoop*)*nLoop)*m
2c940 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 70 53 70  xChoice*2;.  pSp
2c950 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ace = sqlite3DbM
2c960 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 69 69 29  allocRaw(db, ii)
2c970 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d  ;.  if( pSpace==
2c980 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2c990 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d  E_NOMEM;.  aTo =
2c9a0 20 28 57 68 65 72 65 50 61 74 68 2a 29 70 53 70   (WherePath*)pSp
2c9b0 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61  ace;.  aFrom = a
2c9c0 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d  To+mxChoice;.  m
2c9d0 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20  emset(aFrom, 0, 
2c9e0 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29  sizeof(aFrom[0])
2c9f0 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65  );.  pX = (Where
2ca00 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78  Loop**)(aFrom+mx
2ca10 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69  Choice);.  for(i
2ca20 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46  i=mxChoice*2, pF
2ca30 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69  rom=aTo; ii>0; i
2ca40 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58  i--, pFrom++, pX
2ca50 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20   += nLoop){.    
2ca60 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70  pFrom->aLoop = p
2ca70 58 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  X;.  }..  /* See
2ca80 64 20 74 68 65 20 73 65 61 72 63 68 20 77 69 74  d the search wit
2ca90 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65  h a single Where
2caa0 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Path containing 
2cab0 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e  zero WhereLoops.
2cac0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e  .  **.  ** TUNIN
2cad0 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68  G: Do not let th
2cae0 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  e number of iter
2caf0 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20  ations go above 
2cb00 32 35 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74  25.  If the cost
2cb10 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69  .  ** of computi
2cb20 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  ng an automatic 
2cb30 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69  index is not pai
2cb40 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68  d back within th
2cb50 65 20 66 69 72 73 74 20 32 35 0a 20 20 2a 2a 20  e first 25.  ** 
2cb60 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  rows, then do no
2cb70 74 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61  t use the automa
2cb80 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20  tic index. */.  
2cb90 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20  aFrom[0].nRow = 
2cba0 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65  MIN(pParse->nQue
2cbb0 72 79 4c 6f 6f 70 2c 20 34 36 29 3b 20 20 61 73  ryLoop, 46);  as
2cbc0 73 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65  sert( 46==sqlite
2cbd0 33 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 20  3LogEst(25) );. 
2cbe0 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 0a 20 20 2f   nFrom = 1;..  /
2cbf0 2a 20 50 72 65 63 6f 6d 70 75 74 65 20 74 68 65  * Precompute the
2cc00 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
2cc10 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c   the final resul
2cc20 74 20 73 65 74 2c 20 69 66 20 74 68 65 20 63 61  t set, if the ca
2cc30 6c 6c 65 72 0a 20 20 2a 2a 20 74 6f 20 73 71 6c  ller.  ** to sql
2cc40 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2cc50 20 77 61 73 20 63 6f 6e 63 65 72 6e 65 64 20 61   was concerned a
2cc60 62 6f 75 74 20 73 6f 72 74 69 6e 67 20 2a 2f 0a  bout sorting */.
2cc70 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b    rSortCost = 0;
2cc80 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70  .  if( pWInfo->p
2cc90 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52  OrderBy==0 || nR
2cca0 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  owEst==0 ){.    
2ccb0 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72  aFrom[0].isOrder
2ccc0 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 7d  edValid = 1;.  }
2ccd0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 55 4e  else{.    /* TUN
2cce0 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63  ING: Estimated c
2ccf0 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 69  ost of sorting i
2cd00 73 20 34 38 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77  s 48*N*log2(N) w
2cd10 68 65 72 65 20 4e 20 69 73 20 74 68 65 0a 20 20  here N is the.  
2cd20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6f    ** number of o
2cd30 75 74 70 75 74 20 72 6f 77 73 2e 20 54 68 65 20  utput rows. The 
2cd40 34 38 20 69 73 20 74 68 65 20 65 78 70 65 63 74  48 is the expect
2cd50 65 64 20 73 69 7a 65 20 6f 66 20 61 20 72 6f 77  ed size of a row
2cd60 20 74 6f 20 73 6f 72 74 2e 20 0a 20 20 20 20 2a   to sort. .    *
2cd70 2a 20 46 49 58 4d 45 3a 20 20 63 6f 6d 70 75 74  * FIXME:  comput
2cd80 65 20 61 20 62 65 74 74 65 72 20 65 73 74 69 6d  e a better estim
2cd90 61 74 65 20 6f 66 20 74 68 65 20 34 38 20 6d 75  ate of the 48 mu
2cda0 6c 74 69 70 6c 69 65 72 20 62 61 73 65 64 20 6f  ltiplier based o
2cdb0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73  n the.    ** res
2cdc0 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
2cdd0 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 72 53 6f 72  ons. */.    rSor
2cde0 74 43 6f 73 74 20 3d 20 6e 52 6f 77 45 73 74 20  tCost = nRowEst 
2cdf0 2b 20 65 73 74 4c 6f 67 28 6e 52 6f 77 45 73 74  + estLog(nRowEst
2ce00 29 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  );.    WHERETRAC
2ce10 45 28 30 78 30 30 32 2c 28 22 2d 2d 2d 2d 20 73  E(0x002,("---- s
2ce20 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64 5c 6e 22  ort cost=%-3d\n"
2ce30 2c 20 72 53 6f 72 74 43 6f 73 74 29 29 3b 0a 20  , rSortCost));. 
2ce40 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
2ce50 20 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f   successively lo
2ce60 6e 67 65 72 20 57 68 65 72 65 50 61 74 68 73 20  nger WherePaths 
2ce70 75 73 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f  using the previo
2ce80 75 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20  us generation.  
2ce90 2a 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68 73  ** of WherePaths
2cea0 20 61 73 20 74 68 65 20 62 61 73 69 73 20 66 6f   as the basis fo
2ceb0 72 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65  r the next.  Kee
2cec0 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d  p track of the m
2ced0 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73  xChoice.  ** bes
2cee0 74 20 70 61 74 68 73 20 61 74 20 65 61 63 68 20  t paths at each 
2cef0 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  generation */.  
2cf00 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f  for(iLoop=0; iLo
2cf10 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b  op<nLoop; iLoop+
2cf20 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b  +){.    nTo = 0;
2cf30 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70  .    for(ii=0, p
2cf40 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e  From=aFrom; ii<n
2cf50 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f  From; ii++, pFro
2cf60 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  m++){.      for(
2cf70 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70  pWLoop=pWInfo->p
2cf80 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70  Loops; pWLoop; p
2cf90 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e  WLoop=pWLoop->pN
2cfa0 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20  extLoop){.      
2cfb0 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65    Bitmask maskNe
2cfc0 77 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  w;.        Bitma
2cfd0 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a  sk revMask = 0;.
2cfe0 20 20 20 20 20 20 20 20 75 38 20 69 73 4f 72 64          u8 isOrd
2cff0 65 72 65 64 56 61 6c 69 64 20 3d 20 70 46 72 6f  eredValid = pFro
2d000 6d 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  m->isOrderedVali
2d010 64 3b 0a 20 20 20 20 20 20 20 20 75 38 20 69 73  d;.        u8 is
2d020 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d  Ordered = pFrom-
2d030 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20  >isOrdered;.    
2d040 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d      if( (pWLoop-
2d050 3e 70 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d  >prereq & ~pFrom
2d060 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29  ->maskLoop)!=0 )
2d070 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2d080 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e     if( (pWLoop->
2d090 6d 61 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d  maskSelf & pFrom
2d0a0 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29  ->maskLoop)!=0 )
2d0b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2d0c0 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
2d0d0 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61  int, pWLoop is a
2d0e0 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65   candidate to be
2d0f0 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20   the next loop. 
2d100 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70  .        ** Comp
2d110 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a  ute its cost */.
2d120 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20          rCost = 
2d130 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
2d140 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c  (pWLoop->rSetup,
2d150 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70  pWLoop->rRun + p
2d160 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20  From->nRow);.   
2d170 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c       rCost = sql
2d180 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 43  ite3LogEstAdd(rC
2d190 6f 73 74 2c 20 70 46 72 6f 6d 2d 3e 72 43 6f 73  ost, pFrom->rCos
2d1a0 74 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74  t);.        nOut
2d1b0 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b   = pFrom->nRow +
2d1c0 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20   pWLoop->nOut;. 
2d1d0 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d         maskNew =
2d1e0 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
2d1f0 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   | pWLoop->maskS
2d200 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28  elf;.        if(
2d210 20 21 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64   !isOrderedValid
2d220 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 77   ){.          sw
2d230 69 74 63 68 28 20 77 68 65 72 65 50 61 74 68 53  itch( wherePathS
2d240 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
2d250 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20  pWInfo,.        
2d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2d270 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c  WInfo->pOrderBy,
2d280 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e   pFrom, pWInfo->
2d290 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20  wctrlFlags,.    
2d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d2b0 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70     iLoop, pWLoop
2d2c0 2c 20 26 72 65 76 4d 61 73 6b 29 20 29 7b 0a 20  , &revMask) ){. 
2d2d0 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
2d2e0 31 3a 20 20 2f 2a 20 59 65 73 2e 20 20 70 46 72  1:  /* Yes.  pFr
2d2f0 6f 6d 2b 70 57 4c 6f 6f 70 20 64 6f 65 73 20 73  om+pWLoop does s
2d300 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52  atisfy the ORDER
2d310 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
2d320 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
2d330 64 65 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  dered = 1;.     
2d340 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
2d350 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  edValid = 1;.   
2d360 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2d370 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  ;.            ca
2d380 73 65 20 30 3a 20 20 2f 2a 20 4e 6f 2e 20 20 70  se 0:  /* No.  p
2d390 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 77 69 6c 6c  From+pWLoop will
2d3a0 20 72 65 71 75 69 72 65 20 61 20 73 65 70 61 72   require a separ
2d3b0 61 74 65 20 73 6f 72 74 20 2a 2f 0a 20 20 20 20  ate sort */.    
2d3c0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
2d3d0 72 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  red = 0;.       
2d3e0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
2d3f0 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  Valid = 1;.     
2d400 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d           rCost =
2d410 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
2d420 64 28 72 43 6f 73 74 2c 20 72 53 6f 72 74 43 6f  d(rCost, rSortCo
2d430 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  st);.           
2d440 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2d450 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 2f        default: /
2d460 2a 20 43 61 6e 6e 6f 74 20 74 65 6c 6c 20 79 65  * Cannot tell ye
2d470 74 2e 20 20 54 72 79 20 61 67 61 69 6e 20 6f 6e  t.  Try again on
2d480 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   the next iterat
2d490 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ion */.         
2d4a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2d4b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d4c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2d4d0 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d   revMask = pFrom
2d4e0 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20  ->revLoop;.     
2d4f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
2d500 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
2d510 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65  pWLoop should be
2d520 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6d 78   added to the mx
2d530 43 68 6f 69 63 65 20 62 65 73 74 20 73 6f 20 66  Choice best so f
2d540 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  ar */.        fo
2d550 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b  r(jj=0, pTo=aTo;
2d560 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70   jj<nTo; jj++, p
2d570 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  To++){.         
2d580 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f   if( pTo->maskLo
2d590 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20  op==maskNew.    
2d5a0 20 20 20 20 20 20 20 26 26 20 70 54 6f 2d 3e 69         && pTo->i
2d5b0 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3d 3d 69  sOrderedValid==i
2d5c0 73 4f 72 64 65 72 65 64 56 61 6c 69 64 0a 20 20  sOrderedValid.  
2d5d0 20 20 20 20 20 20 20 20 20 26 26 20 28 28 70 54           && ((pT
2d5e0 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73 74 20  o->rCost<=rCost 
2d5f0 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f  && pTo->nRow<=nO
2d600 75 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ut) ||.         
2d610 20 20 20 20 20 20 20 28 70 54 6f 2d 3e 72 43 6f         (pTo->rCo
2d620 73 74 3e 3d 72 43 6f 73 74 20 26 26 20 70 54 6f  st>=rCost && pTo
2d630 2d 3e 6e 52 6f 77 3e 3d 6e 4f 75 74 29 29 0a 20  ->nRow>=nOut)). 
2d640 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2d650 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2d660 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20  ( jj==nTo-1 );. 
2d670 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2d680 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2d690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d6a0 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20  if( jj>=nTo ){. 
2d6b0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f           if( nTo
2d6c0 3e 3d 6d 78 43 68 6f 69 63 65 20 26 26 20 72 43  >=mxChoice && rC
2d6d0 6f 73 74 3e 3d 6d 78 43 6f 73 74 20 29 7b 0a 23  ost>=mxCost ){.#
2d6e0 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
2d6f0 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
2d700 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
2d710 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
2d720 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
2d730 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2d740 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b  3DebugPrintf("Sk
2d750 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33  ip   %s cost=%-3
2d760 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  d,%3d order=%c\n
2d770 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2d780 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
2d790 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
2d7a0 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
2d7b0 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20   nOut,.         
2d7c0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
2d7d0 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64  edValid ? (isOrd
2d7e0 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
2d7f0 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
2d800 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2d810 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
2d820 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
2d830 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  .          /* Ad
2d840 64 20 61 20 6e 65 77 20 50 61 74 68 20 74 6f 20  d a new Path to 
2d850 74 68 65 20 61 54 6f 5b 5d 20 73 65 74 20 2a 2f  the aTo[] set */
2d860 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
2d870 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20  To<mxChoice ){. 
2d880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2d890 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20  crease the size 
2d8a0 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74 20 62  of the aTo set b
2d8b0 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20  y one */.       
2d8c0 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b       jj = nTo++;
2d8d0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2d8e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
2d8f0 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61 63   New path replac
2d900 65 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f 72  es the prior wor
2d910 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74  st to keep count
2d920 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20   below mxChoice 
2d930 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  */.            j
2d940 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20 20  j = mxI;.       
2d950 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
2d960 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23  To = &aTo[jj];.#
2d970 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
2d980 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
2d990 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
2d9a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
2d9b0 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
2d9c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2d9d0 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20 20  ugPrintf("New   
2d9e0 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
2d9f0 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
2da00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
2da10 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
2da20 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
2da30 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
2da40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2da50 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20   isOrderedValid 
2da60 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27  ? (isOrdered ? '
2da70 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29  Y' : 'N') : '?')
2da80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
2da90 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c  ndif.        }el
2daa0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
2dab0 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43  ( pTo->rCost<=rC
2dac0 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77  ost && pTo->nRow
2dad0 3c 3d 6e 4f 75 74 20 29 7b 0a 23 69 66 64 65 66  <=nOut ){.#ifdef
2dae0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
2daf0 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20  LED /* 0x4 */.  
2db00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
2db10 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
2db20 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
2db30 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2db40 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  gPrintf(.       
2db50 20 20 20 20 20 20 20 20 20 20 20 22 53 6b 69 70             "Skip
2db60 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c     %s cost=%-3d,
2db70 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  %3d order=%c",. 
2db80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db90 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
2dba0 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
2dbb0 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
2dbc0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2dbd0 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61       isOrderedVa
2dbe0 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64  lid ? (isOrdered
2dbf0 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20   ? 'Y' : 'N') : 
2dc00 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
2dc10 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2dc20 50 72 69 6e 74 66 28 22 20 20 20 76 73 20 25 73  Printf("   vs %s
2dc30 20 63 6f 73 74 3d 25 2d 33 64 2c 25 64 20 6f 72   cost=%-3d,%d or
2dc40 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
2dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
2dc60 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
2dc70 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
2dc80 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52  ->rCost, pTo->nR
2dc90 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
2dca0 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
2dcb0 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f  eredValid ? (pTo
2dcc0 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59  ->isOrdered ? 'Y
2dcd0 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b  ' : 'N') : '?');
2dce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23  .            }.#
2dcf0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
2dd00 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d    testcase( pTo-
2dd10 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b  >rCost==rCost );
2dd20 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
2dd30 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2dd40 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73   }.          tes
2dd50 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73  tcase( pTo->rCos
2dd60 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20  t==rCost+1 );.  
2dd70 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77          /* A new
2dd80 20 61 6e 64 20 62 65 74 74 65 72 20 73 63 6f 72   and better scor
2dd90 65 20 66 6f 72 20 61 20 70 72 65 76 69 6f 75 73  e for a previous
2dda0 6c 79 20 63 72 65 61 74 65 64 20 65 71 75 69 76  ly created equiv
2ddb0 61 6c 65 6e 74 20 70 61 74 68 20 2a 2f 0a 23 69  alent path */.#i
2ddc0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
2ddd0 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a  ENABLED /* 0x4 *
2dde0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2ddf0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
2de00 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
2de10 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2de20 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  gPrintf(.       
2de30 20 20 20 20 20 20 20 20 20 22 55 70 64 61 74 65           "Update
2de40 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
2de50 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
2de60 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
2de70 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
2de80 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
2de90 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
2dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2deb0 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20  sOrderedValid ? 
2dec0 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27  (isOrdered ? 'Y'
2ded0 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a   : 'N') : '?');.
2dee0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2def0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2df00 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d 25 2d    was %s cost=%-
2df10 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
2df20 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2df30 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
2df40 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
2df50 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
2df60 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
2df70 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e             pTo->
2df80 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f  isOrderedValid ?
2df90 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64   (pTo->isOrdered
2dfa0 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20   ? 'Y' : 'N') : 
2dfb0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
2dfc0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
2dfd0 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57   }.        /* pW
2dfe0 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72  Loop is a winner
2dff0 2e 20 20 41 64 64 20 69 74 20 74 6f 20 74 68 65  .  Add it to the
2e000 20 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20   set of best so 
2e010 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  far */.        p
2e020 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70  To->maskLoop = p
2e030 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c  From->maskLoop |
2e040 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c   pWLoop->maskSel
2e050 66 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  f;.        pTo->
2e060 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73  revLoop = revMas
2e070 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  k;.        pTo->
2e080 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20  nRow = nOut;.   
2e090 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20       pTo->rCost 
2e0a0 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  = rCost;.       
2e0b0 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56   pTo->isOrderedV
2e0c0 61 6c 69 64 20 3d 20 69 73 4f 72 64 65 72 65 64  alid = isOrdered
2e0d0 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20 70  Valid;.        p
2e0e0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20  To->isOrdered = 
2e0f0 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
2e100 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61     memcpy(pTo->a
2e110 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  Loop, pFrom->aLo
2e120 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65  op, sizeof(Where
2e130 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20  Loop*)*iLoop);. 
2e140 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f         pTo->aLoo
2e150 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f  p[iLoop] = pWLoo
2e160 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  p;.        if( n
2e170 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a  To>=mxChoice ){.
2e180 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20            mxI = 
2e190 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43  0;.          mxC
2e1a0 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f  ost = aTo[0].rCo
2e1b0 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78  st;.          mx
2e1c0 4f 75 74 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f  Out = aTo[0].nRo
2e1d0 77 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  w;.          for
2e1e0 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b  (jj=1, pTo=&aTo[
2e1f0 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b  1]; jj<mxChoice;
2e200 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20   jj++, pTo++){. 
2e210 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2e220 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74  To->rCost>mxCost
2e230 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d   || (pTo->rCost=
2e240 3d 6d 78 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e  =mxCost && pTo->
2e250 6e 52 6f 77 3e 6d 78 4f 75 74 29 20 29 7b 0a 20  nRow>mxOut) ){. 
2e260 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 43               mxC
2e270 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74  ost = pTo->rCost
2e280 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2e290 6d 78 4f 75 74 20 3d 20 70 54 6f 2d 3e 6e 52 6f  mxOut = pTo->nRo
2e2a0 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w;.             
2e2b0 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20   mxI = jj;.     
2e2c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e2d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2e2e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
2e2f0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
2e300 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20  ENABLED  /* >=2 
2e310 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
2e320 65 33 57 68 65 72 65 54 72 61 63 65 3e 3d 32 20  e3WhereTrace>=2 
2e330 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2e340 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d  DebugPrintf("---
2e350 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25 64  - after round %d
2e360 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29   ----\n", iLoop)
2e370 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
2e380 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54  , pTo=aTo; ii<nT
2e390 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b  o; ii++, pTo++){
2e3a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2e3b0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 73  DebugPrintf(" %s
2e3c0 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d   cost=%-3d nrow=
2e3d0 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  %-3d order=%c",.
2e3e0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
2e3f0 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
2e400 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
2e410 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
2e420 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 6f  ,.           pTo
2e430 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
2e440 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   ? (pTo->isOrder
2e450 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20  ed ? 'Y' : 'N') 
2e460 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
2e470 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72  if( pTo->isOrder
2e480 65 64 56 61 6c 69 64 20 26 26 20 70 54 6f 2d 3e  edValid && pTo->
2e490 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20 20 20  isOrdered ){.   
2e4a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
2e4b0 62 75 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d  bugPrintf(" rev=
2e4c0 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e  0x%llx\n", pTo->
2e4d0 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  revLoop);.      
2e4e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2e4f0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2e500 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
2e510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2e520 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
2e530 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c   /* Swap the rol
2e540 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20  es of aFrom and 
2e550 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74  aTo for the next
2e560 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20   generation */. 
2e570 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a     pFrom = aTo;.
2e580 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b      aTo = aFrom;
2e590 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72  .    aFrom = pFr
2e5a0 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20  om;.    nFrom = 
2e5b0 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  nTo;.  }..  if( 
2e5c0 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  nFrom==0 ){.    
2e5d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2e5e0 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72  pParse, "no quer
2e5f0 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20  y solution");.  
2e600 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2e610 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20  db, pSpace);.   
2e620 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2e630 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  RROR;.  }.  .  /
2e640 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73  * Find the lowes
2e650 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46  t cost path.  pF
2e660 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74  rom will be left
2e670 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61   pointing to tha
2e680 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f  t path */.  pFro
2e690 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72  m = aFrom;.  for
2e6a0 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b  (ii=1; ii<nFrom;
2e6b0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
2e6c0 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72  pFrom->rCost>aFr
2e6d0 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20 70  om[ii].rCost ) p
2e6e0 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69  From = &aFrom[ii
2e6f0 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  ];.  }.  assert(
2e700 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
2e710 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c  =nLoop );.  /* L
2e720 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  oad the lowest c
2e730 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57  ost path into pW
2e740 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c  Info */.  for(iL
2e750 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f  oop=0; iLoop<nLo
2e760 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
2e770 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
2e780 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  evel = pWInfo->a
2e790 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c   + iLoop;.    pL
2e7a0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70  evel->pWLoop = p
2e7b0 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61  WLoop = pFrom->a
2e7c0 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20  Loop[iLoop];.   
2e7d0 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d   pLevel->iFrom =
2e7e0 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20   pWLoop->iTab;. 
2e7f0 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43     pLevel->iTabC
2e800 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ur = pWInfo->pTa
2e810 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
2e820 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b  >iFrom].iCursor;
2e830 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e  .  }.  if( (pWIn
2e840 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
2e850 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
2e860 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28  INCT)!=0.   && (
2e870 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2e880 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
2e890 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20  NCTBY)==0.   && 
2e8a0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
2e8b0 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  t==WHERE_DISTINC
2e8c0 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f  T_NOOP.   && nRo
2e8d0 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69  wEst.  ){.    Bi
2e8e0 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20  tmask notUsed;. 
2e8f0 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72     int rc = wher
2e900 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
2e910 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57  derBy(pWInfo, pW
2e920 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
2e930 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20  , pFrom,.       
2e940 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
2e950 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f  DISTINCTBY, nLoo
2e960 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
2e970 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74  p[nLoop-1], &not
2e980 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  Used);.    if( r
2e990 63 3d 3d 31 20 29 20 70 57 49 6e 66 6f 2d 3e 65  c==1 ) pWInfo->e
2e9a0 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
2e9b0 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
2e9c0 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72  D;.  }.  if( pFr
2e9d0 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 7b  om->isOrdered ){
2e9e0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
2e9f0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
2ea00 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29  ERE_DISTINCTBY )
2ea10 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
2ea20 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
2ea30 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
2ea40 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ED;.    }else{. 
2ea50 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 42       pWInfo->bOB
2ea60 53 61 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  Sat = 1;.      p
2ea70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
2ea80 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b   pFrom->revLoop;
2ea90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 49  .    }.  }.  pWI
2eaa0 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70  nfo->nRowOut = p
2eab0 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f  From->nRow;..  /
2eac0 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79  * Free temporary
2ead0 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75   memory and retu
2eae0 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20  rn success */.  
2eaf0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2eb00 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74  , pSpace);.  ret
2eb10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2eb20 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65  ../*.** Most que
2eb30 72 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20  ries use only a 
2eb40 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68  single table (th
2eb50 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73  ey are not joins
2eb60 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69  ) and have.** si
2eb70 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69  mple == constrai
2eb80 6e 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65  nts against inde
2eb90 78 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69  xed fields.  Thi
2eba0 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
2ebb0 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68  ts.** to plan th
2ebc0 6f 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73  ose simple cases
2ebd0 20 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73   using much less
2ebe0 20 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74   ceremony than t
2ebf0 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75  he.** general-pu
2ec00 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e  rpose query plan
2ec10 6e 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79  ner, and thereby
2ec20 20 79 69 65 6c 64 20 66 61 73 74 65 72 20 73 71   yield faster sq
2ec30 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a  lite3_prepare().
2ec40 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65  ** times for the
2ec50 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a   common case..**
2ec60 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
2ec70 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ero on success, 
2ec80 69 66 20 74 68 69 73 20 71 75 65 72 79 20 63 61  if this query ca
2ec90 6e 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20  n be handled by 
2eca0 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c  this.** no-frill
2ecb0 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  s query planner.
2ecc0 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66    Return zero if
2ecd0 20 74 68 69 73 20 71 75 65 72 79 20 6e 65 65 64   this query need
2ece0 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61  s the .** genera
2ecf0 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20  l-purpose query 
2ed00 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74  planner..*/.stat
2ed10 69 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72  ic int whereShor
2ed20 74 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75  tCut(WhereLoopBu
2ed30 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29  ilder *pBuilder)
2ed40 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
2ed50 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  WInfo;.  struct 
2ed60 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2ed70 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  tem;.  WhereClau
2ed80 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
2ed90 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57  Term *pTerm;.  W
2eda0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
2edb0 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69  .  int iCur;.  i
2edc0 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70  nt j;.  Table *p
2edd0 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
2ede0 64 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20  dx;.  .  pWInfo 
2edf0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
2ee00 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  fo;.  if( pWInfo
2ee10 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
2ee20 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
2ee30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
2ee40 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70  ssert( pWInfo->p
2ee50 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31  TabList->nSrc>=1
2ee60 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57   );.  pItem = pW
2ee70 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
2ee80 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65  a;.  pTab = pIte
2ee90 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49  m->pTab;.  if( I
2eea0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
2eeb0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
2eec0 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 29   pItem->zIndex )
2eed0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75   return 0;.  iCu
2eee0 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  r = pItem->iCurs
2eef0 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49  or;.  pWC = &pWI
2ef00 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f  nfo->sWC;.  pLoo
2ef10 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
2ef20 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  ew;.  pLoop->wsF
2ef30 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f  lags = 0;.  pLoo
2ef40 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70  p->u.btree.nSkip
2ef50 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20   = 0;.  pTerm = 
2ef60 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
2ef70 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51  ur, -1, 0, WO_EQ
2ef80 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72  , 0);.  if( pTer
2ef90 6d 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  m ){.    pLoop->
2efa0 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
2efb0 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f  COLUMN_EQ|WHERE_
2efc0 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57  IPK|WHERE_ONEROW
2efd0 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54  ;.    pLoop->aLT
2efe0 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[0] = pTerm;.
2eff0 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72      pLoop->nLTer
2f000 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70  m = 1;.    pLoop
2f010 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
2f020 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  1;.    /* TUNING
2f030 3a 20 43 6f 73 74 20 6f 66 20 61 20 72 6f 77 69  : Cost of a rowi
2f040 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a  d lookup is 10 *
2f050 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75  /.    pLoop->rRu
2f060 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d  n = 33;  /* 33==
2f070 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
2f080 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ) */.  }else{.  
2f090 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
2f0a0 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
2f0b0 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
2f0c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2f0d0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61  pLoop->aLTermSpa
2f0e0 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  ce==pLoop->aLTer
2f0f0 6d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  m );.      asser
2f100 74 28 20 41 72 72 61 79 53 69 7a 65 28 70 4c 6f  t( ArraySize(pLo
2f110 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29  op->aLTermSpace)
2f120 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==4 );.      if(
2f130 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d   pIdx->onError==
2f140 4f 45 5f 4e 6f 6e 65 20 0a 20 20 20 20 20 20 20  OE_None .       
2f150 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  || pIdx->pPartId
2f160 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20 20 20  xWhere!=0 .     
2f170 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43    || pIdx->nKeyC
2f180 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28 70 4c 6f  ol>ArraySize(pLo
2f190 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29  op->aLTermSpace)
2f1a0 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74 69 6e   .      ) contin
2f1b0 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ue;.      for(j=
2f1c0 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  0; j<pIdx->nKeyC
2f1d0 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
2f1e0 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
2f1f0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 49  rm(pWC, iCur, pI
2f200 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c  dx->aiColumn[j],
2f210 20 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29   0, WO_EQ, pIdx)
2f220 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
2f230 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  erm==0 ) break;.
2f240 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61          pLoop->a
2f250 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d  LTerm[j] = pTerm
2f260 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f270 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65  if( j!=pIdx->nKe
2f280 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  yCol ) continue;
2f290 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73  .      pLoop->ws
2f2a0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  Flags = WHERE_CO
2f2b0 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e  LUMN_EQ|WHERE_ON
2f2c0 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45 58  EROW|WHERE_INDEX
2f2d0 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ED;.      if( pI
2f2e0 64 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 7c  dx->isCovering |
2f2f0 7c 20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  | (pItem->colUse
2f300 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e  d & ~columnsInIn
2f310 64 65 78 28 70 49 64 78 29 29 3d 3d 30 20 29 7b  dex(pIdx))==0 ){
2f320 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
2f330 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
2f340 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20  _IDX_ONLY;.     
2f350 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e   }.      pLoop->
2f360 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20  nLTerm = j;.    
2f370 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
2f380 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20  .nEq = j;.      
2f390 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
2f3a0 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20  Index = pIdx;.  
2f3b0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
2f3c0 6f 73 74 20 6f 66 20 61 20 75 6e 69 71 75 65 20  ost of a unique 
2f3d0 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20  index lookup is 
2f3e0 31 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f  15 */.      pLoo
2f3f0 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f  p->rRun = 39;  /
2f400 2a 20 33 39 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  * 39==sqlite3Log
2f410 45 73 74 28 31 35 29 20 2a 2f 0a 20 20 20 20 20  Est(15) */.     
2f420 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2f430 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  }.  if( pLoop->w
2f440 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 70 4c  sFlags ){.    pL
2f450 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67  oop->nOut = (Log
2f460 45 73 74 29 31 3b 0a 20 20 20 20 70 57 49 6e 66  Est)1;.    pWInf
2f470 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d  o->a[0].pWLoop =
2f480 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f   pLoop;.    pLoo
2f490 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65  p->maskSelf = ge
2f4a0 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
2f4b0 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a  MaskSet, iCur);.
2f4c0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
2f4d0 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b  .iTabCur = iCur;
2f4e0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  .    pWInfo->nRo
2f4f0 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66  wOut = 1;.    if
2f500 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
2f510 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 62 4f 42  By ) pWInfo->bOB
2f520 53 61 74 20 3d 20 20 31 3b 0a 20 20 20 20 69 66  Sat =  1;.    if
2f530 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
2f540 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
2f550 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
2f560 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
2f570 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
2f580 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
2f590 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
2f5a0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f  TE_DEBUG.    pLo
2f5b0 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23  op->cId = '0';.#
2f5c0 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
2f5d0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
2f5e0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
2f5f0 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e  erate the beginn
2f600 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ing of the loop 
2f610 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63  used for WHERE c
2f620 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
2f630 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
2f640 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74  value is a point
2f650 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20  er to an opaque 
2f660 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63  structure that c
2f670 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72  ontains.** infor
2f680 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f  mation needed to
2f690 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
2f6a0 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65  oop.  Later, the
2f6b0 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
2f6c0 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b  .** should invok
2f6d0 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  e sqlite3WhereEn
2f6e0 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74  d() with the ret
2f6f0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
2f700 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  s function.** in
2f710 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65   order to comple
2f720 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  te the WHERE cla
2f730 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
2f740 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
2f750 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72  r occurs, this r
2f760 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e  outine returns N
2f770 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62  ULL..**.** The b
2f780 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20  asic idea is to 
2f790 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  do a nested loop
2f7a0 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65  , one loop for e
2f7b0 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20  ach table in.** 
2f7c0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2f7d0 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49  of a select.  (I
2f7e0 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
2f7f0 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
2f800 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61  the.** same as a
2f810 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c   SELECT with onl
2f820 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
2f830 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2f840 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78  use.)  For.** ex
2f850 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51  ample, if the SQ
2f860 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  L is this:.**.**
2f870 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
2f880 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20  FROM t1, t2, t3 
2f890 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a  WHERE ...;.**.**
2f8a0 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67   Then the code g
2f8b0 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63  enerated is conc
2f8c0 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68  eptually like th
2f8d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2f8e0 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
2f8f0 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20  row1 in t1 do   
2f900 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
2f910 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
2f920 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
2f930 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d  n t2 do      |--
2f940 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
2f950 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20  Begin().**      
2f960 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33      foreach row3
2f970 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a   in t3 do   /.**
2f980 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a              ....
2f990 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20  **          end 
2f9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f9b0 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
2f9c0 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
2f9d0 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
2f9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d               |--
2f9f0 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
2fa00 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e  End().**      en
2fa10 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
2fa20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a            /.**.*
2fa30 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
2fa40 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20  loops might not 
2fa50 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65  be nested in the
2fa60 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20   order in which 
2fa70 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69  they.** appear i
2fa80 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2fa90 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74  e if a different
2faa0 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72   order is better
2fab0 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a   able to make.**
2fac0 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e   use of indices.
2fad0 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
2fae0 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65   when the IN ope
2faf0 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e  rator appears in
2fb00 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c  .** the WHERE cl
2fb10 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72  ause, it might r
2fb20 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f  esult in additio
2fb30 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73  nal nested loops
2fb40 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67   for.** scanning
2fb50 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c   through all val
2fb60 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ues on the right
2fb70 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
2fb80 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  e IN..**.** Ther
2fb90 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73  e are Btree curs
2fba0 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
2fbb0 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20  ith each table. 
2fbc0 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a   t1 uses cursor.
2fbd0 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69  ** number pTabLi
2fbe0 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
2fbf0 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63  .  t2 uses the c
2fc00 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e  ursor pTabList->
2fc10 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a  a[1].iCursor..**
2fc20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
2fc30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
2fc40 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f  erates code to o
2fc50 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63  pen those VDBE c
2fc60 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71  ursors.** and sq
2fc70 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
2fc80 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
2fc90 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d  de to close them
2fca0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  ..**.** The code
2fcb0 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65   that sqlite3Whe
2fcc0 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61  reBegin() genera
2fcd0 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63  tes leaves the c
2fce0 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20  ursors named.** 
2fcf0 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e  in pTabList poin
2fd00 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70  ting at their ap
2fd10 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65  propriate entrie
2fd20 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f  s.  The [...] co
2fd30 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50  de.** can use OP
2fd40 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52  _Column and OP_R
2fd50 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20  owid opcodes on 
2fd60 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f  these cursors to
2fd70 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61   extract.** data
2fd80 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75   from the variou
2fd90 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20  s tables of the 
2fda0 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  loop..**.** If t
2fdb0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2fdc0 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f  is empty, the fo
2fdd0 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74  reach loops must
2fde0 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72   each scan their
2fdf0 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65  .** entire table
2fe00 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65  s.  Thus a three
2fe10 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20  -way join is an 
2fe20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e  O(N^3) operation
2fe30 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65  .  But if.** the
2fe40 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64   tables have ind
2fe50 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61  ices and there a
2fe60 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  re terms in the 
2fe70 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
2fe80 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68  t.** refer to th
2fe90 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63  ose indices, a c
2fea0 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63  omplete table sc
2feb0 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65  an can be avoide
2fec0 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64  d and the.** cod
2fed0 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20  e will run much 
2fee0 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66  faster.  Most of
2fef0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69   the work of thi
2ff00 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65  s routine is che
2ff10 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20  cking.** to see 
2ff20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64  if there are ind
2ff30 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65  ices that can be
2ff40 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75   used to speed u
2ff50 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  p the loop..**.*
2ff60 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * Terms of the W
2ff70 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20  HERE clause are 
2ff80 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d  also used to lim
2ff90 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63  it which rows ac
2ffa0 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69  tually.** make i
2ffb0 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69  t to the "..." i
2ffc0 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
2ffd0 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72  the loop.  After
2ffe0 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c   each "foreach",
2fff0 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65  .** terms of the
30000 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
30010 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d  at use only term
30020 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61  s in that loop a
30030 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70  nd outer.** loop
30040 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  s are evaluated 
30050 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a  and if false a j
30060 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75  ump is made arou
30070 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  nd all subsequen
30080 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  t.** inner loops
30090 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20   (or around the 
300a0 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73  "..." if the tes
300b0 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  t occurs within 
300c0 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f  the inner-.** mo
300d0 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f  st loop).**.** O
300e0 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a  UTER JOINS.**.**
300f0 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f   An outer join o
30100 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20  f tables t1 and 
30110 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c  t2 is conceptall
30120 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f  y coded as follo
30130 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72  ws:.**.**    for
30140 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
30150 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20  do.**      flag 
30160 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  = 0.**      fore
30170 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64  ach row2 in t2 d
30180 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72  o.**        star
30190 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e  t:.**          .
301a0 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ...**          f
301b0 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20  lag = 1.**      
301c0 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66  end.**      if f
301d0 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20  lag==0 then.**  
301e0 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72        move the r
301f0 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20  ow2 cursor to a 
30200 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20  null row.**     
30210 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a     goto start.**
30220 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65        fi.**    e
30230 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42  nd.**.** ORDER B
30240 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53  Y CLAUSE PROCESS
30250 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72  ING.**.** pOrder
30260 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  By is a pointer 
30270 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
30280 63 6c 61 75 73 65 20 28 6f 72 20 74 68 65 20 47  clause (or the G
30290 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a  ROUP BY clause.*
302a0 2a 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 47  * if the WHERE_G
302b0 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73  ROUPBY flag is s
302c0 65 74 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73  et in wctrlFlags
302d0 29 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  ) of a SELECT st
302e0 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68  atement.** if th
302f0 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20  ere is one.  If 
30300 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
30310 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69  R BY clause or i
30320 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
30330 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  * is called from
30340 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
30350 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  LETE statement, 
30360 74 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73  then pOrderBy is
30370 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
30380 20 69 49 64 78 43 75 72 20 70 61 72 61 6d 65 74   iIdxCur paramet
30390 65 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72  er is the cursor
303a0 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e   number of an in
303b0 64 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45  dex.  If .** WHE
303c0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
303d0 20 69 73 20 73 65 74 2c 20 69 49 64 78 43 75 72   is set, iIdxCur
303e0 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e   is the cursor n
303f0 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65  umber of an inde
30400 78 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20  x.** to use for 
30410 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  OR clause proces
30420 73 69 6e 67 2e 20 20 54 68 65 20 57 48 45 52 45  sing.  The WHERE
30430 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 75   clause should u
30440 73 65 20 74 68 69 73 0a 2a 2a 20 73 70 65 63 69  se this.** speci
30450 66 69 63 20 63 75 72 73 6f 72 2e 20 20 49 66 20  fic cursor.  If 
30460 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
30470 53 49 52 45 44 20 69 73 20 73 65 74 2c 20 74 68  SIRED is set, th
30480 65 6e 20 69 49 64 78 43 75 72 20 69 73 0a 2a 2a  en iIdxCur is.**
30490 20 74 68 65 20 66 69 72 73 74 20 63 75 72 73 6f   the first curso
304a0 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  r in an array of
304b0 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c   cursors for all
304c0 20 69 6e 64 69 63 65 73 2e 20 20 69 49 64 78 43   indices.  iIdxC
304d0 75 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  ur should.** be 
304e0 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
304f0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
30500 63 75 72 73 6f 72 20 64 65 70 65 6e 64 69 6e 67  cursor depending
30510 20 6f 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20   on which index 
30520 69 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57  is.** used..*/.W
30530 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65  hereInfo *sqlite
30540 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50  3WhereBegin(.  P
30550 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
30560 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
30570 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
30580 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
30590 74 2c 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  t,    /* FROM cl
305a0 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20  ause: A list of 
305b0 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65  all tables to be
305c0 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78   scanned */.  Ex
305d0 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
305e0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
305f0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
30600 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
30610 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42     /* An ORDER B
30620 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c  Y clause, or NUL
30630 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
30640 2a 70 52 65 73 75 6c 74 53 65 74 2c 20 2f 2a 20  *pResultSet, /* 
30650 52 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  Result set of th
30660 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 75 31 36  e query */.  u16
30670 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20   wctrlFlags,    
30680 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
30690 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64   WHERE_* flags d
306a0 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65  efined in sqlite
306b0 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69  Int.h */.  int i
306c0 49 64 78 43 75 72 20 20 20 20 20 20 20 20 20 20  IdxCur          
306d0 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e 45   /* If WHERE_ONE
306e0 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65  TABLE_ONLY is se
306f0 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  t, index cursor 
30700 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  number */.){.  i
30710 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20  nt nByteWInfo;  
30720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
30730 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  . bytes allocate
30740 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20  d for WhereInfo 
30750 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20  struct */.  int 
30760 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20  nTabList;       
30770 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
30780 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
30790 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68  pTabList */.  Wh
307a0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
307b0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c           /* Will
307c0 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75   become the retu
307d0 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
307e0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56   function */.  V
307f0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
30800 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65  >pVdbe;   /* The
30810 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73   virtual databas
30820 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69  e engine */.  Bi
30830 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20  tmask notReady; 
30840 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
30850 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
30860 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20   yet positioned 
30870 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
30880 69 6c 64 65 72 20 73 57 4c 42 3b 20 20 20 20 20  ilder sWLB;     
30890 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70  /* The WhereLoop
308a0 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68   builder */.  Wh
308b0 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
308c0 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  kSet;    /* The 
308d0 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20  expression mask 
308e0 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  set */.  WhereLe
308f0 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20  vel *pLevel;    
30900 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
30910 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d  level in pWInfo-
30920 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  >a[] */.  WhereL
30930 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  oop *pLoop;     
30940 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
30950 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72  to a single Wher
30960 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
30970 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
30980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30990 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
309a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
309b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
309c0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
309d0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ion */.  int rc;
309e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
309f0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
30a00 64 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72  de */...  /* Var
30a10 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61  iable initializa
30a20 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70  tion */.  db = p
30a30 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d  Parse->db;.  mem
30a40 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69  set(&sWLB, 0, si
30a50 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 20 20 73  zeof(sWLB));.  s
30a60 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  WLB.pOrderBy = p
30a70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 44  OrderBy;..  /* D
30a80 69 73 61 62 6c 65 20 74 68 65 20 44 49 53 54 49  isable the DISTI
30a90 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  NCT optimization
30aa0 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69   if SQLITE_Disti
30ab0 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20 76 69  nctOpt is set vi
30ac0 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74  a.  ** sqlite3_t
30ad0 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f  est_ctrl(SQLITE_
30ae0 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
30af0 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20  ATIONS,...) */. 
30b00 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
30b10 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
30b20 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74  LITE_DistinctOpt
30b30 29 20 29 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c  ) ){.    wctrlFl
30b40 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 57 41  ags &= ~WHERE_WA
30b50 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d  NT_DISTINCT;.  }
30b60 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65  ..  /* The numbe
30b70 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  r of tables in t
30b80 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
30b90 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65  s limited by the
30ba0 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
30bb0 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73  bits in a Bitmas
30bc0 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  k .  */.  testca
30bd0 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  se( pTabList->nS
30be0 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28  rc==BMS );.  if(
30bf0 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
30c00 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  BMS ){.    sqlit
30c10 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
30c20 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74  e, "at most %d t
30c30 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22  ables in a join"
30c40 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75  , BMS);.    retu
30c50 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
30c60 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  This function no
30c70 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73  rmally generates
30c80 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66   a nested loop f
30c90 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  or all tables in
30ca0 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e   .  ** pTabList.
30cb0 20 20 42 75 74 20 69 66 20 74 68 65 20 57 48 45    But if the WHE
30cc0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
30cd0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
30ce0 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a  en we should.  *
30cf0 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20  * only generate 
30d00 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69 72  code for the fir
30d10 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62  st table in pTab
30d20 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20  List and assume 
30d30 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75  that.  ** any cu
30d40 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
30d50 20 77 69 74 68 20 73 75 62 73 65 71 75 65 6e 74   with subsequent
30d60 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e   tables are unin
30d70 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
30d80 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63    nTabList = (wc
30d90 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
30da0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20  _ONETABLE_ONLY) 
30db0 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e  ? 1 : pTabList->
30dc0 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  nSrc;..  /* Allo
30dd0 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
30de0 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ize the WhereInf
30df0 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
30e00 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
30e10 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  .  ** return val
30e20 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c  ue. A single all
30e30 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  ocation is used 
30e40 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65  to store the Whe
30e50 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75  reInfo.  ** stru
30e60 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ct, the contents
30e70 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b   of WhereInfo.a[
30e80 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  ], the WhereClau
30e90 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
30ea0 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d  * and the WhereM
30eb0 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65  askSet structure
30ec0 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61  . Since WhereCla
30ed0 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  use contains an 
30ee0 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c  8-byte.  ** fiel
30ef0 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29  d (type Bitmask)
30f00 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67   it must be alig
30f10 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65  ned on an 8-byte
30f20 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a   boundary on.  *
30f30 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74  * some architect
30f40 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20  ures. Hence the 
30f50 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a  ROUND8() below..
30f60 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66    */.  nByteWInf
30f70 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  o = ROUND8(sizeo
30f80 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54  f(WhereInfo)+(nT
30f90 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66  abList-1)*sizeof
30fa0 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20  (WhereLevel));. 
30fb0 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
30fc0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
30fd0 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 73  , nByteWInfo + s
30fe0 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29  izeof(WhereLoop)
30ff0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
31000 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
31010 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
31020 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  b, pWInfo);.    
31030 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20  pWInfo = 0;.    
31040 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
31050 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  rror;.  }.  pWIn
31060 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
31070 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 69  [0] = pWInfo->ai
31080 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20  CurOnePass[1] = 
31090 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c  -1;.  pWInfo->nL
310a0 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b  evel = nTabList;
310b0 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  .  pWInfo->pPars
310c0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57  e = pParse;.  pW
310d0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d  Info->pTabList =
310e0 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49   pTabList;.  pWI
310f0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  nfo->pOrderBy = 
31100 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49 6e  pOrderBy;.  pWIn
31110 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d  fo->pResultSet =
31120 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 70   pResultSet;.  p
31130 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20  WInfo->iBreak = 
31140 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
31150 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66  abel(v);.  pWInf
31160 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20  o->wctrlFlags = 
31170 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57  wctrlFlags;.  pW
31180 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
31190 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e  yLoop = pParse->
311a0 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d  nQueryLoop;.  pM
311b0 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f  askSet = &pWInfo
311c0 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57  ->sMaskSet;.  sW
311d0 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e  LB.pWInfo = pWIn
311e0 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d  fo;.  sWLB.pWC =
311f0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20   &pWInfo->sWC;. 
31200 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68   sWLB.pNew = (Wh
31210 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61 72  ereLoop*)(((char
31220 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65 57  *)pWInfo)+nByteW
31230 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  Info);.  assert(
31240 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
31250 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77 29  NMENT(sWLB.pNew)
31260 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49   );.  whereLoopI
31270 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a  nit(sWLB.pNew);.
31280 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
31290 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d  BUG.  sWLB.pNew-
312a0 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64  >cId = '*';.#end
312b0 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74  if..  /* Split t
312c0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
312d0 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75  into separate su
312e0 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65  bexpressions whe
312f0 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62  re each.  ** sub
31300 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
31310 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e  parated by an AN
31320 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f  D operator..  */
31330 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70  .  initMaskSet(p
31340 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72  MaskSet);.  wher
31350 65 43 6c 61 75 73 65 49 6e 69 74 28 26 70 57 49  eClauseInit(&pWI
31360 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f  nfo->sWC, pWInfo
31370 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28  );.  whereSplit(
31380 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57  &pWInfo->sWC, pW
31390 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20  here, TK_AND);. 
313a0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
313b0 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
313c0 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20   -1); /* Insert 
313d0 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
313e0 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 20 20  ier Goto */.    
313f0 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
31400 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75  se: a WHERE clau
31410 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  se that is const
31420 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74  ant.  Evaluate t
31430 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  he.  ** expressi
31440 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75  on and either ju
31450 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  mp over all of t
31460 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20  he code or fall 
31470 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  thru..  */.  if(
31480 20 70 57 68 65 72 65 20 26 26 20 28 6e 54 61 62   pWhere && (nTab
31490 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  List==0 || sqlit
314a0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
314b0 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72 65 29 29  NotJoin(pWhere))
314c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
314d0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
314e0 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66  e, pWhere, pWInf
314f0 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49 54  o->iBreak, SQLIT
31500 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
31510 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20     pWhere = 0;. 
31520 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c   }..  /* Special
31530 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63   case: No FROM c
31540 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28  lause.  */.  if(
31550 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a   nTabList==0 ){.
31560 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
31570 20 29 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61   ) pWInfo->bOBSa
31580 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 77  t = 1;.    if( w
31590 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
315a0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
315b0 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
315c0 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
315d0 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
315e0 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
315f0 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74   /* Assign a bit
31600 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73   from the bitmas
31610 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  k to every term 
31620 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
31630 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  se..  **.  ** Wh
31640 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74  en assigning bit
31650 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46  mask values to F
31660 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f  ROM clause curso
31670 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20  rs, it must be. 
31680 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68 61   ** the case tha
31690 74 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69  t if X is the bi
316a0 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d  tmask for the N-
316b0 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  th FROM clause t
316c0 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  erm then.  ** th
316d0 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  e bitmask for al
316e0 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  l FROM clause te
316f0 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  rms to the left 
31700 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d  of the N-th term
31710 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20  .  ** is (X-1). 
31720 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20    An expression 
31730 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75  from the ON clau
31740 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  se of a LEFT JOI
31750 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69  N can use.  ** i
31760 74 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  ts Expr.iRightJo
31770 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f  inTable value to
31780 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73   find the bitmas
31790 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  k of the right t
317a0 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  able.  ** of the
317b0 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74   join.  Subtract
317c0 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65  ing one from the
317d0 20 72 69 67 68 74 20 74 61 62 6c 65 20 62 69 74   right table bit
317e0 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a  mask gives a.  *
317f0 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  * bitmask for al
31800 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
31810 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  left of the join
31820 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62  .  Knowing the b
31830 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20  itmask.  ** for 
31840 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
31850 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74  e left of a left
31860 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61   join is importa
31870 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  nt.  Ticket #301
31880 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  5..  **.  ** Not
31890 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20  e that bitmasks 
318a0 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20  are created for 
318b0 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  all pTabList->nS
318c0 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a  rc tables in.  *
318d0 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20  * pTabList, not 
318e0 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20 6e  just the first n
318f0 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20  TabList tables. 
31900 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72   nTabList is nor
31910 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c  mally.  ** equal
31920 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   to pTabList->nS
31930 72 63 20 62 75 74 20 6d 69 67 68 74 20 62 65 20  rc but might be 
31940 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69  shortened to 1 i
31950 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45  f the.  ** WHERE
31960 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66  _ONETABLE_ONLY f
31970 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f  lag is set..  */
31980 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
31990 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
319a0 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74  ii++){.    creat
319b0 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  eMask(pMaskSet, 
319c0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  pTabList->a[ii].
319d0 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69  iCursor);.  }.#i
319e0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b  fndef NDEBUG.  {
319f0 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54  .    Bitmask toT
31a00 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20  heLeft = 0;.    
31a10 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61  for(ii=0; ii<pTa
31a20 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b  bList->nSrc; ii+
31a30 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  +){.      Bitmas
31a40 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  k m = getMask(pM
31a50 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
31a60 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29  ->a[ii].iCursor)
31a70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
31a80 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74  (m-1)==toTheLeft
31a90 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65 4c   );.      toTheL
31aa0 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a  eft |= m;.    }.
31ab0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
31ac0 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20   Analyze all of 
31ad0 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
31ae0 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 65  ns.  Note that e
31af0 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67  xprAnalyze() mig
31b00 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77 20  ht.  ** add new 
31b10 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e  virtual terms on
31b20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
31b30 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
31b40 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20   We do not.  ** 
31b50 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20  want to analyze 
31b60 74 68 65 73 65 20 76 69 72 74 75 61 6c 20 74 65  these virtual te
31b70 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e  rms, so start an
31b80 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65  alyzing at the e
31b90 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b  nd.  ** and work
31ba0 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61 74   forward so that
31bb0 20 74 68 65 20 61 64 64 65 64 20 76 69 72 74 75   the added virtu
31bc0 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76  al terms are nev
31bd0 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20  er processed..  
31be0 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  */.  exprAnalyze
31bf0 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 26 70  All(pTabList, &p
31c00 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69  WInfo->sWC);.  i
31c10 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
31c20 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
31c30 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
31c40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
31c50 65 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47  e ORDER BY (or G
31c60 52 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20  ROUP BY) clause 
31c70 63 6f 6e 74 61 69 6e 73 20 72 65 66 65 72 65 6e  contains referen
31c80 63 65 73 20 74 6f 20 67 65 6e 65 72 61 6c 0a 20  ces to general. 
31c90 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 2c   ** expressions,
31ca0 20 74 68 65 6e 20 77 65 20 77 6f 6e 27 74 20 62   then we won't b
31cb0 65 20 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66  e able to satisf
31cc0 79 20 69 74 20 75 73 69 6e 67 20 69 6e 64 69 63  y it using indic
31cd0 65 73 2c 20 73 6f 0a 20 20 2a 2a 20 67 6f 20 61  es, so.  ** go a
31ce0 68 65 61 64 20 61 6e 64 20 64 69 73 61 62 6c 65  head and disable
31cf0 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
31d00 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20  if( pOrderBy && 
31d10 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
31d20 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
31d30 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  T)!=0 ){.    for
31d40 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 64 65 72  (ii=0; ii<pOrder
31d50 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  By->nExpr; ii++)
31d60 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
31d70 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
31d80 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
31d90 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 70 45 78  derBy->a[ii].pEx
31da0 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
31db0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
31dc0 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  UMN ){.        p
31dd0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
31de0 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  = pOrderBy = 0;.
31df0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
31e00 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
31e10 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
31e20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
31e30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
31e40 20 20 7d 0a 0a 20 20 69 66 28 20 77 63 74 72 6c    }..  if( wctrl
31e50 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
31e60 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
31e70 20 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63     if( isDistinc
31e80 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73  tRedundant(pPars
31e90 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57  e, pTabList, &pW
31ea0 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75  Info->sWC, pResu
31eb0 6c 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20  ltSet) ){.      
31ec0 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54 20  /* The DISTINCT 
31ed0 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74  marking is point
31ee0 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69 74  less.  Ignore it
31ef0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66  . */.      pWInf
31f00 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
31f10 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
31f20 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20  IQUE;.    }else 
31f30 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
31f40 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20  ){.      /* Try 
31f50 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65 20  to ORDER BY the 
31f60 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d 61  result set to ma
31f70 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f 63  ke distinct proc
31f80 65 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a 2f  essing easier */
31f90 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77  .      pWInfo->w
31fa0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45  ctrlFlags |= WHE
31fb0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a 20  RE_DISTINCTBY;. 
31fc0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72       pWInfo->pOr
31fd0 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74 53  derBy = pResultS
31fe0 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  et;.    }.  }.. 
31ff0 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68   /* Construct th
32000 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
32010 63 74 73 20 2a 2f 0a 20 20 57 48 45 52 45 54 52  cts */.  WHERETR
32020 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a  ACE(0xffff,("***
32030 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74   Optimizer Start
32040 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 2f 2a 20   ***\n"));.  /* 
32050 44 69 73 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d  Display all term
32060 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
32070 6c 61 75 73 65 20 2a 2f 0a 23 69 66 20 64 65 66  lause */.#if def
32080 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f  ined(WHERETRACE_
32090 45 4e 41 42 4c 45 44 29 20 26 26 20 64 65 66 69  ENABLED) && defi
320a0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
320b0 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a  E_TREE_EXPLAIN).
320c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
320d0 72 65 54 72 61 63 65 20 26 20 30 78 31 30 30 20  reTrace & 0x100 
320e0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
320f0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
32100 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 73  se->pVdbe;.    s
32110 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 42 65 67  qlite3ExplainBeg
32120 69 6e 28 76 29 3b 0a 20 20 20 20 66 6f 72 28 69  in(v);.    for(i
32130 3d 30 3b 20 69 3c 73 57 4c 42 2e 70 57 43 2d 3e  =0; i<sWLB.pWC->
32140 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nTerm; i++){.   
32150 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
32160 6e 50 72 69 6e 74 66 28 76 2c 20 22 23 25 2d 32  nPrintf(v, "#%-2
32170 64 20 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 73  d ", i);.      s
32180 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73  qlite3ExplainPus
32190 68 28 76 29 3b 0a 20 20 20 20 20 20 77 68 65 72  h(v);.      wher
321a0 65 45 78 70 6c 61 69 6e 54 65 72 6d 28 76 2c 20  eExplainTerm(v, 
321b0 26 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 5d 29  &sWLB.pWC->a[i])
321c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
321d0 78 70 6c 61 69 6e 50 6f 70 28 76 29 3b 0a 20 20  xplainPop(v);.  
321e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
321f0 69 6e 4e 4c 28 76 29 3b 0a 20 20 20 20 7d 0a 20  inNL(v);.    }. 
32200 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
32210 6e 46 69 6e 69 73 68 28 76 29 3b 0a 20 20 20 20  nFinish(v);.    
32220 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
32230 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
32240 56 64 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28  VdbeExplanation(
32250 76 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  v));.  }.#endif.
32260 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d    if( nTabList!=
32270 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43  1 || whereShortC
32280 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a  ut(&sWLB)==0 ){.
32290 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
322a0 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b  opAddAll(&sWLB);
322b0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
322c0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
322d0 6f 72 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 44 69  or;.  .    /* Di
322e0 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68 65  splay all of the
322f0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
32300 74 73 20 69 66 20 77 68 65 72 65 74 72 61 63 65  ts if wheretrace
32310 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 23   is enabled */.#
32320 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
32330 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 21 3d 30 20  _ENABLED /* !=0 
32340 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
32350 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a  e3WhereTrace ){.
32360 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20        WhereLoop 
32370 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  *p;.      int i;
32380 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 68  .      static ch
32390 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30  ar zLabel[] = "0
323a0 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 67  123456789abcdefg
323b0 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
323c0 79 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20  yxz".           
323d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
323e0 20 20 20 20 20 20 20 20 20 20 20 20 22 41 42 43              "ABC
323f0 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
32400 54 55 56 57 59 58 5a 22 3b 0a 20 20 20 20 20 20  TUVWYXZ";.      
32410 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c  for(p=pWInfo->pL
32420 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b 20 70 3d  oops, i=0; p; p=
32430 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b  p->pNextLoop, i+
32440 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63  +){.        p->c
32450 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69 25 73 69  Id = zLabel[i%si
32460 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20  zeof(zLabel)];. 
32470 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70         whereLoop
32480 50 72 69 6e 74 28 70 2c 20 73 57 4c 42 2e 70 57  Print(p, sWLB.pW
32490 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
324a0 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20  }.#endif.  .    
324b0 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28  wherePathSolver(
324c0 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20  pWInfo, 0);.    
324d0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
324e0 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
324f0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20  eBeginError;.   
32500 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
32510 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
32520 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28  wherePathSolver(
32530 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
32540 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20 20 20 20  nRowOut+1);.    
32550 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
32560 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
32570 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
32580 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
32590 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
325a0 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66 6c 61 67  ==0 && (db->flag
325b0 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72  s & SQLITE_Rever
325c0 73 65 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a 20  seOrder)!=0 ){. 
325d0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d      pWInfo->revM
325e0 61 73 6b 20 3d 20 28 42 69 74 6d 61 73 6b 29 28  ask = (Bitmask)(
325f0 2d 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  -1);.  }.  if( p
32600 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e  Parse->nErr || N
32610 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46  EVER(db->mallocF
32620 61 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 67 6f  ailed) ){.    go
32630 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
32640 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 57  or;.  }.#ifdef W
32650 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
32660 44 20 2f 2a 20 21 3d 30 20 2a 2f 0a 20 20 69 66  D /* !=0 */.  if
32670 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
32680 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ace ){.    int i
32690 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  i;.    sqlite3De
326a0 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20  bugPrintf("---- 
326b0 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64  Solution nRow=%d
326c0 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  ", pWInfo->nRowO
326d0 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ut);.    if( pWI
326e0 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 29 7b 0a 20  nfo->bOBSat ){. 
326f0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
32700 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42  gPrintf(" ORDERB
32710 59 3d 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66  Y=0x%llx", pWInf
32720 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20  o->revMask);.   
32730 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20 70   }.    switch( p
32740 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
32750 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57   ){.      case W
32760 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
32770 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  IQUE: {.        
32780 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
32790 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75  tf("  DISTINCT=u
327a0 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20 20 20  nique");.       
327b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
327c0 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
327d0 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
327e0 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D: {.        sql
327f0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
32800 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72 64 65  "  DISTINCT=orde
32810 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62  red");.        b
32820 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
32830 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
32840 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
32850 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D: {.        sql
32860 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
32870 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72  "  DISTINCT=unor
32880 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20  dered");.       
32890 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
328a0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
328b0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
328c0 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ");.    for(ii=0
328d0 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ; ii<pWInfo->nLe
328e0 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  vel; ii++){.    
328f0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
32900 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70  (pWInfo->a[ii].p
32910 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70 57 43 29  WLoop, sWLB.pWC)
32920 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
32930 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20  if.  /* Attempt 
32940 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73 20 66  to omit tables f
32950 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68 61  rom the join tha
32960 74 20 64 6f 20 6e 6f 74 20 65 66 66 65 63 74 20  t do not effect 
32970 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
32980 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
32990 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52 65 73  el>=2.   && pRes
329a0 75 6c 74 53 65 74 21 3d 30 0a 20 20 20 26 26 20  ultSet!=0.   && 
329b0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
329c0 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  led(db, SQLITE_O
329d0 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29  mitNoopJoin).  )
329e0 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 61  {.    Bitmask ta
329f0 62 55 73 65 64 20 3d 20 65 78 70 72 4c 69 73 74  bUsed = exprList
32a00 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
32a10 53 65 74 2c 20 70 52 65 73 75 6c 74 53 65 74 29  Set, pResultSet)
32a20 3b 0a 20 20 20 20 69 66 28 20 73 57 4c 42 2e 70  ;.    if( sWLB.p
32a30 4f 72 64 65 72 42 79 20 29 20 74 61 62 55 73 65  OrderBy ) tabUse
32a40 64 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  d |= exprListTab
32a50 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
32a60 2c 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 29  , sWLB.pOrderBy)
32a70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57 49  ;.    while( pWI
32a80 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29  nfo->nLevel>=2 )
32a90 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
32aa0 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b  m *pTerm, *pEnd;
32ab0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  .      pLoop = p
32ac0 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d  WInfo->a[pWInfo-
32ad0 3e 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f  >nLevel-1].pWLoo
32ae0 70 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 57  p;.      if( (pW
32af0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
32b00 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 6a  a[pLoop->iTab].j
32b10 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
32b20 54 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  T)==0 ) break;. 
32b30 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
32b40 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
32b50 54 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20  T_DISTINCT)==0. 
32b60 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d        && (pLoop-
32b70 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
32b80 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20  _ONEROW)==0.    
32b90 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65    ){.        bre
32ba0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
32bb0 20 20 69 66 28 20 28 74 61 62 55 73 65 64 20 26    if( (tabUsed &
32bc0 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
32bd0 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
32be0 20 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e      pEnd = sWLB.
32bf0 70 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57  pWC->a + sWLB.pW
32c00 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20  C->nTerm;.      
32c10 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70  for(pTerm=sWLB.p
32c20 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e  WC->a; pTerm<pEn
32c30 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
32c40 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
32c50 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f  >prereqAll & pLo
32c60 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  op->maskSelf)!=0
32c70 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78  .         && !Ex
32c80 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
32c90 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
32ca0 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20  romJoin).       
32cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
32cc0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
32cd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
32ce0 20 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72   pTerm<pEnd ) br
32cf0 65 61 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45  eak;.      WHERE
32d00 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22  TRACE(0xffff, ("
32d10 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20  -> drop loop %c 
32d20 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f  not used\n", pLo
32d30 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20  op->cId));.     
32d40 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d   pWInfo->nLevel-
32d50 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73  -;.      nTabLis
32d60 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t--;.    }.  }. 
32d70 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66   WHERETRACE(0xff
32d80 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  ff,("*** Optimiz
32d90 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c  er Finished ***\
32da0 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  n"));.  pWInfo->
32db0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
32dc0 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52  op += pWInfo->nR
32dd0 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  owOut;..  /* If 
32de0 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e  the caller is an
32df0 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
32e00 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  E statement that
32e10 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20   is requesting. 
32e20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65   ** to use a one
32e30 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c  -pass algorithm,
32e40 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
32e50 69 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  is is appropriat
32e60 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d  e..  ** The one-
32e70 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f  pass algorithm o
32e80 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65  nly works if the
32e90 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
32ea0 6e 73 74 72 61 69 6e 73 0a 20 20 2a 2a 20 74 68  nstrains.  ** th
32eb0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75  e statement to u
32ec0 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72  pdate a single r
32ed0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ow..  */.  asser
32ee0 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  t( (wctrlFlags &
32ef0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
32f00 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57  ESIRED)==0 || pW
32f10 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20  Info->nLevel==1 
32f20 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46  );.  if( (wctrlF
32f30 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
32f40 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30  PASS_DESIRED)!=0
32f50 20 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d   .   && (pWInfo-
32f60 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73  >a[0].pWLoop->ws
32f70 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
32f80 45 52 4f 57 29 21 3d 30 20 29 7b 0a 20 20 20 20  EROW)!=0 ){.    
32f90 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
32fa0 73 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 48  s = 1;.    if( H
32fb0 61 73 52 6f 77 69 64 28 70 54 61 62 4c 69 73 74  asRowid(pTabList
32fc0 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a  ->a[0].pTab) ){.
32fd0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b        pWInfo->a[
32fe0 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  0].pWLoop->wsFla
32ff0 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58  gs &= ~WHERE_IDX
33000 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d  _ONLY;.    }.  }
33010 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20  ..  /* Open all 
33020 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54  tables in the pT
33030 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69  abList and any i
33040 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65 64 20  ndices selected 
33050 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69  for.  ** searchi
33060 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e  ng those tables.
33070 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
33080 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
33090 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76    for(ii=0, pLev
330a0 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69  el=pWInfo->a; ii
330b0 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c  <nTabList; ii++,
330c0 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
330d0 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
330e0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65   /* Table to ope
330f0 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62  n */.    int iDb
33100 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
33110 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63  ex of database c
33120 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f  ontaining table/
33130 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72  index */.    str
33140 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
33150 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20   *pTabItem;..   
33160 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61   pTabItem = &pTa
33170 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
33180 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61  >iFrom];.    pTa
33190 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
331a0 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ab;.    iDb = sq
331b0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
331c0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
331d0 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  hema);.    pLoop
331e0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
331f0 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  p;.    if( (pTab
33200 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
33210 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c  Ephemeral)!=0 ||
33220 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
33230 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
33240 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c  thing */.    }el
33250 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  se.#ifndef SQLIT
33260 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
33270 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  BLE.    if( (pLo
33280 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
33290 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
332a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  )!=0 ){.      co
332b0 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20  nst char *pVTab 
332c0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
332d0 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
332e0 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
332f0 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61    int iCur = pTa
33300 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
33310 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
33320 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f  eAddOp4(v, OP_VO
33330 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c  pen, iCur, 0, 0,
33340 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29   pVTab, P4_VTAB)
33350 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
33360 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
33370 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70  ){.      /* noop
33380 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   */.    }else.#e
33390 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c  ndif.    if( (pL
333a0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
333b0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
333c0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 77  0.         && (w
333d0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
333e0 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53  E_OMIT_OPEN_CLOS
333f0 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  E)==0 ){.      i
33400 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52  nt op = OP_OpenR
33410 65 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ead;.      if( p
33420 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
33430 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
33440 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20   OP_OpenWrite;. 
33450 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61         pWInfo->a
33460 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d  iCurOnePass[0] =
33470 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
33480 6f 72 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  or;.      };.   
33490 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
334a0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
334b0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69  Item->iCursor, i
334c0 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20  Db, pTab, op);. 
334d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
334e0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d  bItem->iCursor==
334f0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
33500 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
33510 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  e( !pWInfo->okOn
33520 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e  ePass && pTab->n
33530 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
33540 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 70      testcase( !p
33550 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
33560 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d   && pTab->nCol==
33570 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28  BMS );.      if(
33580 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
33590 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  ass && pTab->nCo
335a0 6c 3c 42 4d 53 20 26 26 20 48 61 73 52 6f 77 69  l<BMS && HasRowi
335b0 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
335c0 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70     Bitmask b = p
335d0 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
335e0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  ;.        int n 
335f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
33600 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b  (; b; b=b>>1, n+
33610 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c  +){}.        sql
33620 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
33630 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
33640 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
33650 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
33660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
33670 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
33680 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  n), P4_INT32);. 
33690 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
336a0 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  <=pTab->nCol );.
336b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
336c0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
336d0 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
336e0 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
336f0 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
33700 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
33710 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
33720 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
33730 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   ){.      Index 
33740 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  *pIx = pLoop->u.
33750 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
33760 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75      int iIndexCu
33770 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  r;.      int op 
33780 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20  = OP_OpenRead;. 
33790 20 20 20 20 20 2f 2a 20 69 49 64 78 43 75 72 20       /* iIdxCur 
337a0 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 69 66  is always set if
337b0 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 20 76   to a positive v
337c0 61 6c 75 65 20 69 66 20 4f 4e 45 50 41 53 53 20  alue if ONEPASS 
337d0 69 73 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  is possible */. 
337e0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 49 64       assert( iId
337f0 78 43 75 72 21 3d 30 20 7c 7c 20 28 70 57 49 6e  xCur!=0 || (pWIn
33800 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
33810 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
33820 45 53 49 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20  ESIRED)==0 );.  
33830 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
33840 6f 6b 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20 20  okOnePass ){.   
33850 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4a 20 3d       Index *pJ =
33860 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d   pTabItem->pTab-
33870 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20  >pIndex;.       
33880 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 49 64   iIndexCur = iId
33890 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 61 73  xCur;.        as
338a0 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67 73  sert( wctrlFlags
338b0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
338c0 5f 44 45 53 49 52 45 44 20 29 3b 0a 20 20 20 20  _DESIRED );.    
338d0 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
338e0 53 28 70 4a 29 20 26 26 20 70 4a 21 3d 70 49 78  S(pJ) && pJ!=pIx
338f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 49   ){.          iI
33900 6e 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20 20  ndexCur++;.     
33910 20 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e       pJ = pJ->pN
33920 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ext;.        }. 
33930 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f         op = OP_O
33940 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  penWrite;.      
33950 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f    pWInfo->aiCurO
33960 6e 65 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e 64  nePass[1] = iInd
33970 65 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c  exCur;.      }el
33980 73 65 20 69 66 28 20 69 49 64 78 43 75 72 20 26  se if( iIdxCur &
33990 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
339a0 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
339b0 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)!=0 ){.     
339c0 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69     iIndexCur = i
339d0 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65  IdxCur;.      }e
339e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 49 6e  lse{.        iIn
339f0 64 65 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d  dexCur = pParse-
33a00 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d  >nTab++;.      }
33a10 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  .      pLevel->i
33a20 49 64 78 43 75 72 20 3d 20 69 49 6e 64 65 78 43  IdxCur = iIndexC
33a30 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ur;.      assert
33a40 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  ( pIx->pSchema==
33a50 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
33a60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
33a70 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20  IndexCur>=0 );. 
33a80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33a90 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49  AddOp3(v, op, iI
33aa0 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e  ndexCur, pIx->tn
33ab0 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  um, iDb);.      
33ac0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
33ad0 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
33ae0 70 49 78 29 3b 0a 20 20 20 20 20 20 56 64 62 65  pIx);.      Vdbe
33af0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
33b00 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  , pIx->zName));.
33b10 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
33b20 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
33b30 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
33b40 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20      notReady &= 
33b50 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  ~getMask(&pWInfo
33b60 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  ->sMaskSet, pTab
33b70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
33b80 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54    }.  pWInfo->iT
33b90 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
33ba0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
33bb0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
33bc0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
33bd0 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a  ereBeginError;..
33be0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
33bf0 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65  e code to do the
33c00 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69   search.  Each i
33c10 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
33c20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65  for.  ** loop be
33c30 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f  low generates co
33c40 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
33c50 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
33c60 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72  he VM.  ** progr
33c70 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65  am..  */.  notRe
33c80 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
33c90 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  0;.  for(ii=0; i
33ca0 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b  i<nTabList; ii++
33cb0 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  ){.    pLevel = 
33cc0 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a  &pWInfo->a[ii];.
33cd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
33ce0 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
33cf0 44 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65  DEX.    if( (pLe
33d00 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46  vel->pWLoop->wsF
33d10 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
33d20 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20  O_INDEX)!=0 ){. 
33d30 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75       constructAu
33d40 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61  tomaticIndex(pPa
33d50 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  rse, &pWInfo->sW
33d60 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  C,.             
33d70 20 20 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b     &pTabList->a[
33d80 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20  pLevel->iFrom], 
33d90 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c  notReady, pLevel
33da0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
33db0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
33dc0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
33dd0 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rror;.    }.#end
33de0 69 66 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e  if.    explainOn
33df0 65 53 63 61 6e 28 70 50 61 72 73 65 2c 20 70 54  eScan(pParse, pT
33e00 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20  abList, pLevel, 
33e10 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ii, pLevel->iFro
33e20 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a  m, wctrlFlags);.
33e30 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
33e40 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64  Body = sqlite3Vd
33e50 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
33e60 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d  ;.    notReady =
33e70 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72   codeOneLoopStar
33e80 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f  t(pWInfo, ii, no
33e90 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49  tReady);.    pWI
33ea0 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d  nfo->iContinue =
33eb0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
33ec0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e  t;.  }..  /* Don
33ed0 65 2e 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  e. */.  VdbeNoop
33ee0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67  Comment((v, "Beg
33ef0 69 6e 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29  in WHERE-core"))
33f00 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  ;.  return pWInf
33f10 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  o;..  /* Jump he
33f20 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  re if malloc fai
33f30 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e  ls */.whereBegin
33f40 45 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49  Error:.  if( pWI
33f50 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73  nfo ){.    pPars
33f60 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
33f70 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
33f80 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65  eryLoop;.    whe
33f90 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70  reInfoFree(db, p
33fa0 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  WInfo);.  }.  re
33fb0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
33fc0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e   Generate the en
33fd0 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c  d of the WHERE l
33fe0 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e  oop.  See commen
33ff0 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65  ts on .** sqlite
34000 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f  3WhereBegin() fo
34010 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
34020 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  ormation..*/.voi
34030 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  d sqlite3WhereEn
34040 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  d(WhereInfo *pWI
34050 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  nfo){.  Parse *p
34060 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
34070 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a  pParse;.  Vdbe *
34080 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
34090 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  e;.  int i;.  Wh
340a0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
340b0 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
340c0 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74 20  Loop;.  SrcList 
340d0 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e  *pTabList = pWIn
340e0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
340f0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
34100 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
34110 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65  Generate loop te
34120 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a  rmination code..
34130 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
34140 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20  omment((v, "End 
34150 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20  WHERE-core"));. 
34160 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
34170 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
34180 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e    for(i=pWInfo->
34190 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20  nLevel-1; i>=0; 
341a0 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  i--){.    int ad
341b0 64 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d  dr;.    pLevel =
341c0 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
341d0 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
341e0 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
341f0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
34200 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
34210 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  l->addrCont);.  
34220 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70    if( pLevel->op
34230 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
34240 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34250 64 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  dOp2(v, pLevel->
34260 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20  op, pLevel->p1, 
34270 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20  pLevel->p2);.   
34280 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
34290 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c  angeP5(v, pLevel
342a0 2d 3e 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ->p5);.    }.   
342b0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
342c0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41  ags & WHERE_IN_A
342d0 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75  BLE && pLevel->u
342e0 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20  .in.nIn>0 ){.   
342f0 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70     struct InLoop
34300 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74   *pIn;.      int
34310 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   j;.      sqlite
34320 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
34330 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
34340 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72  rNxt);.      for
34350 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  (j=pLevel->u.in.
34360 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c  nIn, pIn=&pLevel
34370 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a  ->u.in.aInLoop[j
34380 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  -1]; j>0; j--, p
34390 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73  In--){.        s
343a0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
343b0 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
343c0 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20  nTop+1);.       
343d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
343e0 70 32 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c  p2(v, pIn->eEndL
343f0 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72  oopOp, pIn->iCur
34400 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
34410 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
34420 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
34430 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
34440 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
34450 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
34460 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  (db, pLevel->u.i
34470 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20  n.aInLoop);.    
34480 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
34490 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
344a0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
344b0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
344c0 6c 2d 3e 61 64 64 72 53 6b 69 70 20 29 7b 0a 20  l->addrSkip ){. 
344d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
344e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
344f0 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  o, 0, pLevel->ad
34500 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 56  drSkip);.      V
34510 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
34520 6e 65 78 74 20 73 6b 69 70 2d 73 63 61 6e 20 6f  next skip-scan o
34530 6e 20 25 73 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e  n %s", pLoop->u.
34540 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e  btree.pIndex->zN
34550 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ame));.      sql
34560 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
34570 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
34580 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Skip);.      sql
34590 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
345a0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
345b0 53 6b 69 70 2d 32 29 3b 0a 20 20 20 20 7d 0a 20  Skip-2);.    }. 
345c0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
345d0 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
345e0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
345f0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
34600 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e  _IfPos, pLevel->
34610 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
34620 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
34630 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
34640 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20  E_IDX_ONLY)==0. 
34650 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c            || (pL
34660 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
34670 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
34680 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   );.      if( (p
34690 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
346a0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
346b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
346c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
346d0 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70  v, OP_NullRow, p
346e0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
346f0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
34700 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d        if( pLoop-
34710 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
34720 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
34730 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34740 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
34750 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  Row, pLevel->iId
34760 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
34770 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
34780 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29  >op==OP_Return )
34790 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
347a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
347b0 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d  P_Gosub, pLevel-
347c0 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  >p1, pLevel->add
347d0 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d  rFirst);.      }
347e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
347f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
34800 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
34810 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74  Level->addrFirst
34820 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
34830 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
34840 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
34850 20 20 20 7d 0a 20 20 20 20 56 64 62 65 4e 6f 6f     }.    VdbeNoo
34860 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e  pComment((v, "En
34870 64 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20  d WHERE-loop%d: 
34880 25 73 22 2c 20 69 2c 0a 20 20 20 20 20 20 20 20  %s", i,.        
34890 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
348a0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
348b0 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e  [pLevel->iFrom].
348c0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
348d0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72   }..  /* The "br
348e0 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65  eak" point is he
348f0 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68  re, just past th
34900 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74  e end of the out
34910 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65  er loop..  ** Se
34920 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  t it..  */.  sql
34930 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
34940 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e  abel(v, pWInfo->
34950 69 42 72 65 61 6b 29 3b 0a 0a 20 20 61 73 73 65  iBreak);..  asse
34960 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  rt( pWInfo->nLev
34970 65 6c 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53  el<=pTabList->nS
34980 72 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  rc );.  for(i=0,
34990 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
349a0 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  a; i<pWInfo->nLe
349b0 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c  vel; i++, pLevel
349c0 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  ++){.    Index *
349d0 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 73 74  pIdx = 0;.    st
349e0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
349f0 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70  m *pTabItem = &p
34a00 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
34a10 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54  l->iFrom];.    T
34a20 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
34a30 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
34a40 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
34a50 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20   );.    pLoop = 
34a60 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
34a70 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  .    /* Close al
34a80 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73  l of the cursors
34a90 20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65   that were opene
34aa0 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  d by sqlite3Wher
34ab0 65 42 65 67 69 6e 2e 0a 20 20 20 20 2a 2a 20 45  eBegin..    ** E
34ac0 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 63 6c  xcept, do not cl
34ad0 6f 73 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  ose cursors that
34ae0 20 77 69 6c 6c 20 62 65 20 72 65 75 73 65 64 20   will be reused 
34af0 62 79 20 74 68 65 20 4f 52 20 6f 70 74 69 6d 69  by the OR optimi
34b00 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 28 57  zation.    ** (W
34b10 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43  HERE_OMIT_OPEN_C
34b20 4c 4f 53 45 29 2e 20 20 41 6e 64 20 64 6f 20 6e  LOSE).  And do n
34b30 6f 74 20 63 6c 6f 73 65 20 74 68 65 20 4f 50 5f  ot close the OP_
34b40 4f 70 65 6e 57 72 69 74 65 20 63 75 72 73 6f 72  OpenWrite cursor
34b50 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  s.    ** created
34b60 20 66 6f 72 20 74 68 65 20 4f 4e 45 50 41 53 53   for the ONEPASS
34b70 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20   optimization.. 
34b80 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
34b90 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
34ba0 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30  TF_Ephemeral)==0
34bb0 0a 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 70  .     && pTab->p
34bc0 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20 26  Select==0.     &
34bd0 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
34be0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d  Flags & WHERE_OM
34bf0 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d  IT_OPEN_CLOSE)==
34c00 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  0.    ){.      i
34c10 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77  nt ws = pLoop->w
34c20 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66  sFlags;.      if
34c30 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65  ( !pWInfo->okOne
34c40 50 61 73 73 20 26 26 20 28 77 73 20 26 20 57 48  Pass && (ws & WH
34c50 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
34c60 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
34c70 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
34c80 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49   OP_Close, pTabI
34c90 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
34ca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
34cb0 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44   (ws & WHERE_IND
34cc0 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20  EXED)!=0.       
34cd0 26 26 20 28 77 73 20 26 20 28 57 48 45 52 45 5f  && (ws & (WHERE_
34ce0 49 50 4b 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49  IPK|WHERE_AUTO_I
34cf0 4e 44 45 58 29 29 3d 3d 30 20 0a 20 20 20 20 20  NDEX))==0 .     
34d00 20 20 26 26 20 70 4c 65 76 65 6c 2d 3e 69 49 64    && pLevel->iId
34d10 78 43 75 72 21 3d 70 57 49 6e 66 6f 2d 3e 61 69  xCur!=pWInfo->ai
34d20 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 0a 20 20  CurOnePass[1].  
34d30 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
34d40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
34d50 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c  (v, OP_Close, pL
34d60 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a  evel->iIdxCur);.
34d70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
34d80 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63     /* If this sc
34d90 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  an uses an index
34da0 2c 20 6d 61 6b 65 20 56 44 42 45 20 63 6f 64 65  , make VDBE code
34db0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74   substitutions t
34dc0 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20 20 20  o read data.    
34dd0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ** from the inde
34de0 78 20 69 6e 73 74 65 61 64 20 6f 66 20 66 72 6f  x instead of fro
34df0 6d 20 74 68 65 20 74 61 62 6c 65 20 77 68 65 72  m the table wher
34e00 65 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 6e 20  e possible.  In 
34e10 73 6f 6d 65 20 63 61 73 65 73 0a 20 20 20 20 2a  some cases.    *
34e20 2a 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  * this optimizat
34e30 69 6f 6e 20 70 72 65 76 65 6e 74 73 20 74 68 65  ion prevents the
34e40 20 74 61 62 6c 65 20 66 72 6f 6d 20 65 76 65 72   table from ever
34e50 20 62 65 69 6e 67 20 72 65 61 64 2c 20 77 68 69   being read, whi
34e60 63 68 20 63 61 6e 0a 20 20 20 20 2a 2a 20 79 69  ch can.    ** yi
34e70 65 6c 64 20 61 20 73 69 67 6e 69 66 69 63 61 6e  eld a significan
34e80 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f  t performance bo
34e90 6f 73 74 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20  ost..    ** .   
34ea0 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65   ** Calls to the
34eb0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
34ec0 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74  in between sqlit
34ed0 65 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64  e3WhereBegin and
34ee0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57  .    ** sqlite3W
34ef0 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76  hereEnd will hav
34f00 65 20 63 72 65 61 74 65 64 20 63 6f 64 65 20 74  e created code t
34f10 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  hat references t
34f20 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  he table.    ** 
34f30 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20  directly.  This 
34f40 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74  loop scans all t
34f50 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67  hat code looking
34f60 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20   for opcodes.   
34f70 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e   ** that referen
34f80 63 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  ce the table and
34f90 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69   converts them i
34fa0 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74  nto opcodes that
34fb0 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
34fc0 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  e the index..   
34fd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f   */.    if( pLoo
34fe0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
34ff0 45 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45 52  ERE_INDEXED|WHER
35000 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20  E_IDX_ONLY) ){. 
35010 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f       pIdx = pLoo
35020 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
35030 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  x;.    }else if(
35040 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
35050 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
35060 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d   ){.      pIdx =
35070 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69   pLevel->u.pCovi
35080 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  dx;.    }.    if
35090 28 20 70 49 64 78 20 26 26 20 21 64 62 2d 3e 6d  ( pIdx && !db->m
350a0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
350b0 20 20 20 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74       int k, last
350c0 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  ;.      VdbeOp *
350d0 70 4f 70 3b 0a 0a 20 20 20 20 20 20 6c 61 73 74  pOp;..      last
350e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
350f0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
35100 20 20 20 20 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e      k = pLevel->
35110 61 64 64 72 42 6f 64 79 3b 0a 20 20 20 20 20 20  addrBody;.      
35120 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
35130 65 47 65 74 4f 70 28 76 2c 20 6b 29 3b 0a 20 20  eGetOp(v, k);.  
35140 20 20 20 20 66 6f 72 28 3b 20 6b 3c 6c 61 73 74      for(; k<last
35150 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; k++, pOp++){. 
35160 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
35170 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62  p1!=pLevel->iTab
35180 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
35190 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
351a0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75  >opcode==OP_Colu
351b0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
351c0 69 6e 74 20 78 20 3d 20 70 4f 70 2d 3e 70 32 3b  int x = pOp->p2;
351d0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
351e0 74 28 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3d  t( pIdx->pTable=
351f0 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20  =pTab );.       
35200 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
35210 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
35220 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b        Index *pPk
35230 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
35240 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
35250 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 20 3d  .            x =
35260 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 78   pPk->aiColumn[x
35270 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ];.          }. 
35280 20 20 20 20 20 20 20 20 20 78 20 3d 20 73 71 6c           x = sql
35290 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
352a0 78 28 70 49 64 78 2c 20 78 29 3b 0a 20 20 20 20  x(pIdx, x);.    
352b0 20 20 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29        if( x>=0 )
352c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f  {.            pO
352d0 70 2d 3e 70 32 20 3d 20 78 3b 0a 20 20 20 20 20  p->p2 = x;.     
352e0 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
352f0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
35300 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
35310 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
35320 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
35330 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
35340 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20 29 3b 0a  )==0 || x>=0 );.
35350 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
35360 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
35370 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  P_Rowid ){.     
35380 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70       pOp->p1 = p
35390 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
353a0 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f            pOp->o
353b0 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f  pcode = OP_IdxRo
353c0 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  wid;.        }. 
353d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
353e0 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65  ..  /* Final cle
353f0 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72  anup.  */.  pPar
35400 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
35410 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
35420 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72  ueryLoop;.  wher
35430 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57  eInfoFree(db, pW
35440 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Info);.  return;
35450 0a 7d 0a                                         .}.